3030from vulnerabilities .data_source import PackageURL
3131from vulnerabilities .data_source import Reference
3232from vulnerabilities .import_runner import ImportRunner
33-
3433# from vulnerabilities.import_runner import _insert_vulnerabilities_and_references
3534
3635
3736class MockDataSource (DataSource ):
37+
3838 def __init__ (self , * args , ** kwargs ):
39- self .added_advs = kwargs .pop (" added_advs" , [])
40- self .updated_advs = kwargs .pop (" updated_advs" , [])
39+ self .added_advs = kwargs .pop (' added_advs' , [])
40+ self .updated_advs = kwargs .pop (' updated_advs' , [])
4141 super ().__init__ (* args , ** kwargs )
4242
4343 def added_advisories (self ):
@@ -48,16 +48,16 @@ def updated_advisories(self):
4848
4949 def _yield_advisories (self , advisories ):
5050 while advisories :
51- b , advisories = advisories [: self .batch_size ], advisories [self .batch_size :]
51+ b , advisories = advisories [:self .batch_size ], advisories [self .batch_size :]
5252 yield b
5353
5454
5555@dataclasses .dataclass
5656class MockImporter :
5757 data_source : MockDataSource
5858 last_run : datetime = None
59- name : str = " mock_importer"
60- license : str = " license to test"
59+ name : str = ' mock_importer'
60+ license : str = ' license to test'
6161 saved : bool = False
6262
6363 def make_data_source (self , * _ , ** __ ):
@@ -69,45 +69,46 @@ def save(self):
6969
7070ADVISORIES = [
7171 Advisory (
72- identifier = "MOCK-CVE-2020-1337" ,
73- summary = "vulnerability description here" ,
74- vuln_references = [Reference (url = "https://example.com/with/more/info/MOCK-CVE-2020-1337" )],
75- impacted_package_urls = [PackageURL (name = "mock-webserver" , type = "pypi" , version = "1.2.33" )],
76- resolved_package_urls = [PackageURL (name = "mock-webserver" , type = "pypi" , version = "1.2.34" )],
77- ),
78- Advisory (
79- identifier = "" ,
80- summary = "vulnerability description here" ,
81- vuln_references = [Reference (url = "https://example.com/with/more/info/MOCK-VC" )],
82- impacted_package_urls = [PackageURL (name = "type" , type = "pypi" , version = "1.2.33" )],
83- resolved_package_urls = [PackageURL (name = "metaclass" , type = "pypi" , version = "1.2.34" )],
84- ),
85- ]
72+ identifier = 'MOCK-CVE-2020-1337' ,
73+ summary = 'vulnerability description here' ,
74+ vuln_references = [
75+ Reference (
76+ url = 'https://example.com/with/more/info/MOCK-CVE-2020-1337' )],
77+ impacted_package_urls = [
78+ PackageURL (
79+ name = 'mock-webserver' ,
80+ type = 'pypi' ,
81+ version = '1.2.33' )],
82+ resolved_package_urls = [
83+ PackageURL (
84+ name = 'mock-webserver' ,
85+ type = 'pypi' ,
86+ version = '1.2.34' )],
87+ )]
8688
8789
8890def make_import_runner (added_advs = None , updated_advs = None ):
8991 added_advs = added_advs or []
9092 updated_advs = updated_advs or []
9193
9294 importer = MockImporter (
93- data_source = MockDataSource (2 , added_advs = added_advs , updated_advs = updated_advs )
94- )
95+ data_source = MockDataSource (2 , added_advs = added_advs , updated_advs = updated_advs ))
9596
9697 return ImportRunner (importer , 5 )
9798
9899
99100def test_ImportRunner_new_package_and_new_vulnerability (db ):
100101 runner = make_import_runner (added_advs = ADVISORIES )
101102
102- runner .run (create_vulcodes = False )
103+ runner .run ()
103104
104105 assert runner .importer .last_run is not None
105106 assert runner .importer .saved
106107
107108 assert models .Package .objects .all ().count () == 2
108- packages = models .Package .objects .filter (name = " mock-webserver" )
109+ packages = models .Package .objects .filter (name = ' mock-webserver' )
109110
110- if packages [0 ].version == " 1.2.33" :
111+ if packages [0 ].version == ' 1.2.33' :
111112 impacted_package , resolved_package = packages [0 ], packages [1 ]
112113 else :
113114 impacted_package , resolved_package = packages [1 ], packages [0 ]
@@ -120,24 +121,24 @@ def test_ImportRunner_new_package_and_new_vulnerability(db):
120121 assert resolved_package .vulnerabilities .count () == 1
121122
122123 vuln = impacted_package .vulnerabilities .first ()
123- assert vuln .identifier == " MOCK-CVE-2020-1337"
124+ assert vuln .identifier == ' MOCK-CVE-2020-1337'
124125
125126 vuln_refs = models .VulnerabilityReference .objects .filter (vulnerability = vuln )
126127 assert vuln_refs .count () == 1
127- assert vuln_refs [0 ].url == " https://example.com/with/more/info/MOCK-CVE-2020-1337"
128+ assert vuln_refs [0 ].url == ' https://example.com/with/more/info/MOCK-CVE-2020-1337'
128129
129130
130131def test_ImportRunner_existing_package_and_new_vulnerability (db ):
131132 """
132133 Both versions of the package mentioned in the imported advisory are already in the database.
133134 Only the vulnerability itself is new.
134135 """
135- models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.33" )
136- models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.34" )
136+ models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.33' )
137+ models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.34' )
137138
138139 runner = make_import_runner (added_advs = ADVISORIES )
139140
140- runner .run (create_vulcodes = False )
141+ runner .run ()
141142
142143 assert runner .importer .last_run is not None
143144 assert runner .importer .saved
@@ -148,15 +149,15 @@ def test_ImportRunner_existing_package_and_new_vulnerability(db):
148149 assert models .PackageRelatedVulnerability .objects .count () == 2
149150
150151 resolved_package = models .PackageRelatedVulnerability .objects .filter (is_vulnerable = False )[0 ]
151- assert resolved_package .package .version == " 1.2.34"
152+ assert resolved_package .package .version == ' 1.2.34'
152153
153154 impacted_package = models .PackageRelatedVulnerability .objects .filter (is_vulnerable = True )[0 ]
154155 vuln = impacted_package .vulnerability
155- assert vuln .identifier == " MOCK-CVE-2020-1337"
156+ assert vuln .identifier == ' MOCK-CVE-2020-1337'
156157
157158 vuln_refs = models .VulnerabilityReference .objects .filter (vulnerability = vuln )
158159 assert vuln_refs .count () == 1
159- assert vuln_refs [0 ].url == " https://example.com/with/more/info/MOCK-CVE-2020-1337"
160+ assert vuln_refs [0 ].url == ' https://example.com/with/more/info/MOCK-CVE-2020-1337'
160161
161162
162163def test_ImportRunner_new_package_version_affected_by_existing_vulnerability (db ):
@@ -165,30 +166,29 @@ def test_ImportRunner_new_package_version_affected_by_existing_vulnerability(db)
165166 vulnerability that also already existed in the database.
166167 """
167168 vuln = models .Vulnerability .objects .create (
168- identifier = "MOCK-CVE-2020-1337" , summary = "vulnerability description here"
169- )
169+ identifier = 'MOCK-CVE-2020-1337' , summary = 'vulnerability description here' )
170170
171171 models .VulnerabilityReference .objects .create (
172- vulnerability = vuln , url = "https://example.com/with/more/info/MOCK-CVE-2020-1337"
172+ vulnerability = vuln ,
173+ url = 'https://example.com/with/more/info/MOCK-CVE-2020-1337'
173174 )
174175 models .PackageRelatedVulnerability .objects .create (
175176 vulnerability = vuln ,
176- package = models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.33" ),
177- is_vulnerable = True ,
177+ package = models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.33' ),
178+ is_vulnerable = True
178179 )
179180 models .PackageRelatedVulnerability .objects .create (
180181 vulnerability = vuln ,
181- package = models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.34" ),
182- is_vulnerable = False ,
182+ package = models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.34' ),
183+ is_vulnerable = False
183184 )
184185
185186 advisories = deepcopy (ADVISORIES )
186187 advisories [0 ].impacted_package_urls .append (
187- PackageURL (name = "mock-webserver" , type = "pypi" , version = "1.2.33a" )
188- )
188+ PackageURL (name = 'mock-webserver' , type = 'pypi' , version = '1.2.33a' ))
189189 runner = make_import_runner (updated_advs = advisories )
190190
191- runner .run (create_vulcodes = False )
191+ runner .run ()
192192
193193 assert runner .importer .last_run is not None
194194 assert runner .importer .saved
@@ -198,16 +198,15 @@ def test_ImportRunner_new_package_version_affected_by_existing_vulnerability(db)
198198 assert models .VulnerabilityReference .objects .count () == 1
199199 assert models .PackageRelatedVulnerability .objects .count () == 3
200200
201- qs = models .Package .objects .filter (name = " mock-webserver" , version = " 1.2.33a" )
201+ qs = models .Package .objects .filter (name = ' mock-webserver' , version = ' 1.2.33a' )
202202 assert len (qs ) == 1
203203 added_package = qs [0 ]
204204
205205 qs = models .PackageRelatedVulnerability .objects .filter (
206- package = added_package , is_vulnerable = True
207- )
206+ package = added_package , is_vulnerable = True )
208207 assert len (qs ) == 1
209208 impacted_package = qs [0 ]
210- assert impacted_package .vulnerability .identifier == " MOCK-CVE-2020-1337"
209+ assert impacted_package .vulnerability .identifier == ' MOCK-CVE-2020-1337'
211210
212211
213212# def test_ImportRunner_assumed_fixed_package_is_updated_as_impacted(db):
@@ -216,67 +215,67 @@ def test_ImportRunner_new_package_version_affected_by_existing_vulnerability(db)
216215# still be affected by a vulnerability that also already existed in the database (i.e. the
217216# previously stored data was corrected).
218217# """
219- # FIXME This case is not supported due to cascading deletes. When the ResolvedPackage is
220- # FIXME deleted, the referenced Package and Vulnerability are also deleted.
221- #
222- # vuln = models.Vulnerability.objects.create(
223- # identifier='MOCK-CVE-2020-1337', summary='vulnerability description here')
224- #
225- # models.VulnerabilityReference.objects.create(
226- # vulnerability=vuln,
227- # url='https://example.com/with/more/info/MOCK-CVE-2020-1337'
228- # )
229- #
230- # misclassified_package = models.Package.objects.create(
231- # name='mock-webserver', type='pypi', version='1.2.33')
232- #
233- # models.ResolvedPackage.objects.create(
234- # vulnerability=vuln,
235- # package=misclassified_package,
236- # )
237- # models.ResolvedPackage.objects.create(
238- # vulnerability=vuln,
239- # package=models.Package.objects.create(
240- # name='mock-webserver', type='pypi', version='1.2.34'),
241- # )
242- #
243- # runner = make_import_runner(updated_advs=ADVISORIES)
244- #
245- # runner.run()
246- #
247- # assert runner.importer.last_run is not None
248- # assert runner.importer.saved
249- #
250- # assert models.Package.objects.all().count() == 2
251- # assert models.Vulnerability.objects.count() == 1
252- # assert models.VulnerabilityReference.objects.count() == 1
253- # assert models.ImpactedPackage.objects.count() == 2
254- # assert models.ResolvedPackage.objects.count() == 0
255- #
256- # assert models.ImpactedPackage.objects.filter(package=misclassified_package).count() == 1
257- # assert models.ResolvedPackage.objects.filter(package=misclassified_package).count() == 0
218+ # FIXME This case is not supported due to cascading deletes. When the ResolvedPackage is
219+ # FIXME deleted, the referenced Package and Vulnerability are also deleted.
220+ #
221+ # vuln = models.Vulnerability.objects.create(
222+ # identifier='MOCK-CVE-2020-1337', summary='vulnerability description here')
223+ #
224+ # models.VulnerabilityReference.objects.create(
225+ # vulnerability=vuln,
226+ # url='https://example.com/with/more/info/MOCK-CVE-2020-1337'
227+ # )
228+ #
229+ # misclassified_package = models.Package.objects.create(
230+ # name='mock-webserver', type='pypi', version='1.2.33')
231+ #
232+ # models.ResolvedPackage.objects.create(
233+ # vulnerability=vuln,
234+ # package=misclassified_package,
235+ # )
236+ # models.ResolvedPackage.objects.create(
237+ # vulnerability=vuln,
238+ # package=models.Package.objects.create(
239+ # name='mock-webserver', type='pypi', version='1.2.34'),
240+ # )
241+ #
242+ # runner = make_import_runner(updated_advs=ADVISORIES)
243+ #
244+ # runner.run()
245+ #
246+ # assert runner.importer.last_run is not None
247+ # assert runner.importer.saved
248+ #
249+ # assert models.Package.objects.all().count() == 2
250+ # assert models.Vulnerability.objects.count() == 1
251+ # assert models.VulnerabilityReference.objects.count() == 1
252+ # assert models.ImpactedPackage.objects.count() == 2
253+ # assert models.ResolvedPackage.objects.count() == 0
254+ #
255+ # assert models.ImpactedPackage.objects.filter(package=misclassified_package).count() == 1
256+ # assert models.ResolvedPackage.objects.filter(package=misclassified_package).count() == 0
258257
259258
260259def test_ImportRunner_fixed_package_version_is_added (db ):
261260 """
262261 A new version of a package was published that fixes a previously unresolved vulnerability.
263262 """
264263 vuln = models .Vulnerability .objects .create (
265- identifier = "MOCK-CVE-2020-1337" , summary = "vulnerability description here"
266- )
264+ identifier = 'MOCK-CVE-2020-1337' , summary = 'vulnerability description here' )
267265
268266 models .VulnerabilityReference .objects .create (
269- vulnerability = vuln , url = "https://example.com/with/more/info/MOCK-CVE-2020-1337"
267+ vulnerability = vuln ,
268+ url = 'https://example.com/with/more/info/MOCK-CVE-2020-1337'
270269 )
271270 models .PackageRelatedVulnerability .objects .create (
272271 vulnerability = vuln ,
273- package = models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.33" ),
272+ package = models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.33' ),
274273 is_vulnerable = True ,
275274 )
276275
277276 runner = make_import_runner (updated_advs = ADVISORIES )
278277
279- runner .run (create_vulcodes = False )
278+ runner .run ()
280279
281280 assert runner .importer .last_run is not None
282281 assert runner .importer .saved
@@ -286,16 +285,15 @@ def test_ImportRunner_fixed_package_version_is_added(db):
286285 assert models .VulnerabilityReference .objects .count () == 1
287286 assert models .PackageRelatedVulnerability .objects .count () == 2
288287
289- qs = models .Package .objects .filter (name = " mock-webserver" , version = " 1.2.34" )
288+ qs = models .Package .objects .filter (name = ' mock-webserver' , version = ' 1.2.34' )
290289 assert len (qs ) == 1
291290 added_package = qs [0 ]
292291
293292 qs = models .PackageRelatedVulnerability .objects .filter (
294- package = added_package , is_vulnerable = False
295- )
293+ package = added_package , is_vulnerable = False )
296294 assert len (qs ) == 1
297295 resolved_package = qs [0 ]
298- assert resolved_package .vulnerability .identifier == " MOCK-CVE-2020-1337"
296+ assert resolved_package .vulnerability .identifier == ' MOCK-CVE-2020-1337'
299297
300298
301299def test_ImportRunner_updated_vulnerability (db ):
@@ -304,23 +302,22 @@ def test_ImportRunner_updated_vulnerability(db):
304302 reference.
305303 """
306304 vuln = models .Vulnerability .objects .create (
307- identifier = "MOCK-CVE-2020-1337" , summary = "temporary description"
308- )
305+ identifier = 'MOCK-CVE-2020-1337' , summary = 'temporary description' )
309306
310307 models .PackageRelatedVulnerability .objects .create (
311308 vulnerability = vuln ,
312- package = models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.33" ),
313- is_vulnerable = True ,
309+ package = models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.33' ),
310+ is_vulnerable = True
314311 )
315312 models .PackageRelatedVulnerability .objects .create (
316313 vulnerability = vuln ,
317- package = models .Package .objects .create (name = " mock-webserver" , type = " pypi" , version = " 1.2.34" ),
318- is_vulnerable = False ,
314+ package = models .Package .objects .create (name = ' mock-webserver' , type = ' pypi' , version = ' 1.2.34' ),
315+ is_vulnerable = False
319316 )
320317
321318 runner = make_import_runner (updated_advs = ADVISORIES )
322319
323- runner .run (create_vulcodes = False )
320+ runner .run ()
324321
325322 assert runner .importer .last_run is not None
326323 assert runner .importer .saved
@@ -329,18 +326,8 @@ def test_ImportRunner_updated_vulnerability(db):
329326 assert models .PackageRelatedVulnerability .objects .count () == 2
330327
331328 vuln = models .Vulnerability .objects .first ()
332- assert vuln .summary == " vulnerability description here"
329+ assert vuln .summary == ' vulnerability description here'
333330
334331 vuln_refs = models .VulnerabilityReference .objects .filter (vulnerability = vuln )
335332 assert vuln_refs .count () == 1
336- assert vuln_refs [0 ].url == "https://example.com/with/more/info/MOCK-CVE-2020-1337"
337-
338-
339- def test_ImportRunner_create_vulcodes (db ):
340-
341- runner = make_import_runner (updated_advs = ADVISORIES )
342- runner .run (create_vulcodes = True )
343-
344- assert models .Package .objects .all ().count () == 4
345- assert models .PackageRelatedVulnerability .objects .count () == 4
346- assert models .Vulnerability .objects .filter (identifier__startswith = "VULCOID" ).count () == 1
333+ assert vuln_refs [0 ].url == 'https://example.com/with/more/info/MOCK-CVE-2020-1337'
0 commit comments