Skip to content

Commit d45fa7b

Browse files
feat: add VulnScanOutput data model with comprehensive test coverage
- Add VulnScanOutput class with structured vulnerability scan results - Include core scan fields: scan_success, return_code, scan_results_file_path - Add performance/timing data: scan_time, results_file_size - Include vulnerability counts by severity: critical, high, medium, low, other - Add structured error handling with error_message field
1 parent 12fc89f commit d45fa7b

File tree

2 files changed

+142
-1
lines changed

2 files changed

+142
-1
lines changed

entrypoint/entrypoint/data_model.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,45 @@ def __init__(self,
118118
self.generation_time = generation_time
119119
self.file_size = file_size
120120
self.error_message = error_message
121+
122+
123+
class VulnScanOutput:
124+
def __init__(self,
125+
# Core scan results
126+
scan_success=False,
127+
return_code=None,
128+
scan_results_file_path=None,
129+
130+
# Performance/timing data
131+
scan_time=None,
132+
results_file_size=None,
133+
134+
# Vulnerability counts
135+
total_vulnerabilities=None,
136+
critical_count=None,
137+
high_count=None,
138+
medium_count=None,
139+
low_count=None,
140+
other_count=None,
141+
142+
# Error handling
143+
error_message=None):
144+
# Core scan results
145+
self.scan_success = scan_success
146+
self.return_code = return_code
147+
self.scan_results_file_path = scan_results_file_path
148+
149+
# Performance/timing data
150+
self.scan_time = scan_time
151+
self.results_file_size = results_file_size
152+
153+
# Vulnerability counts
154+
self.total_vulnerabilities = total_vulnerabilities
155+
self.critical_count = critical_count
156+
self.high_count = high_count
157+
self.medium_count = medium_count
158+
self.low_count = low_count
159+
self.other_count = other_count
160+
161+
# Error handling
162+
self.error_message = error_message

entrypoint/tests/test_data_model.py

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from entrypoint.data_model import ArtifactType, ScanConfig, OutputConfig, SBOMOutput, parse_comma_list
2+
from entrypoint.data_model import ArtifactType, ScanConfig, OutputConfig, SBOMOutput, VulnScanOutput, parse_comma_list
33

44

55
class MockArgs:
@@ -387,3 +387,102 @@ def test_sbom_output_failure_scenario(self):
387387
self.assertEqual(output.error_message, "Timeout exceeded")
388388
self.assertIsNone(output.file_path)
389389
self.assertIsNone(output.generation_time)
390+
391+
def test_vuln_scan_output_can_be_created(self):
392+
output = VulnScanOutput()
393+
self.assertIsNotNone(output)
394+
395+
def test_vuln_scan_output_has_scan_success(self):
396+
output = VulnScanOutput(scan_success=True)
397+
self.assertEqual(output.scan_success, True)
398+
399+
def test_vuln_scan_output_has_return_code(self):
400+
output = VulnScanOutput(return_code=0)
401+
self.assertEqual(output.return_code, 0)
402+
403+
def test_vuln_scan_output_has_scan_results_file_path(self):
404+
output = VulnScanOutput(scan_results_file_path="/tmp/scan.json")
405+
self.assertEqual(output.scan_results_file_path, "/tmp/scan.json")
406+
407+
def test_vuln_scan_output_has_scan_time(self):
408+
output = VulnScanOutput(scan_time=12.5)
409+
self.assertEqual(output.scan_time, 12.5)
410+
411+
def test_vuln_scan_output_has_results_file_size(self):
412+
output = VulnScanOutput(results_file_size=4096)
413+
self.assertEqual(output.results_file_size, 4096)
414+
415+
def test_vuln_scan_output_has_vulnerability_counts(self):
416+
output = VulnScanOutput(
417+
total_vulnerabilities=25,
418+
critical_count=5,
419+
high_count=8,
420+
medium_count=7,
421+
low_count=3,
422+
other_count=2
423+
)
424+
self.assertEqual(output.total_vulnerabilities, 25)
425+
self.assertEqual(output.critical_count, 5)
426+
self.assertEqual(output.high_count, 8)
427+
self.assertEqual(output.medium_count, 7)
428+
self.assertEqual(output.low_count, 3)
429+
self.assertEqual(output.other_count, 2)
430+
431+
def test_vuln_scan_output_has_error_message(self):
432+
output = VulnScanOutput(error_message="API timeout")
433+
self.assertEqual(output.error_message, "API timeout")
434+
435+
def test_vuln_scan_output_defaults(self):
436+
output = VulnScanOutput()
437+
self.assertEqual(output.scan_success, False)
438+
self.assertIsNone(output.return_code)
439+
self.assertIsNone(output.scan_results_file_path)
440+
self.assertIsNone(output.scan_time)
441+
self.assertIsNone(output.results_file_size)
442+
self.assertIsNone(output.total_vulnerabilities)
443+
self.assertIsNone(output.critical_count)
444+
self.assertIsNone(output.high_count)
445+
self.assertIsNone(output.medium_count)
446+
self.assertIsNone(output.low_count)
447+
self.assertIsNone(output.other_count)
448+
self.assertIsNone(output.error_message)
449+
450+
def test_vuln_scan_output_success_scenario(self):
451+
output = VulnScanOutput(
452+
scan_success=True,
453+
return_code=0,
454+
scan_results_file_path="/tmp/results.json",
455+
scan_time=8.3,
456+
results_file_size=2048,
457+
total_vulnerabilities=15,
458+
critical_count=2,
459+
high_count=5,
460+
medium_count=6,
461+
low_count=2,
462+
other_count=0
463+
)
464+
self.assertEqual(output.scan_success, True)
465+
self.assertEqual(output.return_code, 0)
466+
self.assertEqual(output.scan_results_file_path, "/tmp/results.json")
467+
self.assertEqual(output.scan_time, 8.3)
468+
self.assertEqual(output.results_file_size, 2048)
469+
self.assertEqual(output.total_vulnerabilities, 15)
470+
self.assertEqual(output.critical_count, 2)
471+
self.assertEqual(output.high_count, 5)
472+
self.assertEqual(output.medium_count, 6)
473+
self.assertEqual(output.low_count, 2)
474+
self.assertEqual(output.other_count, 0)
475+
self.assertIsNone(output.error_message)
476+
477+
def test_vuln_scan_output_failure_scenario(self):
478+
output = VulnScanOutput(
479+
scan_success=False,
480+
return_code=1,
481+
error_message="Inspector API unavailable"
482+
)
483+
self.assertEqual(output.scan_success, False)
484+
self.assertEqual(output.return_code, 1)
485+
self.assertEqual(output.error_message, "Inspector API unavailable")
486+
self.assertIsNone(output.scan_results_file_path)
487+
self.assertIsNone(output.scan_time)
488+
self.assertIsNone(output.total_vulnerabilities)

0 commit comments

Comments
 (0)