1212import json
1313import os
1414from pathlib import Path
15- from unittest . mock import MagicMock
15+ from types import SimpleNamespace
1616from unittest .mock import patch
1717
1818from packageurl import PackageURL
@@ -80,31 +80,23 @@ def test_npm_improver(mock_response):
8080 util_tests .check_results_against_json (result , expected_file )
8181
8282
83- @patch ("requests.get" )
84- def test_package_first_mode_valid_npm_package (mock_get ):
85- mock_dir_response = MagicMock ()
86- mock_dir_response .status_code = 200
87- mock_dir_response .json .return_value = [
88- {
89- "type" : "file" ,
90- "name" : "152.json" ,
91- "download_url" : "https://raw.githubusercontent.com/nodejs/security-wg/main/vuln/npm/152.json" ,
92- }
93- ]
83+ def test_package_first_mode_valid_npm_package (tmp_path ):
84+ vuln_dir = tmp_path / "vuln" / "npm"
85+ vuln_dir .mkdir (parents = True )
9486
9587 npm_sample_file = os .path .join (TEST_DATA , "npm_sample.json" )
9688 with open (npm_sample_file ) as f :
9789 sample_data = json .load (f )
9890
99- mock_file_response = MagicMock ()
100- mock_file_response . json .return_value = sample_data
91+ advisory_file = vuln_dir / "152.json"
92+ advisory_file . write_text ( json .dumps ( sample_data ))
10193
102- mock_get . side_effect = [ mock_dir_response , mock_file_response ]
94+ mock_vcs_response = SimpleNamespace ( dest_dir = str ( tmp_path ), delete = lambda : None )
10395
10496 purl = PackageURL (type = "npm" , name = "npm" , version = "1.2.0" )
10597 pipeline = NpmImporterPipeline (purl = purl )
98+ pipeline .vcs_response = mock_vcs_response
10699
107- pipeline .fetch_package_advisories ()
108100 advisories = list (pipeline .collect_advisories ())
109101
110102 assert len (advisories ) == 1
@@ -113,91 +105,74 @@ def test_package_first_mode_valid_npm_package(mock_get):
113105 assert advisories [0 ].affected_packages [0 ].package .name == "npm"
114106
115107
116- @patch ("requests.get" )
117- def test_package_first_mode_unaffected_version (mock_get ):
118- mock_dir_response = MagicMock ()
119- mock_dir_response .status_code = 200
120- mock_dir_response .json .return_value = [
121- {
122- "type" : "file" ,
123- "name" : "152.json" ,
124- "download_url" : "https://raw.githubusercontent.com/nodejs/security-wg/main/vuln/npm/152.json" ,
125- }
126- ]
108+ def test_package_first_mode_unaffected_version (tmp_path ):
109+ vuln_dir = tmp_path / "vuln" / "npm"
110+ vuln_dir .mkdir (parents = True )
127111
128112 npm_sample_file = os .path .join (TEST_DATA , "npm_sample.json" )
129113 with open (npm_sample_file ) as f :
130114 sample_data = json .load (f )
131115
132- mock_file_response = MagicMock ()
133- mock_file_response . json .return_value = sample_data
116+ advisory_file = vuln_dir / "152.json"
117+ advisory_file . write_text ( json .dumps ( sample_data ))
134118
135- mock_get . side_effect = [ mock_dir_response , mock_file_response ]
119+ mock_vcs_response = SimpleNamespace ( dest_dir = str ( tmp_path ), delete = lambda : None )
136120
137121 purl = PackageURL (type = "npm" , name = "npm" , version = "1.4.0" )
138122 pipeline = NpmImporterPipeline (purl = purl )
123+ pipeline .vcs_response = mock_vcs_response
139124
140- pipeline .fetch_package_advisories ()
141125 advisories = list (pipeline .collect_advisories ())
142126
143127 assert len (advisories ) == 0
144128
145129
146- @patch ("requests.get" )
147- def test_package_first_mode_invalid_package_type (mock_get ):
130+ def test_package_first_mode_invalid_package_type (tmp_path ):
131+ vuln_dir = tmp_path / "vuln" / "npm"
132+ vuln_dir .mkdir (parents = True )
133+
134+ mock_vcs_response = SimpleNamespace (dest_dir = str (tmp_path ), delete = lambda : None )
135+
148136 purl = PackageURL (type = "pypi" , name = "django" , version = "3.0.0" )
149137 pipeline = NpmImporterPipeline (purl = purl )
138+ pipeline .vcs_response = mock_vcs_response
150139
151- pipeline .fetch_package_advisories ()
152140 advisories = list (pipeline .collect_advisories ())
153141
154142 assert len (advisories ) == 0
155- mock_get .assert_not_called ()
156-
157-
158- @patch ("requests.get" )
159- def test_package_first_mode_package_not_found (mock_get ):
160- mock_dir_response = MagicMock ()
161- mock_dir_response .status_code = 200
162- mock_dir_response .json .return_value = [
163- {
164- "type" : "file" ,
165- "name" : "152.json" ,
166- "download_url" : "https://raw.githubusercontent.com/nodejs/security-wg/main/vuln/npm/152.json" ,
167- }
168- ]
143+
144+
145+ def test_package_first_mode_package_not_found (tmp_path ):
146+ vuln_dir = tmp_path / "vuln" / "npm"
147+ vuln_dir .mkdir (parents = True )
169148
170149 npm_sample_file = os .path .join (TEST_DATA , "npm_sample.json" )
171150 with open (npm_sample_file ) as f :
172151 sample_data = json .load (f )
173152
174153 sample_data ["module_name" ] = "some-other-package"
175154
176- mock_file_response = MagicMock ()
177- mock_file_response . json .return_value = sample_data
155+ advisory_file = vuln_dir / "152.json"
156+ advisory_file . write_text ( json .dumps ( sample_data ))
178157
179- mock_get . side_effect = [ mock_dir_response , mock_file_response ]
158+ mock_vcs_response = SimpleNamespace ( dest_dir = str ( tmp_path ), delete = lambda : None )
180159
181160 purl = PackageURL (type = "npm" , name = "nonexistent-package" , version = "1.0.0" )
182161 pipeline = NpmImporterPipeline (purl = purl )
162+ pipeline .vcs_response = mock_vcs_response
183163
184- pipeline .fetch_package_advisories ()
185164 advisories = list (pipeline .collect_advisories ())
186165
187166 assert len (advisories ) == 0
188167
189168
190- @patch ("requests.get" )
191- def test_package_first_mode_api_error (mock_get ):
192- mock_error_response = MagicMock ()
193- mock_error_response .status_code = 404
194-
195- mock_get .return_value = mock_error_response
169+ def test_package_first_mode_missing_vuln_directory (tmp_path ):
170+ mock_vcs_response = SimpleNamespace (dest_dir = str (tmp_path ), delete = lambda : None )
196171
197172 purl = PackageURL (type = "npm" , name = "npm" , version = "1.0.0" )
198173 pipeline = NpmImporterPipeline (purl = purl )
174+ pipeline .vcs_response = mock_vcs_response
199175
200- pipeline .fetch_package_advisories ()
201176 advisories = list (pipeline .collect_advisories ())
202177
203178 assert len (advisories ) == 0
@@ -228,3 +203,9 @@ def test_version_is_affected():
228203 fixed_version = SemverVersion (string = "1.3.3" ),
229204 )
230205 assert pipeline ._version_is_affected (affected_package_no_range ) == True
206+ affected_package_no_range = AffectedPackage (
207+ package = PackageURL (type = "npm" , name = "npm" ),
208+ affected_version_range = None ,
209+ fixed_version = SemverVersion (string = "1.3.3" ),
210+ )
211+ assert pipeline ._version_is_affected (affected_package_no_range ) == True
0 commit comments