From 7536ca35e35335127e899fcdd87312cef4590d6b Mon Sep 17 00:00:00 2001 From: LeonLu2 Date: Wed, 5 Apr 2023 17:27:22 -0400 Subject: [PATCH 01/12] 1. add inequality operator handler in _query.py and _params.py 2. add test in test_covidcast.py accordingly 3. refactor minor places --- integrations/server/test_covidcast.py | 69 +++++++++++++++++++++++++-- src/server/_params.py | 25 ++++++++-- src/server/_query.py | 11 +++-- src/server/utils/dates.py | 20 +++++--- 4 files changed, 105 insertions(+), 20 deletions(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 01d81bf29..933c343ce 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -81,6 +81,18 @@ def _insert_placeholder_set_five(self): ] self._insert_rows(rows) return rows + + def _insert_placeholder_set_six(self): + rows = [ + CovidcastTestRow.make_default_row(time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03) + for i in [1, 2, 3] + ] + [ + # + CovidcastTestRow.make_default_row(time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03) + for i in [4, 5, 6] + ] + self._insert_rows(rows) + return rows def test_round_trip(self): """Make a simple round-trip with some sample data.""" @@ -167,7 +179,6 @@ def test_csv_format(self): .assign(direction = None) .to_csv(columns=column_order, index=False) ) - # assert that the right data came back self.assertEqual(response, expected) @@ -231,7 +242,6 @@ def test_location_wildcard(self): # make the request response = self.request_based_on_row(rows[0], geo_value="*") - self.maxDiff = None # assert that the right data came back self.assertEqual(response, { 'result': 1, @@ -249,7 +259,6 @@ def test_time_values_wildcard(self): # make the request response = self.request_based_on_row(rows[0], time_values="*") - self.maxDiff = None # assert that the right data came back self.assertEqual(response, { 'result': 1, @@ -257,6 +266,58 @@ def test_time_values_wildcard(self): 'message': 'success', }) + def test_time_values_inequality(self): + """Select all time_values with a wildcard query.""" + + # insert placeholder data + rows = self._insert_placeholder_set_six() + expected = [row.as_api_compatibility_row_dict() for row in rows[:6]] + + def fetch(time_value): + # make the request + response = self.request_based_on_row(rows[0], time_values=time_value) + print(time_value) + + return response + + # test fetch time_value with < + r = fetch('<20000104') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[0:2]) + # test fetch time_value with <= + r = fetch('<=20000104') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[0:3]) + # test fetch time_value with > + r = fetch('>20000104') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[3:6]) + # test fetch time_value with >= + r = fetch('>=20000104') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[2:6]) + # test fetch multiple inequalities + r = fetch('<20000104,>20000104') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[:2] + expected[3:6]) + # test fetch inequalities that has no results + r = fetch('>20000107') + self.assertEqual(r['message'], 'no results') + # test fetch empty time_value + r = fetch('') + self.assertEqual(r['message'], 'missing parameter: need [time_type, time_values]') + # test fetch invalid time_value + r = fetch('>') + self.assertEqual(r['message'], 'missing parameter: date after the inequality operator') + # test if extra operators provided + r = fetch('>>') + self.assertEqual(r['message'], 'not a valid date: >') + r = fetch('>>20000103') + self.assertEqual(r['message'], 'not a valid date: >20000103') + # test invalid operator + r = fetch('#') + self.assertEqual(r['message'], 'not a valid date: #') + def test_issues_wildcard(self): """Select all issues with a wildcard query.""" @@ -267,7 +328,6 @@ def test_issues_wildcard(self): # make the request response = self.request_based_on_row(rows[0], issues="*") - self.maxDiff = None # assert that the right data came back self.assertEqual(response, { 'result': 1, @@ -285,7 +345,6 @@ def test_signal_wildcard(self): # make the request response = self.request_based_on_row(rows[0], signals="*") - self.maxDiff = None # assert that the right data came back self.assertEqual(response, { 'result': 1, diff --git a/src/server/_params.py b/src/server/_params.py index 41f5ce494..406bc869b 100644 --- a/src/server/_params.py +++ b/src/server/_params.py @@ -392,11 +392,11 @@ def _parse_range(part: str): def parse_date(s: str) -> int: # parses a given string in format YYYYMMDD or YYYY-MM-DD to a number in the form YYYYMMDD + if s == "*": + return s try: - if s == "*": - return s - else: - return int(s.replace("-", "")) + print(f"in parse_date: {s}, type: {type(s)}") # test + return int(s.replace("-", "")) except ValueError: raise ValidationFailedException(f"not a valid date: {s}") @@ -414,6 +414,17 @@ def extract_dates(key: Union[str, Sequence[str]]) -> Optional[TimeValues]: return None values: TimeValues = [] + def handle_inequality(part: str): + inequality_operator = None + for operator in ['<=', '>=', '<', '>']: + if part.startswith(operator): + inequality_operator = operator + part = part[len(operator):] + if not part: + raise ValidationFailedException(f"missing parameter: date after the inequality operator") + return (inequality_operator,), part + return None, part + def push_range(first: str, last: str): first_d = parse_date(first) last_d = parse_date(last) @@ -427,6 +438,12 @@ def push_range(first: str, last: str): raise ValidationFailedException(f"{key}: the given range is inverted") for part in parts: + # Handle inequality operators + inequality_operator, part = handle_inequality(part) + # >/=/<= YYYYMMDD/YYYY-MM-DD + if inequality_operator is not None: + values.append((inequality_operator, parse_date(part))) + continue if "-" not in part and ":" not in part: # YYYYMMDD values.append(parse_date(part)) diff --git a/src/server/_query.py b/src/server/_query.py index 267a78eb1..0fa1f6ff3 100644 --- a/src/server/_query.py +++ b/src/server/_query.py @@ -41,6 +41,11 @@ def to_condition( formatter=lambda x: x, ) -> str: if isinstance(value, (list, tuple)): + # Check if the first element is a tuple with an inequality operator + if isinstance(value[0], tuple): + inequality_operator, date_value = value[0][0], value[1] + params[param_key] = formatter(date_value) + return f"{field} {inequality_operator} :{param_key}" params[param_key] = formatter(value[0]) params[f"{param_key}_2"] = formatter(value[1]) return f"{field} BETWEEN :{param_key} AND :{param_key}_2" @@ -476,10 +481,8 @@ def apply_lag_filter(self, history_table: str, lag: Optional[int]) -> "QueryBuil def apply_issues_filter(self, history_table: str, issues: Optional[TimeValues]) -> "QueryBuilder": if issues: - if issues == ["*"]: - self.retable(history_table) - else: - self.retable(history_table) + self.retable(history_table) + if issues != ["*"]: self.where_integers("issue", issues) return self diff --git a/src/server/utils/dates.py b/src/server/utils/dates.py index e810e2146..4f1195473 100644 --- a/src/server/utils/dates.py +++ b/src/server/utils/dates.py @@ -116,16 +116,18 @@ def weeks_to_ranges(values: TimeValues) -> TimeValues: def _to_ranges(values: TimeValues, value_to_date: Callable, date_to_value: Callable, time_unit: Union[int, timedelta]) -> TimeValues: try: intervals = [] - # populate list of intervals based on original date/week values for v in values: if isinstance(v, int): # 20200101 -> [20200101, 20200101] intervals.append([value_to_date(v), value_to_date(v)]) else: # tuple + if isinstance(v[0], tuple): # inequality operator + intervals.append([value_to_date(v[1])]) + else: # (20200101, 20200102) -> [20200101, 20200102] - intervals.append([value_to_date(v[0]), value_to_date(v[1])]) - + intervals.append([value_to_date(v[0]), value_to_date(v[1])]) + intervals.sort() # merge overlapping intervals https://leetcode.com/problems/merge-intervals/ @@ -142,10 +144,14 @@ def _to_ranges(values: TimeValues, value_to_date: Callable, date_to_value: Calla # convert intervals from dates/weeks back to integers ranges = [] for m in merged: - if m[0] == m[1]: - ranges.append(date_to_value(m[0])) - else: - ranges.append((date_to_value(m[0]), date_to_value(m[1]))) + # if inequality operator, length of m is only 1 + if len(m) == 1: + ranges.append((v[0], date_to_value(m[0]))) + else: + if m[0] == m[1]: + ranges.append(date_to_value(m[0])) + else: + ranges.append((date_to_value(m[0]), date_to_value(m[1]))) get_structured_logger('server_utils').info("Optimized list of date values", original=values, optimized=ranges, original_length=len(values), optimized_length=len(ranges)) From 51cb58ee770ac1de0ccb35d0981b5eb880620fe0 Mon Sep 17 00:00:00 2001 From: LeonLu2 Date: Wed, 5 Apr 2023 18:28:55 -0400 Subject: [PATCH 02/12] 1. add new error message in parse_date 2. add test for inequality in issues 3. minor changes --- integrations/server/test_covidcast.py | 70 +++++++++++++++++++++++++-- src/server/_params.py | 3 +- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 933c343ce..e917ee3cc 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -87,13 +87,25 @@ def _insert_placeholder_set_six(self): CovidcastTestRow.make_default_row(time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03) for i in [1, 2, 3] ] + [ - # + # different time_values CovidcastTestRow.make_default_row(time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03) for i in [4, 5, 6] ] self._insert_rows(rows) return rows + def _insert_placeholder_set_seven(self): + rows = [ + CovidcastTestRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i) + for i in [1, 2, 3] + ] + [ + # same time_values, different issues + CovidcastTestRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i) + for i in [4, 5, 6] + ] + self._insert_rows(rows) + return rows + def test_round_trip(self): """Make a simple round-trip with some sample data.""" @@ -276,18 +288,16 @@ def test_time_values_inequality(self): def fetch(time_value): # make the request response = self.request_based_on_row(rows[0], time_values=time_value) - print(time_value) - return response # test fetch time_value with < r = fetch('<20000104') self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[0:2]) + self.assertEqual(r['epidata'], expected[:2]) # test fetch time_value with <= r = fetch('<=20000104') self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[0:3]) + self.assertEqual(r['epidata'], expected[:3]) # test fetch time_value with > r = fetch('>20000104') self.assertEqual(r['message'], 'success') @@ -335,6 +345,56 @@ def test_issues_wildcard(self): 'message': 'success', }) + def test_issues_inequality(self): + """Select all time_values with a wildcard query.""" + + # insert placeholder data + rows = self._insert_placeholder_set_seven() + expected = [row.as_api_compatibility_row_dict() for row in rows[:6]] + + def fetch(issue): + # make the request + response = self.request_based_on_row(rows[0], issues=issue) + return response + + # test fetch issues with < + r = fetch('<20000106') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[:2]) + # test fetch issues with <= + r = fetch('<=20000106') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[:3]) + # test fetch issues with > + r = fetch('>20000106') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[3:]) + # test fetch issues with >= + r = fetch('>=20000106') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[2:]) + # test fetch multiple inequalities + r = fetch('<20000106,>20000106') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[:2] + expected[3:]) + # test fetch inequalities that has no results + r = fetch('>20000109') + self.assertEqual(r['message'], 'no results') + # test fetch empty issues + r = fetch('') + self.assertEqual(r['message'], 'not a valid date: (empty)') + # test fetch invalid issues + r = fetch('>') + self.assertEqual(r['message'], 'missing parameter: date after the inequality operator') + # test if extra operators provided + r = fetch('<>') + self.assertEqual(r['message'], 'not a valid date: >') + r = fetch('><20000106') + self.assertEqual(r['message'], 'not a valid date: <20000106') + # test invalid operator + r = fetch('@') + self.assertEqual(r['message'], 'not a valid date: @') + def test_signal_wildcard(self): """Select all signals with a wildcard query.""" diff --git a/src/server/_params.py b/src/server/_params.py index 406bc869b..6b440b64d 100644 --- a/src/server/_params.py +++ b/src/server/_params.py @@ -394,8 +394,9 @@ def parse_date(s: str) -> int: # parses a given string in format YYYYMMDD or YYYY-MM-DD to a number in the form YYYYMMDD if s == "*": return s + if not s: + raise ValidationFailedException(f"not a valid date: (empty)") try: - print(f"in parse_date: {s}, type: {type(s)}") # test return int(s.replace("-", "")) except ValueError: raise ValidationFailedException(f"not a valid date: {s}") From 81762b8296b316e249f2f62958e1adfa623cdc62 Mon Sep 17 00:00:00 2001 From: LeonLu2 Date: Wed, 5 Apr 2023 20:32:36 -0400 Subject: [PATCH 03/12] 1. minor changes --- src/server/_params.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/_params.py b/src/server/_params.py index 4723c1ca5..02defab70 100644 --- a/src/server/_params.py +++ b/src/server/_params.py @@ -406,7 +406,7 @@ def parse_date(s: str) -> int: if s == "*": return s if not s: - raise ValidationFailedException(f"not a valid date: (empty)") + raise ValidationFailedException("not a valid date: (empty)") try: return int(s.replace("-", "")) except ValueError: @@ -433,7 +433,7 @@ def handle_inequality(part: str): inequality_operator = operator part = part[len(operator):] if not part: - raise ValidationFailedException(f"missing parameter: date after the inequality operator") + raise ValidationFailedException("missing parameter: date after the inequality operator") return (inequality_operator,), part return None, part From 0c1d8762c6e5648621635bce4121ac82cc8f6b56 Mon Sep 17 00:00:00 2001 From: LeonLu2 Date: Thu, 6 Apr 2023 13:22:25 -0400 Subject: [PATCH 04/12] 1. add an overlap inequality testcase --- integrations/server/test_covidcast.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index e917ee3cc..d4c9b62d5 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -191,6 +191,7 @@ def test_csv_format(self): .assign(direction = None) .to_csv(columns=column_order, index=False) ) + # assert that the right data came back self.assertEqual(response, expected) @@ -289,7 +290,7 @@ def fetch(time_value): # make the request response = self.request_based_on_row(rows[0], time_values=time_value) return response - + self.maxDiff = None # test fetch time_value with < r = fetch('<20000104') self.assertEqual(r['message'], 'success') @@ -310,6 +311,10 @@ def fetch(time_value): r = fetch('<20000104,>20000104') self.assertEqual(r['message'], 'success') self.assertEqual(r['epidata'], expected[:2] + expected[3:6]) + # test overlapped inequalities, pick the more extreme one + r = fetch('<20000104,<20000105') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[:3]) # test fetch inequalities that has no results r = fetch('>20000107') self.assertEqual(r['message'], 'no results') @@ -377,6 +382,10 @@ def fetch(issue): r = fetch('<20000106,>20000106') self.assertEqual(r['message'], 'success') self.assertEqual(r['epidata'], expected[:2] + expected[3:]) + # test overlapped inequalities, pick the more extreme one + r = fetch('>20000107,>20000106') + self.assertEqual(r['message'], 'success') + self.assertEqual(r['epidata'], expected[3:]) # test fetch inequalities that has no results r = fetch('>20000109') self.assertEqual(r['message'], 'no results') From 896e40910abb5e131a35aa78e545e10eb2b9cf42 Mon Sep 17 00:00:00 2001 From: Suhan Lu <78125134+LeonLu2@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:27:35 -0400 Subject: [PATCH 05/12] Update integrations/server/test_covidcast.py Co-authored-by: Katie Mazaitis --- integrations/server/test_covidcast.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index d4c9b62d5..b9ab936b5 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -85,11 +85,7 @@ def _insert_placeholder_set_five(self): def _insert_placeholder_set_six(self): rows = [ CovidcastTestRow.make_default_row(time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03) - for i in [1, 2, 3] - ] + [ - # different time_values - CovidcastTestRow.make_default_row(time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03) - for i in [4, 5, 6] + for i in [1, 2, 3, 4, 5, 6] ] self._insert_rows(rows) return rows From cab9514658ee4951cce1b0d22c605d3f409ec472 Mon Sep 17 00:00:00 2001 From: Suhan Lu <78125134+LeonLu2@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:27:45 -0400 Subject: [PATCH 06/12] Update integrations/server/test_covidcast.py Co-authored-by: Katie Mazaitis --- integrations/server/test_covidcast.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index b9ab936b5..415d9b945 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -93,11 +93,7 @@ def _insert_placeholder_set_six(self): def _insert_placeholder_set_seven(self): rows = [ CovidcastTestRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i) - for i in [1, 2, 3] - ] + [ - # same time_values, different issues - CovidcastTestRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i) - for i in [4, 5, 6] + for i in [1, 2, 3, 4, 5, 6] ] self._insert_rows(rows) return rows From 8df74aaa064fc729dc0645c978f3e57d97004d16 Mon Sep 17 00:00:00 2001 From: Suhan Lu <78125134+LeonLu2@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:28:58 -0400 Subject: [PATCH 07/12] Update integrations/server/test_covidcast.py Co-authored-by: Katie Mazaitis --- integrations/server/test_covidcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 415d9b945..0daac9e2c 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -276,7 +276,7 @@ def test_time_values_inequality(self): # insert placeholder data rows = self._insert_placeholder_set_six() - expected = [row.as_api_compatibility_row_dict() for row in rows[:6]] + expected = [row.as_api_compatibility_row_dict() for row in rows] def fetch(time_value): # make the request From d2663e2525e457cb52dbd2ae5a726a516a0b4ff0 Mon Sep 17 00:00:00 2001 From: Suhan Lu <78125134+LeonLu2@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:29:12 -0400 Subject: [PATCH 08/12] Update integrations/server/test_covidcast.py Co-authored-by: Katie Mazaitis --- integrations/server/test_covidcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 0daac9e2c..fa6919079 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -294,7 +294,7 @@ def fetch(time_value): # test fetch time_value with > r = fetch('>20000104') self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[3:6]) + self.assertEqual(r['epidata'], expected[3]) # test fetch time_value with >= r = fetch('>=20000104') self.assertEqual(r['message'], 'success') From f66b2e3b6fa444ab08c199fd2a029ec9d1c7499e Mon Sep 17 00:00:00 2001 From: Suhan Lu <78125134+LeonLu2@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:29:20 -0400 Subject: [PATCH 09/12] Update integrations/server/test_covidcast.py Co-authored-by: Katie Mazaitis --- integrations/server/test_covidcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index fa6919079..881bd207f 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -298,7 +298,7 @@ def fetch(time_value): # test fetch time_value with >= r = fetch('>=20000104') self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[2:6]) + self.assertEqual(r['epidata'], expected[2:]) # test fetch multiple inequalities r = fetch('<20000104,>20000104') self.assertEqual(r['message'], 'success') From 22b4de79288b078e671b662795efc2e5b3d0c108 Mon Sep 17 00:00:00 2001 From: Suhan Lu <78125134+LeonLu2@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:29:30 -0400 Subject: [PATCH 10/12] Update integrations/server/test_covidcast.py Co-authored-by: Katie Mazaitis --- integrations/server/test_covidcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 881bd207f..33ee44be5 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -302,7 +302,7 @@ def fetch(time_value): # test fetch multiple inequalities r = fetch('<20000104,>20000104') self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[:2] + expected[3:6]) + self.assertEqual(r['epidata'], expected[:2] + expected[3:]) # test overlapped inequalities, pick the more extreme one r = fetch('<20000104,<20000105') self.assertEqual(r['message'], 'success') From 6f4feab39e1f31e78bc0c359ee79c17e52339fa4 Mon Sep 17 00:00:00 2001 From: LeonLu2 Date: Thu, 6 Apr 2023 13:36:01 -0400 Subject: [PATCH 11/12] 1. typo --- integrations/server/test_covidcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 33ee44be5..cc2f20f64 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -294,7 +294,7 @@ def fetch(time_value): # test fetch time_value with > r = fetch('>20000104') self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[3]) + self.assertEqual(r['epidata'], expected[3:]) # test fetch time_value with >= r = fetch('>=20000104') self.assertEqual(r['message'], 'success') From 3e306937df34f9276ddd1091f98aac4545627ecb Mon Sep 17 00:00:00 2001 From: LeonLu2 Date: Wed, 12 Apr 2023 00:57:15 -0400 Subject: [PATCH 12/12] 1. remove duplication in time_value and issues inequality tests --- integrations/server/test_covidcast.py | 87 ++++++--------------------- 1 file changed, 20 insertions(+), 67 deletions(-) diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index cc2f20f64..e96488fb6 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -92,7 +92,7 @@ def _insert_placeholder_set_six(self): def _insert_placeholder_set_seven(self): rows = [ - CovidcastTestRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i) + CovidcastTestRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_01+i) for i in [1, 2, 3, 4, 5, 6] ] self._insert_rows(rows) @@ -271,18 +271,14 @@ def test_time_values_wildcard(self): 'message': 'success', }) - def test_time_values_inequality(self): - """Select all time_values with a wildcard query.""" - - # insert placeholder data - rows = self._insert_placeholder_set_six() + def helper_test_inequality(self, rows, field): expected = [row.as_api_compatibility_row_dict() for row in rows] - def fetch(time_value): - # make the request - response = self.request_based_on_row(rows[0], time_values=time_value) - return response - self.maxDiff = None + def fetch(datecode): + # make the request + response = self.request_based_on_row(rows[0], **{field: datecode}) + return response + # test fetch time_value with < r = fetch('<20000104') self.assertEqual(r['message'], 'success') @@ -310,9 +306,12 @@ def fetch(time_value): # test fetch inequalities that has no results r = fetch('>20000107') self.assertEqual(r['message'], 'no results') - # test fetch empty time_value + # test fetch empty value r = fetch('') - self.assertEqual(r['message'], 'missing parameter: need [time_type, time_values]') + if field == 'time_values': + self.assertEqual(r['message'], 'missing parameter: need [time_type, time_values]') + else: + self.assertEqual(r['message'], 'not a valid date: (empty)') # test fetch invalid time_value r = fetch('>') self.assertEqual(r['message'], 'missing parameter: date after the inequality operator') @@ -325,6 +324,14 @@ def fetch(time_value): r = fetch('#') self.assertEqual(r['message'], 'not a valid date: #') + def test_time_values_inequality(self): + rows = self._insert_placeholder_set_six() + self.helper_test_inequality(rows, "time_values") + + def test_issues_inequality(self): + rows = self._insert_placeholder_set_seven() + self.helper_test_inequality(rows, "issues") + def test_issues_wildcard(self): """Select all issues with a wildcard query.""" @@ -342,60 +349,6 @@ def test_issues_wildcard(self): 'message': 'success', }) - def test_issues_inequality(self): - """Select all time_values with a wildcard query.""" - - # insert placeholder data - rows = self._insert_placeholder_set_seven() - expected = [row.as_api_compatibility_row_dict() for row in rows[:6]] - - def fetch(issue): - # make the request - response = self.request_based_on_row(rows[0], issues=issue) - return response - - # test fetch issues with < - r = fetch('<20000106') - self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[:2]) - # test fetch issues with <= - r = fetch('<=20000106') - self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[:3]) - # test fetch issues with > - r = fetch('>20000106') - self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[3:]) - # test fetch issues with >= - r = fetch('>=20000106') - self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[2:]) - # test fetch multiple inequalities - r = fetch('<20000106,>20000106') - self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[:2] + expected[3:]) - # test overlapped inequalities, pick the more extreme one - r = fetch('>20000107,>20000106') - self.assertEqual(r['message'], 'success') - self.assertEqual(r['epidata'], expected[3:]) - # test fetch inequalities that has no results - r = fetch('>20000109') - self.assertEqual(r['message'], 'no results') - # test fetch empty issues - r = fetch('') - self.assertEqual(r['message'], 'not a valid date: (empty)') - # test fetch invalid issues - r = fetch('>') - self.assertEqual(r['message'], 'missing parameter: date after the inequality operator') - # test if extra operators provided - r = fetch('<>') - self.assertEqual(r['message'], 'not a valid date: >') - r = fetch('><20000106') - self.assertEqual(r['message'], 'not a valid date: <20000106') - # test invalid operator - r = fetch('@') - self.assertEqual(r['message'], 'not a valid date: @') - def test_signal_wildcard(self): """Select all signals with a wildcard query."""