From 39092dc437fe92251e1512cac25478fad929e0aa Mon Sep 17 00:00:00 2001 From: Brook Elgie Date: Tue, 16 May 2017 08:39:40 +0100 Subject: [PATCH] [#23] Add test for an empty latest-project-entries resource --- .../processors/add_npm_resource.py | 4 - tests/test_npm_processor.py | 93 ++++++++++++++++++- 2 files changed, 91 insertions(+), 6 deletions(-) diff --git a/datapackage_pipelines_measure/processors/add_npm_resource.py b/datapackage_pipelines_measure/processors/add_npm_resource.py index 19d17c7..3303e59 100644 --- a/datapackage_pipelines_measure/processors/add_npm_resource.py +++ b/datapackage_pipelines_measure/processors/add_npm_resource.py @@ -6,8 +6,6 @@ from datapackage_pipelines.generators import slugify from datapackage_pipelines.wrapper import ingest, spew -# from datapackage_pipelines_measure.config import settings - import logging log = logging.getLogger(__name__) @@ -163,9 +161,7 @@ def get_latest_date(first): return latest_date, iter(my_rows) if len(datapackage['resources']): - log.debug('there is a resource') if datapackage['resources'][0]['name'] == 'latest-project-entries': - log.debug('with the right name') latest_date, latest_iter = get_latest_date(next(res_iter)) yield latest_iter else: diff --git a/tests/test_npm_processor.py b/tests/test_npm_processor.py index 1291262..5ecaa9c 100644 --- a/tests/test_npm_processor.py +++ b/tests/test_npm_processor.py @@ -97,6 +97,95 @@ def test_add_npm_resource_processor_no_latest(self, mock_request): assert rows[3]['date'] == \ datetime.date.today() - datetime.timedelta(days=1) + @requests_mock.mock() + def test_add_npm_resource_processor_empty_latest(self, mock_request): + '''latest-project-entries is present, but empty.''' + + day_range = 5 + now = datetime.datetime.now() + # package created five days ago + created = now - datetime.timedelta(days=day_range) + created = created.strftime("%Y-%m-%d") + mock_registry = { + 'time': { + 'created': created + } + } + mock_api_responses = [] + for day in reversed(range(1, day_range)): + start = now - datetime.timedelta(days=day) + start = start.strftime("%Y-%m-%d") + mock_api_responses.append({ + 'json': { + 'downloads': day, + 'start': start, + 'end': start, + 'package': 'my_package' + }, + 'status_code': 200 + }) + mock_request.get('https://registry.npmjs.org/my_package', + json=mock_registry) + matcher = re.compile('api.npmjs.org/downloads/point/') + mock_request.get(matcher, mock_api_responses) + + # input arguments used by our mock `ingest` + datapackage = { + 'name': 'my-datapackage', + 'project': 'my-project', + 'resources': [{ + 'name': 'latest-project-entries', + 'schema': { + 'fields': [ + {'name': 'date', 'type': 'date'}, + {'name': 'downloads', 'type': 'int'}, + {'name': 'package', 'type': 'string'}, + {'name': 'source', 'type': 'string'}, + ] + } + }] + } + params = { + 'name': 'hello', + 'package': 'my_package', + 'project_id': 'my-project' + } + + # Path to the processor we want to test + processor_dir = \ + os.path.dirname(datapackage_pipelines_measure.processors.__file__) + processor_path = os.path.join(processor_dir, 'add_npm_resource.py') + + # Trigger the processor with our mock `ingest` and capture what it will + # returned to `spew`. + spew_args, _ = \ + mock_processor_test(processor_path, + (params, datapackage, iter([{}]))) + + # spew_dp = spew_args[0] + spew_res_iter = spew_args[1] + + # two resources + resources = list(spew_res_iter) + assert len(resources) == 2 + + # No rows in first resource + assert len(list(resources[0])) == 0 + + # rows in second resource + rows = list(resources)[1] + assert len(rows) == 4 + # row asserts + assert rows[0] == { + 'date': datetime.date.today() - datetime.timedelta(days=4), + 'downloads': 4, + 'package': 'my_package', + 'source': 'npm' + } + assert rows[3]['downloads'] == 1 + assert rows[3]['date'] == \ + datetime.date.today() - datetime.timedelta(days=1) + @requests_mock.mock() def test_add_npm_resource_processor_week_old_latest(self, mock_request): '''Latest in db for package is a week old, so fetch info from registry, @@ -143,7 +232,7 @@ def test_add_npm_resource_processor_week_old_latest(self, mock_request): {'name': 'source', 'type': 'string'}, ] } - }] # nothing here + }] } params = { 'name': 'hello', @@ -225,7 +314,7 @@ def test_add_npm_resource_processor_latest_is_today(self, mock_request): {'name': 'source', 'type': 'string'}, ] } - }] # nothing here + }] } params = { 'name': 'hello',