diff --git a/swh/loader/npm/client.py b/swh/loader/npm/client.py --- a/swh/loader/npm/client.py +++ b/swh/loader/npm/client.py @@ -56,7 +56,10 @@ Returns: str: the last releases package version """ - return self.package_metadata['dist-tags']['latest'] + latest = '' + if 'latest' in self.package_metadata['dist-tags']: + latest = self.package_metadata['dist-tags']['latest'] + return latest def package_versions(self, known_versions=None): """ diff --git a/swh/loader/npm/tests/common.py b/swh/loader/npm/tests/common.py --- a/swh/loader/npm/tests/common.py +++ b/swh/loader/npm/tests/common.py @@ -9,10 +9,15 @@ RESOURCES_PATH = os.path.join(os.path.dirname(__file__), 'resources') +empty_package = '22u-validators' +empty_package_url = 'https://www.npmjs.com/package/%s' % empty_package +empty_package_metadata_url = 'https://replicate.npmjs.com/%s/' % empty_package + package = 'org' package_url = 'https://www.npmjs.com/package/%s' % package package_metadata_url = 'https://replicate.npmjs.com/%s/' % package +EMPTY_PACKAGE_METADATA_JSON_FILENAME = '22u-validators.json' FIRST_VISIT_PACKAGE_METADATA_JSON_FILENAME = 'org_metadata_visit1.json' SECOND_VISIT_PACKAGE_METADATA_JSON_FILENAME = 'org_metadata_visit2.json' @@ -27,12 +32,12 @@ return self.file_data -def init_test_data(m, package_metadata_json_file): +def init_test_data(m, package_metadata_json_file, package_metadata_url): - org_metadata_filepath = os.path.join(RESOURCES_PATH, - package_metadata_json_file) + package_metadata_filepath = os.path.join(RESOURCES_PATH, + package_metadata_json_file) - with open(org_metadata_filepath) as json_file: + with open(package_metadata_filepath) as json_file: package_metadata = json.load(json_file) m.register_uri('GET', package_metadata_url, json=package_metadata) diff --git a/swh/loader/npm/tests/resources/22u-validators.json b/swh/loader/npm/tests/resources/22u-validators.json new file mode 100644 --- /dev/null +++ b/swh/loader/npm/tests/resources/22u-validators.json @@ -0,0 +1,20 @@ +{ + "_id": "22u-validators", + "_rev": "1-4853f78ded9c4fbcfe4c097ee96a4589", + "name": "22u-validators", + "time": { + "modified": "2017-06-07T01:30:36.011Z", + "created": "2015-07-19T13:07:40.046Z", + "0.1.0": "2015-07-19T13:07:40.046Z" + }, + "maintainers": [ + { + "email": "nich.curtis@22u.io", + "name": "22u.io" + } + ], + "dist-tags": {}, + "versions": {}, + "readme": "", + "readmeFilename": "" +} \ No newline at end of file diff --git a/swh/loader/npm/tests/test_client.py b/swh/loader/npm/tests/test_client.py --- a/swh/loader/npm/tests/test_client.py +++ b/swh/loader/npm/tests/test_client.py @@ -28,7 +28,8 @@ class TestNpmClient(unittest.TestCase): def test_fetch_package_metadata(self, m): - package_metadata = init_test_data(m, PACKAGE_METADATA_JSON_FILENAME) + package_metadata = init_test_data(m, PACKAGE_METADATA_JSON_FILENAME, + package_metadata_url) with tempfile.TemporaryDirectory() as tempdir: npm_client = NpmClient(tempdir) npm_client.fetch_package_metadata(package_metadata_url) @@ -36,7 +37,8 @@ self.assertEqual(npm_client.package, package) def test_package_versions(self, m): - package_metadata = init_test_data(m, PACKAGE_METADATA_JSON_FILENAME) + package_metadata = init_test_data(m, PACKAGE_METADATA_JSON_FILENAME, + package_metadata_url) with tempfile.TemporaryDirectory() as tempdir: npm_client = NpmClient(tempdir) npm_client.fetch_package_metadata(package_metadata_url) @@ -47,7 +49,8 @@ get_package_versions_data(package_metadata)) def test_prepare_package_versions(self, m): - package_metadata = init_test_data(m, PACKAGE_METADATA_JSON_FILENAME) + package_metadata = init_test_data(m, PACKAGE_METADATA_JSON_FILENAME, + package_metadata_url) package_versions_data = get_package_versions_data(package_metadata) with tempfile.TemporaryDirectory() as tempdir: npm_client = NpmClient(tempdir) diff --git a/swh/loader/npm/tests/test_loader.py b/swh/loader/npm/tests/test_loader.py --- a/swh/loader/npm/tests/test_loader.py +++ b/swh/loader/npm/tests/test_loader.py @@ -10,9 +10,12 @@ from swh.loader.core.tests import BaseLoaderStorageTest from swh.loader.npm.loader import NpmLoader +from swh.model.identifiers import snapshot_identifier from .common import ( + empty_package, empty_package_url, empty_package_metadata_url, package, package_url, package_metadata_url, init_test_data, + EMPTY_PACKAGE_METADATA_JSON_FILENAME, FIRST_VISIT_PACKAGE_METADATA_JSON_FILENAME, SECOND_VISIT_PACKAGE_METADATA_JSON_FILENAME, ) @@ -199,6 +202,10 @@ @classmethod def setUpClass(cls): + cls.reset_loader() + + @classmethod + def reset_loader(cls): cls.loader = NpmLoaderTest() cls.storage = cls.loader.storage @@ -206,9 +213,35 @@ counters_reset = dict.fromkeys(self.loader.counters.keys(), 0) self.loader.counters.update(counters_reset) + def test_npm_loader_empty_package(self, m): + + init_test_data(m, EMPTY_PACKAGE_METADATA_JSON_FILENAME, + empty_package_metadata_url) + self.loader.load(empty_package, empty_package_url, + empty_package_metadata_url) + + self.assertCountContents(0) + self.assertCountDirectories(0) + self.assertCountRevisions(0) + self.assertCountReleases(0) + self.assertCountSnapshots(1) + + expected_branches = {} + + self.assertSnapshotEqual( + snapshot_identifier({'branches': expected_branches}), + expected_branches + ) + + self.assertEqual(self.loader.load_status(), {'status': 'uneventful'}) + self.assertEqual(self.loader.visit_status(), 'full') + self.assertFalse(os.path.exists(self.loader.temp_directory)) + def test_npm_loader_first_visit(self, m): - init_test_data(m, FIRST_VISIT_PACKAGE_METADATA_JSON_FILENAME) + self.reset_loader() + init_test_data(m, FIRST_VISIT_PACKAGE_METADATA_JSON_FILENAME, + package_metadata_url) self.loader.load(package, package_url, package_metadata_url) self.assertCountContents(len(_expected_new_contents_first_visit)) @@ -239,7 +272,8 @@ self.reset_loader_counters() - init_test_data(m, FIRST_VISIT_PACKAGE_METADATA_JSON_FILENAME) + init_test_data(m, FIRST_VISIT_PACKAGE_METADATA_JSON_FILENAME, + package_metadata_url) self.loader.load(package, package_url, package_metadata_url) # previously loaded objects should still be here @@ -263,7 +297,8 @@ self.reset_loader_counters() - init_test_data(m, SECOND_VISIT_PACKAGE_METADATA_JSON_FILENAME) + init_test_data(m, SECOND_VISIT_PACKAGE_METADATA_JSON_FILENAME, + package_metadata_url) self.loader.load(package, package_url, package_metadata_url) expected_nb_contents = sum([len(_expected_new_contents_first_visit),