Skip to content

Commit 48750ca

Browse files
committed
Fix tests for import_runner
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 403414f commit 48750ca

1 file changed

Lines changed: 101 additions & 114 deletions

File tree

vulnerabilities/tests/test_import_runner.py

Lines changed: 101 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
from vulnerabilities.data_source import PackageURL
3131
from vulnerabilities.data_source import Reference
3232
from vulnerabilities.import_runner import ImportRunner
33-
3433
# from vulnerabilities.import_runner import _insert_vulnerabilities_and_references
3534

3635

3736
class 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
5656
class 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

7070
ADVISORIES = [
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

8890
def 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

99100
def 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

130131
def 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

162163
def 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

260259
def 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

301299
def 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

Comments
 (0)