def test_query_by_issue(self):
        """Query with and without specifying an issue."""

        # insert dummy data
        def insert_issue(cur, issue, value, record_type):
            so_many_nulls = ', '.join(['null'] * 57)
            cur.execute(f'''insert into covid_hosp_state_timeseries values (
        0, {issue}, 'PA', 20201118, {value}, {so_many_nulls}, '{record_type}'
      )''')

        with Database.connect() as db:
            with db.new_cursor() as cur:
                # inserting out of order to test server-side order by
                # also inserting two for 20201201 to test tiebreaker.
                insert_issue(cur, 20201201, 123, 'T')
                insert_issue(cur, 20201201, 321, 'D')
                insert_issue(cur, 20201203, 789, 'T')
                insert_issue(cur, 20201202, 456, 'T')

        # request without issue (defaulting to latest issue)
        with self.subTest(name='no issue (latest)'):
            response = Epidata.covid_hosp('PA', 20201118)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201203)
            self.assertEqual(
                response['epidata'][0]['critical_staffing_shortage_today_yes'],
                789)

        # request for specific issue
        with self.subTest(name='specific single issue'):
            response = Epidata.covid_hosp('PA', 20201118, issues=20201201)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201201)
            self.assertEqual(
                response['epidata'][0]['critical_staffing_shortage_today_yes'],
                321)

        # request for multiple issues
        with self.subTest(name='specific multiple issues'):
            issues = Epidata.range(20201201, 20201231)
            response = Epidata.covid_hosp('PA', 20201118, issues=issues)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 3)
            rows = response['epidata']
            # tiebreaker
            self.assertEqual(rows[0]['issue'], 20201201)
            self.assertEqual(rows[0]['critical_staffing_shortage_today_yes'],
                             321)
            # server-side order by
            self.assertEqual(rows[1]['issue'], 20201202)
            self.assertEqual(rows[1]['critical_staffing_shortage_today_yes'],
                             456)
            self.assertEqual(rows[2]['issue'], 20201203)
            self.assertEqual(rows[2]['critical_staffing_shortage_today_yes'],
                             789)
예제 #2
0
  def test_acquire_dataset(self):
    """Acquire a new dataset."""

    # make sure the data does not yet exist
    with self.subTest(name='no data yet'):
      response = Epidata.covid_hosp('MA', Epidata.range(20200101, 20210101))
      self.assertEqual(response['result'], -2, response)

    # acquire sample data into local database
    # mock out network calls to external hosts
    with self.subTest(name='first acquisition'), \
         patch.object(Network, 'fetch_metadata', return_value=self.test_utils.load_sample_metadata()) as mock_fetch_meta, \
         patch.object(Network, 'fetch_dataset', side_effect=[self.test_utils.load_sample_dataset("dataset0.csv"), # dataset for 3/13
                                                             self.test_utils.load_sample_dataset("dataset0.csv"), # first dataset for 3/15
                                                             self.test_utils.load_sample_dataset()] # second dataset for 3/15
                      ) as mock_fetch:
      acquired = Update.run()
      self.assertTrue(acquired)
      self.assertEqual(mock_fetch_meta.call_count, 1)

    # make sure the data now exists
    with self.subTest(name='initial data checks'):
      response = Epidata.covid_hosp('WY', Epidata.range(20200101, 20210101))
      self.assertEqual(response['result'], 1)
      self.assertEqual(len(response['epidata']), 1)
      row = response['epidata'][0]
      self.assertEqual(row['state'], 'WY')
      self.assertEqual(row['date'], 20201209)
      self.assertEqual(row['issue'], 20210315)
      self.assertEqual(row['critical_staffing_shortage_today_yes'], 8)
      self.assertEqual(row['total_patients_hospitalized_confirmed_influenza_covid_coverage'], 56)
      actual = row['inpatient_bed_covid_utilization']
      expected = 0.11729857819905214
      self.assertAlmostEqual(actual, expected)
      self.assertIsNone(row['critical_staffing_shortage_today_no'])

      # expect 61 fields per row (63 database columns, except `id` and `record_type`)
      self.assertEqual(len(row), 118)

    with self.subTest(name='all date batches acquired'):
      response = Epidata.covid_hosp('WY', Epidata.range(20200101, 20210101), issues=20210313)
      self.assertEqual(response['result'], 1)

    # re-acquisition of the same dataset should be a no-op
    with self.subTest(name='second acquisition'), \
         patch.object(Network, 'fetch_metadata', return_value=self.test_utils.load_sample_metadata()) as mock_fetch_meta, \
         patch.object(Network, 'fetch_dataset', return_value=self.test_utils.load_sample_dataset()) as mock_fetch:
      acquired = Update.run()
      self.assertFalse(acquired)

    # make sure the data still exists
    with self.subTest(name='final data checks'):
      response = Epidata.covid_hosp('WY', Epidata.range(20200101, 20210101))
      self.assertEqual(response['result'], 1)
      self.assertEqual(len(response['epidata']), 1)
예제 #3
0
    def test_query_by_issue(self):
        """Query with and without specifying an issue."""

        with Database.connect() as db:
            with db.new_cursor() as cur:
                # inserting out of order to test server-side order by
                # also inserting two for 20201201 to test tiebreaker.
                self.insert_issue(cur, 20201201, 123, 'T')
                self.insert_issue(cur, 20201201, 321, 'D')
                self.insert_issue(cur, 20201203, 789, 'T')
                self.insert_issue(cur, 20201202, 456, 'T')

        # request without issue (defaulting to latest issue)
        with self.subTest(name='no issue (latest)'):
            response = Epidata.covid_hosp('PA', 20201118)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201203)
            self.assertEqual(
                response['epidata'][0]['critical_staffing_shortage_today_yes'],
                789)

        # request for specific issue
        with self.subTest(name='specific single issue'):
            response = Epidata.covid_hosp('PA', 20201118, issues=20201201)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201201)
            self.assertEqual(
                response['epidata'][0]['critical_staffing_shortage_today_yes'],
                321)

        # request for multiple issues
        with self.subTest(name='specific multiple issues'):
            issues = Epidata.range(20201201, 20201231)
            response = Epidata.covid_hosp('PA', 20201118, issues=issues)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 3)
            rows = response['epidata']
            # tiebreaker
            self.assertEqual(rows[0]['issue'], 20201201)
            self.assertEqual(rows[0]['critical_staffing_shortage_today_yes'],
                             321)
            # server-side order by
            self.assertEqual(rows[1]['issue'], 20201202)
            self.assertEqual(rows[1]['critical_staffing_shortage_today_yes'],
                             456)
            self.assertEqual(rows[2]['issue'], 20201203)
            self.assertEqual(rows[2]['critical_staffing_shortage_today_yes'],
                             789)
예제 #4
0
    def test_query_by_issue(self):
        """Query with and without specifying an issue."""

        # insert dummy data
        def insert_issue(cur, issue, value):
            so_many_nulls = ', '.join(['null'] * 51)
            cur.execute(f'''insert into covid_hosp values (
        0, {issue}, 'PA', 20201118, {value}, {so_many_nulls}
      )''')

        with Database.connect() as db:
            with db.new_cursor() as cur:
                # inserting out of order to test server-side order by
                insert_issue(cur, 20201201, 123)
                insert_issue(cur, 20201203, 789)
                insert_issue(cur, 20201202, 456)

        # request without issue (defaulting to latest issue)
        with self.subTest(name='no issue (latest)'):
            response = Epidata.covid_hosp('PA', 20201118)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201203)
            self.assertEqual(response['epidata'][0]['hospital_onset_covid'],
                             789)

        # request for specific issue
        with self.subTest(name='specific single issue'):
            response = Epidata.covid_hosp('PA', 20201118, issues=20201201)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201201)
            self.assertEqual(response['epidata'][0]['hospital_onset_covid'],
                             123)

        # request for multiple issues
        with self.subTest(name='specific multiple issues'):
            issues = Epidata.range(20201201, 20201231)
            response = Epidata.covid_hosp('PA', 20201118, issues=issues)

            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 3)
            rows = response['epidata']
            self.assertEqual(rows[0]['issue'], 20201201)
            self.assertEqual(rows[0]['hospital_onset_covid'], 123)
            self.assertEqual(rows[1]['issue'], 20201202)
            self.assertEqual(rows[1]['hospital_onset_covid'], 456)
            self.assertEqual(rows[2]['issue'], 20201203)
            self.assertEqual(rows[2]['hospital_onset_covid'], 789)
    def test_acquire_dataset(self):
        """Acquire a new dataset."""

        # only mock out network calls to external hosts
        mock_network = MagicMock()
        mock_network.fetch_metadata.return_value = \
            self.test_utils.load_sample_metadata()
        mock_network.fetch_dataset.return_value = \
            self.test_utils.load_sample_dataset()

        # make sure the data does not yet exist
        with self.subTest(name='no data yet'):
            response = Epidata.covid_hosp('MA',
                                          Epidata.range(20200101, 20210101))
            self.assertEqual(response['result'], -2)

        # acquire sample data into local database
        with self.subTest(name='first acquisition'):
            acquired = Update.run(network=mock_network)
            self.assertTrue(acquired)

        # make sure the data now exists
        with self.subTest(name='initial data checks'):
            response = Epidata.covid_hosp('WY',
                                          Epidata.range(20200101, 20210101))
            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            row = response['epidata'][0]
            self.assertEqual(row['state'], 'WY')
            self.assertEqual(row['date'], 20200826)
            self.assertEqual(row['issue'], 20201116)
            self.assertEqual(row['critical_staffing_shortage_today_yes'], 2)
            actual = row['inpatient_bed_covid_utilization']
            expected = 0.011946591707659873
            self.assertAlmostEqual(actual, expected)
            self.assertIsNone(row['critical_staffing_shortage_today_no'])

            # expect 61 fields per row (63 database columns, except `id` and `record_type`)
            self.assertEqual(len(row), 61)

        # re-acquisition of the same dataset should be a no-op
        with self.subTest(name='second acquisition'):
            acquired = Update.run(network=mock_network)
            self.assertFalse(acquired)

        # make sure the data still exists
        with self.subTest(name='final data checks'):
            response = Epidata.covid_hosp('WY',
                                          Epidata.range(20200101, 20210101))
            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
예제 #6
0
    def test_acquire_dataset(self):
        """Acquire a new dataset."""

        # only mock out network calls to external hosts
        mock_network = MagicMock()
        mock_network.fetch_metadata.return_value = \
            self.test_utils.load_sample_metadata()
        mock_network.fetch_dataset.return_value = \
            self.test_utils.load_sample_dataset()

        # make sure the data does not yet exist
        with self.subTest(name='no data yet'):
            response = Epidata.covid_hosp('MA',
                                          Epidata.range(20200101, 20210101))
            self.assertEqual(response['result'], -2)

        # acquire sample data into local database
        with self.subTest(name='first acquisition'):
            acquired = Update.run(network_impl=mock_network)
            self.assertTrue(acquired)

        # make sure the data now exists
        with self.subTest(name='initial data checks'):
            response = Epidata.covid_hosp('MA',
                                          Epidata.range(20200101, 20210101))
            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            row = response['epidata'][0]
            self.assertEqual(row['state'], 'MA')
            self.assertEqual(row['date'], 20200510)
            self.assertEqual(row['issue'], 20201116)
            self.assertEqual(row['hospital_onset_covid'], 53)
            actual = row['inpatient_bed_covid_utilization']
            expected = 0.21056656682174496
            self.assertAlmostEqual(actual, expected)
            self.assertIsNone(row['adult_icu_bed_utilization'])

            # expect 55 fields per row (56 database columns, except `id`)
            self.assertEqual(len(row), 55)

        # re-acquisition of the same dataset should be a no-op
        with self.subTest(name='second acquisition'):
            acquired = Update.run(network_impl=mock_network)
            self.assertFalse(acquired)

        # make sure the data still exists
        with self.subTest(name='final data checks'):
            response = Epidata.covid_hosp('MA',
                                          Epidata.range(20200101, 20210101))
            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
예제 #7
0
  def test_acquire_specific_issue(self):
    """Acquire a new dataset."""

    # make sure the data does not yet exist
    with self.subTest(name='no data yet'):
      response = Epidata.covid_hosp('MA', Epidata.range(20200101, 20210101))
      self.assertEqual(response['result'], -2)

    # acquire sample data into local database
    # mock out network calls to external hosts
    with Database.connect() as db:
      pre_max_issue = db.get_max_issue()
    self.assertEqual(pre_max_issue, pd.Timestamp('1900-01-01 00:00:00'))
    with self.subTest(name='first acquisition'), \
         patch.object(Network, 'fetch_metadata', return_value=self.test_utils.load_sample_metadata()) as mock_fetch_meta, \
         patch.object(Network, 'fetch_dataset', side_effect=[self.test_utils.load_sample_dataset("dataset0.csv")]
                      ) as mock_fetch:
      acquired = Utils.update_dataset(Database,
                                      Network,
                                      date(2021, 3, 12),
                                      date(2021, 3, 14))
      with Database.connect() as db:
        post_max_issue = db.get_max_issue()
      self.assertEqual(post_max_issue, pd.Timestamp('2021-03-13 00:00:00'))
      self.assertTrue(acquired)
예제 #8
0
    def test_query_by_as_of(self):
        with Database.connect() as db:
            with db.new_cursor() as cur:
                self.insert_issue(cur, 20201101, 0, 'T')
                self.insert_issue(cur, 20201102, 1, 'D')
                self.insert_issue(cur, 20201103, 2, 'D')
                self.insert_issue(cur, 20201103, 3, 'T')
                self.insert_issue(cur, 20201104, 4, 'T')

        with self.subTest(name='as_of with multiple issues'):
            response = Epidata.covid_hosp('PA', 20201118, as_of=20201103)
            self.assertEqual(response['result'], 1)
            self.assertEqual(len(response['epidata']), 1)
            self.assertEqual(response['epidata'][0]['issue'], 20201103)
            self.assertEqual(
                response['epidata'][0]['critical_staffing_shortage_today_yes'],
                2)