def test_get_deps_unsupported_non_registry_dep(): package_lock_deps = { "@angular/animations": { "version": "8.2.14", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.14.tgz", "integrity": ("sha512-3Vc9TnNpKdtvKIXcWDFINSsnwgEMiDmLzjceWg1iYKwpeZGQahUXPoesLwQazBMmxJzQiA" "4HOMj0TTXKZ+Jzkg=="), "requires": { "tslib": "^1.9.0" }, }, "tslib": { "version": "file:tslib.tar.gz", "integrity": ("sha512-ZETBuz/jo9ivHHolRRfYZgK5Zd2F5KZ/Yk7iygP8y8YEFLe5ZHCVY5zJMHiP3WeA8M/yvPKN7" "XJpM03KH7FtPw=="), }, } expected = "The dependency tslib@file:tslib.tar.gz is hosted in an unsupported location" with pytest.raises(CachitoError, match=expected): npm._get_deps(package_lock_deps, set(), {})
def test_get_deps(package_lock_deps): name_to_deps, replacements = npm._get_deps(package_lock_deps, set()) assert name_to_deps == { "@angular-devkit/architect": [ { "bundled": False, "dev": True, "name": "@angular-devkit/architect", "type": "npm", "version": "0.803.26", "version_in_nexus": None, } ], "@angular/animations": [ { "bundled": False, "dev": False, "name": "@angular/animations", "type": "npm", "version": "8.2.14", "version_in_nexus": None, } ], "rxjs": [ { "bundled": False, "dev": True, "name": "rxjs", "type": "npm", "version": "6.4.0", "version_in_nexus": None, }, { "bundled": False, "dev": False, "name": "rxjs", "type": "npm", "version": "6.5.5", "version_in_nexus": None, }, ], "tslib": [ { "bundled": False, "dev": False, "name": "tslib", "type": "npm", "version": "1.11.1", "version_in_nexus": None, } ], } assert replacements == []
def test_get_deps_allowlisted_file_dep(): package_lock_deps = { "jsplumb": { "version": "file:jsplumb-2.10.2.tgz", "integrity": ("sha512-I6R70uG8HTBl4bDae8Tj4WpwRRS0RPLPDw/cZOqNFkk+qhQ241rLq8ynuC7dN4CKtihxybAvqv" "k+FrsLau3fOA=="), }, "rxjs": { "version": "6.5.5", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", "integrity": ("sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+Z" "xKH5bNghw9UeylGQ=="), "requires": { "tslib": "^1.9.0" }, }, } name_to_deps, replacements = npm._get_deps(package_lock_deps, {"jsplumb"}) assert name_to_deps == { "jsplumb": [{ "bundled": False, "dev": False, "name": "jsplumb", "type": "npm", "version": "file:jsplumb-2.10.2.tgz", "version_in_nexus": None, }], "rxjs": [ { "bundled": False, "dev": False, "name": "rxjs", "type": "npm", "version": "6.5.5", "version_in_nexus": None, }, ], } assert replacements == []
def test_get_deps_non_registry_dep(mock_ctnh, package_lock_deps): # Set the rxjs dependencies to be directly from GitHub package_lock_deps["@angular-devkit/architect"]["dependencies"]["rxjs"] = { "version": "github:ReactiveX/rxjs#dfa239d41b97504312fa95e13f4d593d95b49c4b", "from": "github:ReactiveX/rxjs#dfa239d41b97504312fa95e13f4d593d95b49c4b", "requires": { "tslib": "^1.9.0" }, } nexus_hosted_info = { "version": "6.5.5-external-gitcommit-dfa239d41b97504312fa95e13f4d593d95b49c4b", "resolved": ("https://nexus.domain.local/repository/cachito-js-hosted/rxjs/-/" "rxjs-6.5.5-external-gitcommit-dfa239d41b97504312fa95e13f4d593d95b49c4b.tgz" ), "integrity": ("sha512-vvAdzoVTdbr5Lq7BI2+l4R3dM4Mw7305wNKLgij8ru7sx3Fuo1W2XrsoTXWfPtIk+kxiBXxCoc8UX" "1Vb45kbRQ=="), "requires": { "tslib": "^1.9.0" }, } package_lock_deps["rxjs"] = { "version": "github:ReactiveX/rxjs#8cc6491771fcbf44984a419b7f26ff442a5d58f5", "from": "github:ReactiveX/rxjs#8cc6491771fcbf44984a419b7f26ff442a5d58f5", "requires": { "tslib": "^1.9.0" }, } nexus_hosted_info_two = { "version": "6.5.2-external-gitcommit-8cc6491771fcbf44984a419b7f26ff442a5d58f5", "resolved": ("https://nexus.domain.local/repository/cachito-js-hosted/rxjs/-/" "rxjs-6.5.2-external-gitcommit-8cc6491771fcbf44984a419b7f26ff442a5d58f5.tgz" ), "integrity": ("sha512-AvAdzoVTdVT5Lq7BI2+l5R3dM4Mw7305wNKLgij8rh7sx3Fuo1W2XrsoTXWfPtIk+kxiBXxCoc8UX" "1Vb45kbRP=="), "requires": { "tslib": "^1.9.0" }, } # Python 3 iterates through a dictionary in alphabetical order, so this order will always be # correct mock_ctnh.side_effect = [ copy.deepcopy(nexus_hosted_info), copy.deepcopy(nexus_hosted_info_two) ] name_to_deps, replacements = npm._get_deps(package_lock_deps, set()) assert name_to_deps == { "@angular-devkit/architect": [{ "bundled": False, "dev": True, "name": "@angular-devkit/architect", "type": "npm", "version": "0.803.26", "version_in_nexus": None, }], "@angular/animations": [{ "bundled": False, "dev": False, "name": "@angular/animations", "type": "npm", "version": "8.2.14", "version_in_nexus": None, }], "rxjs": [ { "bundled": False, "dev": False, "name": "rxjs", "type": "npm", "version": "github:ReactiveX/rxjs#dfa239d41b97504312fa95e13f4d593d95b49c4b", "version_in_nexus": ("6.5.5-external-gitcommit-dfa239d41b97504312fa95e13f4d593d95b49c4b" ), }, { "bundled": False, "dev": False, "name": "rxjs", "type": "npm", "version": "github:ReactiveX/rxjs#8cc6491771fcbf44984a419b7f26ff442a5d58f5", "version_in_nexus": ("6.5.2-external-gitcommit-8cc6491771fcbf44984a419b7f26ff442a5d58f5" ), }, ], "tslib": [{ "bundled": False, "dev": False, "name": "tslib", "type": "npm", "version": "1.11.1", "version_in_nexus": None, }], } # Verify that only the top level replacements are returned assert replacements == [ ("rxjs", "6.5.2-external-gitcommit-8cc6491771fcbf44984a419b7f26ff442a5d58f5") ] # Ensure the lock file was updated with the Nexus hosted dependency assert (package_lock_deps["@angular-devkit/architect"]["dependencies"] ["rxjs"] == nexus_hosted_info) assert package_lock_deps["rxjs"] == nexus_hosted_info_two assert package_lock_deps["@angular-devkit/architect"]["requires"] == { "@angular-devkit/core": "8.3.26", "rxjs": "6.5.5-external-gitcommit-dfa239d41b97504312fa95e13f4d593d95b49c4b", } assert mock_ctnh.call_count == 2