From 452bfbd77cb4d63cfd7bd0968794c4fb4b173613 Mon Sep 17 00:00:00 2001 From: Hannah Date: Sat, 27 May 2023 17:28:30 -0700 Subject: [PATCH] unit test and formatting fixes --- myfitnesspal/client.py | 34 +- tests/html/measurements.html | 5097 ++++++++++++++++++++++++++++------ tests/test_client.py | 34 +- 3 files changed, 4208 insertions(+), 957 deletions(-) diff --git a/myfitnesspal/client.py b/myfitnesspal/client.py index 2d2b387..7983b73 100644 --- a/myfitnesspal/client.py +++ b/myfitnesspal/client.py @@ -186,11 +186,13 @@ def _get_url_for_date(self, date: datetime.date, username: str) -> str: + f"?date={date_str}" ) - def _get_url_for_measurements(self, page: int = 1, measurement_name: str = "") -> str: + def _get_url_for_measurements( + self, page: int = 1, measurement_name: str = "" + ) -> str: return ( parse.urljoin(self.BASE_URL_SECURE, "measurements/edit") + "?" - + parse.urlencode({'page': page, "type": measurement_name}) + + parse.urlencode({"page": page, "type": measurement_name}) ) def _get_request_for_url( @@ -635,17 +637,18 @@ def _get_measurements(self, document): measurements = [] for next_data in document.xpath("//script[@id='__NEXT_DATA__']"): - for q in json.loads(next_data.text)['props']['pageProps']['dehydratedState']['queries']: - if 'measurements' in q['queryKey']: - if 'items' in q['state']['data']: - measurements += q['state']['data']['items'] + next_data_json = json.loads(next_data.text) + for q in next_data_json["props"]["pageProps"]["dehydratedState"]["queries"]: + if "measurements" in q["queryKey"]: + if "items" in q["state"]["data"]: + measurements += q["state"]["data"]["items"] measurements_dict = OrderedDict() # converts the date to a datetime object and the value to a float for entry in measurements: - date = datetime.datetime.strptime(entry['date'], "%Y-%m-%d").date() - if 'unit' in entry: + date = datetime.datetime.strptime(entry["date"], "%Y-%m-%d").date() + if "unit" in entry: value = f"{entry['value']} {entry['unit']}" else: value = f"{entry['value']}" @@ -656,13 +659,14 @@ def _get_measurements(self, document): def _get_measurement_ids(self, document) -> Dict[str, int]: ids = {} for next_data in document.xpath("//script[@id='__NEXT_DATA__']"): - for q in json.loads(next_data.text)['props']['pageProps']['dehydratedState']['queries']: - if 'measurementTypes' in q['queryKey']: - for m in q['state']['data']: - ids[m['description']] = m['id'] - if 'measurements' in q['queryKey']: - if q['queryKey'][1] not in ids: - ids[q['queryKey'][1]] = '' + next_data_json = json.loads(next_data.text) + for q in next_data_json["props"]["pageProps"]["dehydratedState"]["queries"]: + if "measurementTypes" in q["queryKey"]: + for m in q["state"]["data"]: + ids[m["description"]] = m["id"] + if "measurements" in q["queryKey"]: + if q["queryKey"][1] not in ids: + ids[q["queryKey"][1]] = "" return ids diff --git a/tests/html/measurements.html b/tests/html/measurements.html index e9588e1..7e13458 100644 --- a/tests/html/measurements.html +++ b/tests/html/measurements.html @@ -1,979 +1,4236 @@ - - + + - - - - - - - Free Calorie Counter, Diet & Exercise Journal | MyFitnessPal.com - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
- - - - -

Copyright 2005-2015 MyFitnessPal, Inc.

- - SheKnows Health & Beauty - -
-
-
-
- - - - - - - - - - - - - - - - - - +
+ - + \ No newline at end of file diff --git a/tests/test_client.py b/tests/test_client.py index 83630d7..4de1836 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -15,8 +15,8 @@ class TestClient(MFPTestCase): def setUp(self): self.arbitrary_username = "alpha" self.arbitrary_password = "beta" - self.arbitrary_date1 = datetime.date(2015, 4, 20) - self.arbitrary_date2 = datetime.date(2015, 4, 28) + self.arbitrary_date1 = datetime.date(2022, 1, 10) + self.arbitrary_date2 = datetime.date(2022, 1, 9) with patch.multiple( "myfitnesspal.Client", _get_auth_data=DEFAULT, _get_user_metadata=DEFAULT @@ -32,13 +32,10 @@ def test_get_measurement_ids(self): actual_ids = self.client._get_measurement_ids(document) expected_ids = { - "Weight": 1, - "Body Fat": 91955886, - "Butt": 92738807, - "Bicep": 92738811, - "Quad": 92738815, - "Mid Section": 92738819, - "Shoulders": 92738861, + 'Hips': '278869596622717', + 'Neck': '278869604978685', + 'Waist': '278319840808829', + 'Weight': '' } self.assertEqual( @@ -58,24 +55,17 @@ def test_get_meals(self): def test_get_measurements(self): with patch.object(self.client, "_get_document_for_url") as get_doc: get_doc.return_value = self.get_html_document("measurements.html") + get_doc.called actual_measurements = self.client.get_measurements( - "Body Fat", + "Weight", self.arbitrary_date1, self.arbitrary_date2, ) - expected_measurements = OrderedDict( - [ - (datetime.date(2015, 4, 28), 19.2), - (datetime.date(2015, 4, 27), 19.2), - (datetime.date(2015, 4, 26), 19.0), - (datetime.date(2015, 4, 25), 18.7), - (datetime.date(2015, 4, 23), 18.7), - (datetime.date(2015, 4, 22), 18.4), - (datetime.date(2015, 4, 21), 18.9), - (datetime.date(2015, 4, 20), 19.1), - ] - ) + expected_measurements = OrderedDict([ + (datetime.date(2022, 1, 10), 155.0), + (datetime.date(2022, 1, 9), 156.0) + ]) self.assertEqual( expected_measurements,