Skip to content

Commit a1fb4dc

Browse files
improve handling of text responses
1 parent a3a09a6 commit a1fb4dc

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

functions/api.py

+13-7
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ def get_token(self, email, password, server="https://my.farm.bot"):
7979
self.state.print_status(description=self.state.error)
8080
return self.state.error
8181

82+
@staticmethod
83+
def parse_text(text):
84+
"""Parse response text."""
85+
if '<html' in text:
86+
parser = HTMLResponseParser()
87+
return parser.read(text)
88+
return text
89+
8290
def request_handling(self, response):
8391
"""Handle errors associated with different endpoint errors."""
8492

@@ -89,25 +97,23 @@ def request_handling(self, response):
8997
502: "Please check your internet connection and try again."
9098
}
9199

100+
text = self.parse_text(response.text)
101+
92102
# Handle HTTP status codes
93103
if response.status_code == 200:
94104
self.state.print_status(description="Successfully sent request via API.")
95105
return 200
96106
if 400 <= response.status_code < 500:
97107
self.state.error = f"CLIENT ERROR {response.status_code}: {error_messages.get(response.status_code, response.reason)}"
98108
elif 500 <= response.status_code < 600:
99-
self.state.error = f"SERVER ERROR {response.status_code}: {response.text}"
109+
self.state.error = f"SERVER ERROR {response.status_code}: {text}"
100110
else:
101-
self.state.error = f"UNEXPECTED ERROR {response.status_code}: {response.text}"
111+
self.state.error = f"UNEXPECTED ERROR {response.status_code}: {text}"
102112

103113
try:
104114
response.json()
105115
except requests.exceptions.JSONDecodeError:
106-
if '<html>' in response.text:
107-
parser = HTMLResponseParser()
108-
self.state.error += f" ({parser.read(response.text)})"
109-
else:
110-
self.state.error += f" ({response.text})"
116+
self.state.error += f" ({text})"
111117
else:
112118
self.state.error += f" ({json.dumps(response.json(), indent=2)})"
113119

tests/tests_main.py

+16
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def test_get_token_default_server(self, mock_post):
3939
expected_token = {'token': 'abc123'}
4040
mock_response.json.return_value = expected_token
4141
mock_response.status_code = 200
42+
mock_response.text = 'text'
4243
mock_post.return_value = mock_response
4344
self.fb.state.token = None
4445
# Call with default server
@@ -58,6 +59,7 @@ def test_get_token_custom_server(self, mock_post):
5859
expected_token = {'token': 'abc123'}
5960
mock_response.json.return_value = expected_token
6061
mock_response.status_code = 200
62+
mock_response.text = 'text'
6163
mock_post.return_value = mock_response
6264
self.fb.state.token = None
6365
# Call with custom server
@@ -246,6 +248,7 @@ def test_get_info_endpoint_only(self, mock_request):
246248
expected_response = {'device': 'info'}
247249
mock_response.json.return_value = expected_response
248250
mock_response.status_code = 200
251+
mock_response.text = 'text'
249252
mock_request.return_value = mock_response
250253
# Call with endpoint only
251254
response = self.fb.get_info('device')
@@ -267,6 +270,7 @@ def test_get_info_with_id(self, mock_request):
267270
expected_response = {'peripheral': 'info'}
268271
mock_response.json.return_value = expected_response
269272
mock_response.status_code = 200
273+
mock_response.text = 'text'
270274
mock_request.return_value = mock_response
271275
# Call with specific ID
272276
response = self.fb.get_info('peripherals', '12345')
@@ -317,6 +321,7 @@ def test_edit_info(self, mock_request):
317321
'''test edit_info function'''
318322
mock_response = Mock()
319323
mock_response.status_code = 200
324+
mock_response.text = 'text'
320325
mock_response.json.return_value = {'name': 'new name'}
321326
mock_request.return_value = mock_response
322327
device_info = self.fb.edit_info('device', {'name': 'new name'})
@@ -338,6 +343,7 @@ def test_add_info(self, mock_request):
338343
'''test add_info function'''
339344
mock_response = Mock()
340345
mock_response.status_code = 200
346+
mock_response.text = 'text'
341347
mock_response.json.return_value = {'name': 'new name'}
342348
mock_request.return_value = mock_response
343349
point = self.fb.add_info('points', {'name': 'new name'})
@@ -360,6 +366,7 @@ def test_group_one(self, mock_request):
360366
mock_response = Mock()
361367
mock_response.json.return_value = {'name': 'Group 0'}
362368
mock_response.status_code = 200
369+
mock_response.text = 'text'
363370
mock_request.return_value = mock_response
364371
group_info = self.fb.group(12345)
365372
mock_request.assert_called_once_with(
@@ -379,6 +386,7 @@ def test_group_all(self, mock_request):
379386
mock_response = Mock()
380387
mock_response.json.return_value = [{'name': 'Group 0'}]
381388
mock_response.status_code = 200
389+
mock_response.text = 'text'
382390
mock_request.return_value = mock_response
383391
group_info = self.fb.group()
384392
mock_request.assert_called_once_with(
@@ -398,6 +406,7 @@ def test_curve_one(self, mock_request):
398406
mock_response = Mock()
399407
mock_response.json.return_value = {'name': 'Curve 0'}
400408
mock_response.status_code = 200
409+
mock_response.text = 'text'
401410
mock_request.return_value = mock_response
402411
curve_info = self.fb.curve(12345)
403412
mock_request.assert_called_once_with(
@@ -417,6 +426,7 @@ def test_curve_all(self, mock_request):
417426
mock_response = Mock()
418427
mock_response.json.return_value = [{'name': 'Curve 0'}]
419428
mock_response.status_code = 200
429+
mock_response.text = 'text'
420430
mock_request.return_value = mock_response
421431
curve_info = self.fb.curve()
422432
mock_request.assert_called_once_with(
@@ -436,6 +446,7 @@ def test_safe_z(self, mock_request):
436446
mock_response = Mock()
437447
mock_response.json.return_value = {'safe_height': 100}
438448
mock_response.status_code = 200
449+
mock_response.text = 'text'
439450
mock_request.return_value = mock_response
440451
safe_height = self.fb.safe_z()
441452
mock_request.assert_called_once_with(
@@ -460,6 +471,7 @@ def test_garden_size(self, mock_request):
460471
'movement_step_per_mm_y': 5,
461472
}
462473
mock_response.status_code = 200
474+
mock_response.text = 'text'
463475
mock_request.return_value = mock_response
464476
garden_size = self.fb.garden_size()
465477
mock_request.assert_called_once_with(
@@ -478,6 +490,7 @@ def test_log(self, mock_request):
478490
'''test log function'''
479491
mock_response = Mock()
480492
mock_response.status_code = 200
493+
mock_response.text = 'text'
481494
mock_request.return_value = mock_response
482495
self.fb.log('test message', 'info', 'toast')
483496
mock_request.assert_called_once_with(
@@ -567,6 +580,7 @@ def send_command_test_helper(self, *args, **kwargs):
567580
mock_response = Mock()
568581
mock_response.json.return_value = mock_api_response
569582
mock_response.status_code = 200
583+
mock_response.text = 'text'
570584
mock_request.return_value = mock_response
571585
execute_command()
572586
if expected_command is None:
@@ -1178,6 +1192,7 @@ def helper_get_seed_tray_cell(self, *args, **kwargs):
11781192
}
11791193
mock_response.json.return_value = mock_api_response
11801194
mock_response.status_code = 200
1195+
mock_response.text = 'text'
11811196
mock_request.return_value = mock_response
11821197
cell = self.fb.get_seed_tray_cell(123, cell)
11831198
mock_request.assert_called_once_with(
@@ -1251,6 +1266,7 @@ def helper_get_seed_tray_cell_error(self, *args, **kwargs):
12511266
}
12521267
mock_response.json.return_value = mock_api_response
12531268
mock_response.status_code = 200
1269+
mock_response.text = 'text'
12541270
mock_request.return_value = mock_response
12551271
with self.assertRaises(ValueError) as cm:
12561272
self.fb.get_seed_tray_cell(123, cell)

0 commit comments

Comments
 (0)