Skip to content

Commit ff20951

Browse files
committed
Refine the code and add unit tests
Signed-off-by: tdruez <[email protected]>
1 parent d7c00e7 commit ff20951

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

scanpipe/management/commands/check-compliance.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,38 @@ def check_compliance(self, fail_level):
8282
self.stderr.write(f" > {severity.upper()}: {len(entries)}")
8383
if self.verbosity > 1:
8484
self.stderr.write(" " + "\n ".join(entries))
85+
8586
return count > 0
8687

8788
def check_vulnerabilities(self):
88-
packages = self.project.discoveredpackages.vulnerable()
89-
dependencies = self.project.discovereddependencies.vulnerable()
90-
vulnerable_records = list(packages) + list(dependencies)
89+
# TODO: Remove duplication with scanpipe.pipes.output.add_vulnerabilities_sheet
90+
vulnerable_packages_queryset = (
91+
self.project.discoveredpackages.vulnerable()
92+
.only_package_url_fields(extra=["affected_by_vulnerabilities"])
93+
.order_by_package_url()
94+
)
95+
vulnerable_dependencies_queryset = (
96+
self.project.discovereddependencies.vulnerable()
97+
.only_package_url_fields(extra=["affected_by_vulnerabilities"])
98+
.order_by_package_url()
99+
)
100+
101+
vulnerable_records = list(vulnerable_packages_queryset) + list(
102+
vulnerable_dependencies_queryset
103+
)
91104
count = len(vulnerable_records)
92105

93106
if self.verbosity > 0:
94107
if count:
95108
self.stderr.write(f"{count} vulnerable records found:")
96109
for entry in vulnerable_records:
97110
self.stderr.write(str(entry))
111+
vulnerability_ids = [
112+
vulnerability.get("vulnerability_id")
113+
for vulnerability in entry.affected_by_vulnerabilities
114+
]
115+
self.stderr.write(" > " + ", ".join(vulnerability_ids))
98116
else:
99117
self.stdout.write("No vulnerabilities found")
118+
100119
return count > 0

scanpipe/tests/test_commands.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,32 @@ def test_scanpipe_management_command_check_compliance(self):
12121212
)
12131213
self.assertEqual(expected, out_value)
12141214

1215+
def test_scanpipe_management_command_check_compliance_vulnerabilities(self):
1216+
project = make_project(name="my_project")
1217+
package1 = make_package(project, package_url="pkg:generic/[email protected]")
1218+
1219+
out = StringIO()
1220+
options = ["--project", project.name, "--fail-on-vulnerabilities"]
1221+
with self.assertRaises(SystemExit) as cm:
1222+
call_command("check-compliance", *options, stdout=out)
1223+
self.assertEqual(cm.exception.code, 0)
1224+
out_value = out.getvalue().strip()
1225+
self.assertEqual("No vulnerabilities found", out_value)
1226+
1227+
package1.update(
1228+
affected_by_vulnerabilities=[{"vulnerability_id": "VCID-cah8-awtr-aaad"}]
1229+
)
1230+
out = StringIO()
1231+
options = ["--project", project.name, "--fail-on-vulnerabilities"]
1232+
with self.assertRaises(SystemExit) as cm:
1233+
call_command("check-compliance", *options, stderr=out)
1234+
self.assertEqual(cm.exception.code, 1)
1235+
out_value = out.getvalue().strip()
1236+
expected = (
1237+
"1 vulnerable records found:\npkg:generic/[email protected]\n > VCID-cah8-awtr-aaad"
1238+
)
1239+
self.assertEqual(expected, out_value)
1240+
12151241
def test_scanpipe_management_command_report(self):
12161242
label1 = "label1"
12171243
project1 = make_project("project1", labels=[label1])

0 commit comments

Comments
 (0)