Skip to content

Commit 79259c2

Browse files
committed
Server: update test_covidcast to use CovidcastRow
1 parent 557c10d commit 79259c2

File tree

2 files changed

+71
-82
lines changed

2 files changed

+71
-82
lines changed

integrations/server/test_covidcast.py

Lines changed: 71 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Integration tests for the `covidcast` endpoint."""
22

33
# standard library
4-
import json
4+
from typing import Callable
55
import unittest
66

77
# third party
@@ -10,12 +10,12 @@
1010

1111
# first party
1212
from delphi_utils import Nans
13+
from delphi.epidata.acquisition.covidcast.covidcast_row import CovidcastRow
1314
from delphi.epidata.acquisition.covidcast.test_utils import CovidcastBase
1415

1516
# use the local instance of the Epidata API
1617
BASE_URL = 'http://delphi_web_epidata/epidata/api.php'
17-
18-
18+
IGNORE_FIELDS = ["id", "direction_updated_timestamp", "value_updated_timestamp", "source", "time_type", "geo_type"]
1919

2020
class CovidcastTests(CovidcastBase):
2121
"""Tests the `covidcast` endpoint."""
@@ -24,64 +24,62 @@ def localSetUp(self):
2424
"""Perform per-test setup."""
2525
self._db._cursor.execute('update covidcast_meta_cache set timestamp = 0, epidata = "[]"')
2626

27-
def request_based_on_row(self, row, extract_response=lambda x: x.json(), **kwargs):
27+
def request_based_on_row(self, row: CovidcastRow, extract_response: Callable = lambda x: x.json(), **kwargs):
2828
params = self.params_from_row(row, endpoint='covidcast', **kwargs)
2929
response = requests.get(BASE_URL, params=params)
3030
response.raise_for_status()
3131
response = extract_response(response)
3232

33-
expected = self.expected_from_row(row)
34-
35-
return response, expected
33+
return response
3634

3735
def _insert_placeholder_set_one(self):
38-
row, settings = self._make_placeholder_row()
36+
row = CovidcastRow.make_default_row()
3937
self._insert_rows([row])
4038
return row
4139

4240
def _insert_placeholder_set_two(self):
4341
rows = [
44-
self._make_placeholder_row(geo_type='county', geo_value=str(i)*5, value=i*1., stderr=i*10., sample_size=i*100.)[0]
42+
CovidcastRow.make_default_row(geo_type='county', geo_value=str(i)*5, value=i*1., stderr=i*10., sample_size=i*100.)
4543
for i in [1, 2, 3]
4644
] + [
4745
# geo value intended to overlap with counties above
48-
self._make_placeholder_row(geo_type='msa', geo_value=str(i-3)*5, value=i*1., stderr=i*10., sample_size=i*100.)[0]
46+
CovidcastRow.make_default_row(geo_type='msa', geo_value=str(i-3)*5, value=i*1., stderr=i*10., sample_size=i*100.)
4947
for i in [4, 5, 6]
5048
]
5149
self._insert_rows(rows)
5250
return rows
5351

5452
def _insert_placeholder_set_three(self):
5553
rows = [
56-
self._make_placeholder_row(geo_type='county', geo_value='11111', time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03, lag=2-i)[0]
54+
CovidcastRow.make_default_row(geo_type='county', geo_value='11111', time_value=2000_01_01+i, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03, lag=2-i)
5755
for i in [1, 2, 3]
5856
] + [
5957
# time value intended to overlap with 11111 above, with disjoint geo values
60-
self._make_placeholder_row(geo_type='county', geo_value=str(i)*5, time_value=2000_01_01+i-3, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03, lag=5-i)[0]
58+
CovidcastRow.make_default_row(geo_type='county', geo_value=str(i)*5, time_value=2000_01_01+i-3, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03, lag=5-i)
6159
for i in [4, 5, 6]
6260
]
6361
self._insert_rows(rows)
6462
return rows
6563

6664
def _insert_placeholder_set_four(self):
6765
rows = [
68-
self._make_placeholder_row(source='src1', signal=str(i)*5, value=i*1., stderr=i*10., sample_size=i*100.)[0]
66+
CovidcastRow.make_default_row(source='src1', signal=str(i)*5, value=i*1., stderr=i*10., sample_size=i*100.)
6967
for i in [1, 2, 3]
7068
] + [
7169
# signal intended to overlap with the signal above
72-
self._make_placeholder_row(source='src2', signal=str(i-3)*5, value=i*1., stderr=i*10., sample_size=i*100.)[0]
70+
CovidcastRow.make_default_row(source='src2', signal=str(i-3)*5, value=i*1., stderr=i*10., sample_size=i*100.)
7371
for i in [4, 5, 6]
7472
]
7573
self._insert_rows(rows)
7674
return rows
7775

7876
def _insert_placeholder_set_five(self):
7977
rows = [
80-
CovidcastRow(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i)
78+
CovidcastRow.make_default_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i)
8179
for i in [1, 2, 3]
8280
] + [
8381
# different time_values, same issues
84-
CovidcastRow(time_value=2000_01_01+i-3, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i-3)
82+
CovidcastRow.make_default_row(time_value=2000_01_01+i-3, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i-3)
8583
for i in [4, 5, 6]
8684
]
8785
self._insert_rows(rows)
@@ -94,10 +92,13 @@ def test_round_trip(self):
9492
row = self._insert_placeholder_set_one()
9593

9694
# make the request
97-
response, expected = self.request_based_on_row(row)
95+
response = self.request_based_on_row(row)
96+
97+
expected = [row.as_dict(ignore_fields=IGNORE_FIELDS)]
98+
9899
self.assertEqual(response, {
99100
'result': 1,
100-
'epidata': [expected],
101+
'epidata': expected,
101102
'message': 'success',
102103
})
103104

@@ -154,32 +155,25 @@ def test_csv_format(self):
154155

155156
# make the request
156157
# NB 'format' is a Python reserved word
157-
response, _ = self.request_based_on_row(
158+
response = self.request_based_on_row(
158159
row,
159160
extract_response=lambda resp: resp.text,
160161
**{'format':'csv'}
161162
)
162-
expected_response = (
163-
"geo_value,signal,time_value,direction,issue,lag,missing_value," +
164-
"missing_stderr,missing_sample_size,value,stderr,sample_size\n" +
165-
",".join("" if x is None else str(x) for x in [
166-
row.geo_value,
167-
row.signal,
168-
row.time_value,
169-
row.direction,
170-
row.issue,
171-
row.lag,
172-
row.missing_value,
173-
row.missing_stderr,
174-
row.missing_sample_size,
175-
row.value,
176-
row.stderr,
177-
row.sample_size
178-
]) + "\n"
163+
164+
# TODO: This is a mess because of api.php.
165+
column_order = [
166+
"geo_value", "signal", "time_value", "direction", "issue", "lag", "missing_value",
167+
"missing_stderr", "missing_sample_size", "value", "stderr", "sample_size"
168+
]
169+
expected = (
170+
row.api_compatibility_row_df
171+
.assign(direction = None)
172+
.to_csv(columns=column_order, index=False)
179173
)
180174

181175
# assert that the right data came back
182-
self.assertEqual(response, expected_response)
176+
self.assertEqual(response, expected)
183177

184178
def test_raw_json_format(self):
185179
"""Test generate raw json data."""
@@ -188,10 +182,12 @@ def test_raw_json_format(self):
188182
row = self._insert_placeholder_set_one()
189183

190184
# make the request
191-
response, expected = self.request_based_on_row(row, **{'format':'json'})
185+
response = self.request_based_on_row(row, **{'format':'json'})
186+
187+
expected = [row.as_dict(ignore_fields=IGNORE_FIELDS)]
192188

193189
# assert that the right data came back
194-
self.assertEqual(response, [expected])
190+
self.assertEqual(response, expected)
195191

196192
def test_fields(self):
197193
"""Test fields parameter"""
@@ -200,7 +196,9 @@ def test_fields(self):
200196
row = self._insert_placeholder_set_one()
201197

202198
# limit fields
203-
response, expected = self.request_based_on_row(row, fields='time_value,geo_value')
199+
response = self.request_based_on_row(row, fields='time_value,geo_value')
200+
201+
expected = row.as_dict(ignore_fields=IGNORE_FIELDS)
204202
expected_all = {
205203
'result': 1,
206204
'epidata': [{
@@ -213,15 +211,14 @@ def test_fields(self):
213211
self.assertEqual(response, expected_all)
214212

215213
# limit using invalid fields
216-
response, _ = self.request_based_on_row(row, fields='time_value,geo_value,doesnt_exist')
214+
response = self.request_based_on_row(row, fields='time_value,geo_value,doesnt_exist')
217215

218216
# assert that the right data came back (only valid fields)
219217
self.assertEqual(response, expected_all)
220218

221219

222220
# limit exclude fields: exclude all except time_value and geo_value
223-
224-
response, _ = self.request_based_on_row(row, fields=(
221+
response = self.request_based_on_row(row, fields=(
225222
'-value,-stderr,-sample_size,-direction,-issue,-lag,-signal,' +
226223
'-missing_value,-missing_stderr,-missing_sample_size'
227224
))
@@ -234,18 +231,15 @@ def test_location_wildcard(self):
234231

235232
# insert placeholder data
236233
rows = self._insert_placeholder_set_two()
237-
expected_counties = [
238-
self.expected_from_row(r) for r in rows[:3]
239-
]
240-
234+
expected = [row.as_dict(ignore_fields=IGNORE_FIELDS) for row in rows[:3]]
241235
# make the request
242-
response, _ = self.request_based_on_row(rows[0], geo_value="*")
236+
response = self.request_based_on_row(rows[0], geo_value="*")
243237

244238
self.maxDiff = None
245239
# assert that the right data came back
246240
self.assertEqual(response, {
247241
'result': 1,
248-
'epidata': expected_counties,
242+
'epidata': expected,
249243
'message': 'success',
250244
})
251245

@@ -290,12 +284,10 @@ def test_signal_wildcard(self):
290284

291285
# insert placeholder data
292286
rows = self._insert_placeholder_set_four()
293-
expected_signals = [
294-
self.expected_from_row(r) for r in rows[:3]
295-
]
287+
expected_signals = [row.as_dict(ignore_fields=IGNORE_FIELDS) for row in rows[:3]]
296288

297289
# make the request
298-
response, _ = self.request_based_on_row(rows[0], signals="*")
290+
response = self.request_based_on_row(rows[0], signals="*")
299291

300292
self.maxDiff = None
301293
# assert that the right data came back
@@ -310,35 +302,33 @@ def test_geo_value(self):
310302

311303
# insert placeholder data
312304
rows = self._insert_placeholder_set_two()
313-
expected_counties = [
314-
self.expected_from_row(r) for r in rows[:3]
315-
]
305+
expected = [row.as_dict(ignore_fields=IGNORE_FIELDS) for row in rows[:3]]
316306

317307
def fetch(geo_value):
318308
# make the request
319-
response, _ = self.request_based_on_row(rows[0], geo_value=geo_value)
309+
response = self.request_based_on_row(rows[0], geo_value=geo_value)
320310

321311
return response
322312

323313
# test fetch a specific region
324314
r = fetch('11111')
325315
self.assertEqual(r['message'], 'success')
326-
self.assertEqual(r['epidata'], [expected_counties[0]])
316+
self.assertEqual(r['epidata'], expected[0:1])
327317
# test fetch a specific yet not existing region
328318
r = fetch('55555')
329319
self.assertEqual(r['message'], 'no results')
330320
# test fetch multiple regions
331321
r = fetch('11111,22222')
332322
self.assertEqual(r['message'], 'success')
333-
self.assertEqual(r['epidata'], [expected_counties[0], expected_counties[1]])
323+
self.assertEqual(r['epidata'], expected[0:2])
334324
# test fetch multiple noncontiguous regions
335325
r = fetch('11111,33333')
336326
self.assertEqual(r['message'], 'success')
337-
self.assertEqual(r['epidata'], [expected_counties[0], expected_counties[2]])
327+
self.assertEqual(r['epidata'], [expected[0], expected[2]])
338328
# test fetch multiple regions but one is not existing
339329
r = fetch('11111,55555')
340330
self.assertEqual(r['message'], 'success')
341-
self.assertEqual(r['epidata'], [expected_counties[0]])
331+
self.assertEqual(r['epidata'], expected[0:1])
342332
# test fetch empty region
343333
r = fetch('')
344334
self.assertEqual(r['message'], 'no results')
@@ -348,12 +338,10 @@ def test_location_timeline(self):
348338

349339
# insert placeholder data
350340
rows = self._insert_placeholder_set_three()
351-
expected_timeseries = [
352-
self.expected_from_row(r) for r in rows[:3]
353-
]
341+
expected_timeseries = [row.as_dict(ignore_fields=IGNORE_FIELDS) for row in rows[:3]]
354342

355343
# make the request
356-
response, _ = self.request_based_on_row(rows[0], time_values='20000101-20000105')
344+
response = self.request_based_on_row(rows[0], time_values='20000101-20000105')
357345

358346
# assert that the right data came back
359347
self.assertEqual(response, {
@@ -379,15 +367,16 @@ def test_unique_key_constraint(self):
379367
def test_nullable_columns(self):
380368
"""Missing values should be surfaced as null."""
381369

382-
row, _ = self._make_placeholder_row(
370+
row = CovidcastRow.make_default_row(
383371
stderr=None, sample_size=None,
384372
missing_stderr=Nans.OTHER.value, missing_sample_size=Nans.OTHER.value
385373
)
386374
self._insert_rows([row])
387375

388376
# make the request
389-
response, expected = self.request_based_on_row(row)
390-
expected.update(stderr=None, sample_size=None)
377+
response = self.request_based_on_row(row)
378+
expected = row.as_dict(ignore_fields=IGNORE_FIELDS)
379+
# expected.update(stderr=None, sample_size=None)
391380

392381
# assert that the right data came back
393382
self.assertEqual(response, {
@@ -401,18 +390,19 @@ def test_temporal_partitioning(self):
401390

402391
# insert placeholder data
403392
rows = [
404-
self._make_placeholder_row(time_type=tt)[0]
393+
CovidcastRow.make_default_row(time_type=tt)
405394
for tt in "hour day week month year".split()
406395
]
407396
self._insert_rows(rows)
408397

409398
# make the request
410-
response, expected = self.request_based_on_row(rows[1], time_values="0-99999999")
399+
response = self.request_based_on_row(rows[1], time_values="20000101-30010201")
400+
expected = [rows[1].as_dict(ignore_fields=IGNORE_FIELDS)]
411401

412402
# assert that the right data came back
413403
self.assertEqual(response, {
414404
'result': 1,
415-
'epidata': [expected],
405+
'epidata': expected,
416406
'message': 'success',
417407
})
418408

@@ -423,37 +413,37 @@ def test_date_formats(self):
423413
rows = self._insert_placeholder_set_three()
424414

425415
# make the request
426-
response, expected = self.request_based_on_row(rows[0], time_values="20000102", geo_value="*")
416+
response = self.request_based_on_row(rows[0], time_values="20000102", geo_value="*")
427417

428418
# assert that the right data came back
429419
self.assertEqual(len(response['epidata']), 2)
430420

431421
# make the request
432-
response, expected = self.request_based_on_row(rows[0], time_values="2000-01-02", geo_value="*")
422+
response = self.request_based_on_row(rows[0], time_values="2000-01-02", geo_value="*")
433423

434424
# assert that the right data came back
435425
self.assertEqual(len(response['epidata']), 2)
436426

437427
# make the request
438-
response, expected = self.request_based_on_row(rows[0], time_values="20000102,20000103", geo_value="*")
428+
response = self.request_based_on_row(rows[0], time_values="20000102,20000103", geo_value="*")
439429

440430
# assert that the right data came back
441-
self.assertEqual(len(response['epidata']), 4)
431+
self.assertEqual(len(response['epidata']), 2 * 2)
442432

443433
# make the request
444-
response, expected = self.request_based_on_row(rows[0], time_values="2000-01-02,2000-01-03", geo_value="*")
434+
response = self.request_based_on_row(rows[0], time_values="2000-01-02,2000-01-03", geo_value="*")
445435

446436
# assert that the right data came back
447-
self.assertEqual(len(response['epidata']), 4)
437+
self.assertEqual(len(response['epidata']), 2 * 2)
448438

449439
# make the request
450-
response, expected = self.request_based_on_row(rows[0], time_values="20000102-20000104", geo_value="*")
440+
response = self.request_based_on_row(rows[0], time_values="20000102-20000104", geo_value="*")
451441

452442
# assert that the right data came back
453-
self.assertEqual(len(response['epidata']), 6)
443+
self.assertEqual(len(response['epidata']), 2 * 3)
454444

455445
# make the request
456-
response, expected = self.request_based_on_row(rows[0], time_values="2000-01-02:2000-01-04", geo_value="*")
446+
response = self.request_based_on_row(rows[0], time_values="2000-01-02:2000-01-04", geo_value="*")
457447

458448
# assert that the right data came back
459-
self.assertEqual(len(response['epidata']), 6)
449+
self.assertEqual(len(response['epidata']), 2 * 3)

tests/server/test_pandas.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from delphi.epidata.server._pandas import as_pandas
1010
from delphi.epidata.server._config import MAX_RESULTS
1111

12-
1312
# py3tester coverage target
1413
__test_target__ = "delphi.epidata.server._pandas"
1514

0 commit comments

Comments
 (0)