66class TestProwlerParser (DojoTestCase ):
77 def test_aws_csv_parser (self ):
88 """Test parsing AWS CSV report with at least one finding"""
9- with (get_unit_tests_scans_path ("prowler" ) / "aws .csv" ).open (encoding = "utf-8" ) as test_file :
9+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_aws .csv" ).open (encoding = "utf-8" ) as test_file :
1010 parser = ProwlerParser ()
1111 findings = parser .get_findings (test_file , Test ())
1212
@@ -38,8 +38,8 @@ def test_aws_csv_parser(self):
3838 self .assertTrue ("Remediation:" in finding .mitigation )
3939
4040 def test_aws_json_parser (self ):
41- """Test parsing AWS JSON report with findings"""
42- with (get_unit_tests_scans_path ("prowler" ) / "aws .json" ).open (encoding = "utf-8" ) as test_file :
41+ """Test parsing AWS OCSF JSON report with findings"""
42+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_aws.ocsf .json" ).open (encoding = "utf-8" ) as test_file :
4343 parser = ProwlerParser ()
4444 findings = parser .get_findings (test_file , Test ())
4545
@@ -60,30 +60,32 @@ def test_aws_json_parser(self):
6060 # These fields might not always be present in the test data
6161
6262 def test_azure_csv_parser (self ):
63- """Test parsing Azure CSV report with 1 finding """
64- with (get_unit_tests_scans_path ("prowler" ) / "azure .csv" ).open (encoding = "utf-8" ) as test_file :
63+ """Test parsing Azure CSV report with findings """
64+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_azure .csv" ).open (encoding = "utf-8" ) as test_file :
6565 parser = ProwlerParser ()
6666 findings = parser .get_findings (test_file , Test ())
6767
68- self .assertEqual (1 , len (findings ))
68+ # Check that we have at least one finding
69+ self .assertTrue (len (findings ) > 0 )
6970
71+ # Take the first finding for validation
7072 finding = findings [0 ]
71- self .assertEqual (
72- "aks_network_policy_enabled: Ensure Network Policy is Enabled and set as appropriate" ,
73- finding .title ,
74- )
75- self .assertEqual ("aks_network_policy_enabled" , finding .vuln_id_from_tool )
76- self .assertEqual ("Medium" , finding .severity )
77- self .assertFalse (finding .active ) # PASS status
73+
74+ # Verify basic properties that should be present in any finding
75+ self .assertIsNotNone (finding .title )
76+ self .assertIsNotNone (finding .severity )
77+ self .assertIsNotNone (finding .description )
78+ self .assertIsNotNone (finding .unsaved_tags )
7879
7980 # Verify cloud provider data
80- self .assertIn ("AZURE" , finding .unsaved_tags )
81- self .assertIn ("aks" , finding .unsaved_tags ) # Resource data and remediation information might not be available in all test files
82- # Skip strict verification
81+ self .assertTrue (
82+ any ("azure" in tag .lower () for tag in finding .unsaved_tags ),
83+ "No Azure-related tag found in finding" ,
84+ )
8385
8486 def test_azure_json_parser (self ):
85- """Test parsing Azure JSON report with findings"""
86- with (get_unit_tests_scans_path ("prowler" ) / "azure .json" ).open (encoding = "utf-8" ) as test_file :
87+ """Test parsing Azure OCSF JSON report with findings"""
88+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_azure.ocsf .json" ).open (encoding = "utf-8" ) as test_file :
8789 parser = ProwlerParser ()
8890 findings = parser .get_findings (test_file , Test ())
8991
@@ -93,14 +95,60 @@ def test_azure_json_parser(self):
9395 # Take the first finding for validation
9496 finding = findings [0 ]
9597
98+ # Verify basic properties that should be present in any finding
99+ self .assertIsNotNone (finding .title )
100+ self .assertIsNotNone (finding .severity )
101+
102+ # Verify cloud provider data
103+ self .assertTrue (
104+ any ("azure" in tag .lower () for tag in finding .unsaved_tags ),
105+ "No Azure-related tag found in finding" ,
106+ )
107+ finding = findings [0 ]
108+
96109 # Verify basic properties that should be present in any finding
97110 self .assertIsNotNone (finding .title )
98111 self .assertIsNotNone (finding .severity )
99112 self .assertIn ("azure" , [tag .lower () for tag in finding .unsaved_tags ])
100113
101114 def test_gcp_csv_parser (self ):
102115 """Test parsing GCP CSV report with findings"""
103- with (get_unit_tests_scans_path ("prowler" ) / "gcp.csv" ).open (encoding = "utf-8" ) as test_file :
116+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_gcp.csv" ).open (encoding = "utf-8" ) as test_file :
117+ parser = ProwlerParser ()
118+ findings = parser .get_findings (test_file , Test ())
119+
120+ # Check that we have at least one finding
121+ self .assertTrue (len (findings ) > 0 )
122+
123+ # Take the first finding for validation
124+ finding = findings [0 ]
125+
126+ # Verify basic properties that should be present in any finding
127+ self .assertIsNotNone (finding .title )
128+ self .assertIsNotNone (finding .severity )
129+ self .assertIsNotNone (finding .description )
130+
131+ # Verify GCP tag in some form (cloud provider data)
132+ tag_found = False
133+ for tag in finding .unsaved_tags :
134+ if "gcp" in tag .lower ():
135+ tag_found = True
136+ break
137+ self .assertTrue (tag_found , "No GCP-related tag found in finding" )
138+
139+ # Verify resource data exists in mitigation
140+ if finding .mitigation :
141+ self .assertTrue (
142+ any ("Resource" in line for line in finding .mitigation .split ("\n " )),
143+ "Resource data not found in mitigation" ,
144+ )
145+
146+ # Verify remediation data exists in mitigation
147+ if finding .mitigation :
148+ self .assertTrue (
149+ "Remediation:" in finding .mitigation ,
150+ "No remediation information found in mitigation" ,
151+ )
104152 parser = ProwlerParser ()
105153 findings = parser .get_findings (test_file , Test ())
106154
@@ -137,8 +185,33 @@ def test_gcp_csv_parser(self):
137185 )
138186
139187 def test_gcp_json_parser (self ):
140- """Test parsing GCP JSON report with findings"""
141- with (get_unit_tests_scans_path ("prowler" ) / "gcp.json" ).open (encoding = "utf-8" ) as test_file :
188+ """Test parsing GCP OCSF JSON report with findings"""
189+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_gcp.ocsf.json" ).open (encoding = "utf-8" ) as test_file :
190+ parser = ProwlerParser ()
191+ findings = parser .get_findings (test_file , Test ())
192+
193+ # Check that we have at least one finding
194+ self .assertTrue (len (findings ) > 0 )
195+
196+ # Take the first finding for validation
197+ finding = findings [0 ]
198+
199+ # Verify basic properties that should be present in any finding
200+ self .assertIsNotNone (finding .title )
201+ self .assertIsNotNone (finding .severity )
202+
203+ # Verify cloud provider data
204+ self .assertTrue (
205+ any ("gcp" in tag .lower () for tag in finding .unsaved_tags ),
206+ "No GCP-related tag found in finding" ,
207+ )
208+
209+ # Verify remediation data when available
210+ if finding .mitigation :
211+ self .assertTrue (
212+ "Remediation:" in finding .mitigation ,
213+ "No remediation information found in mitigation" ,
214+ )
142215 parser = ProwlerParser ()
143216 findings = parser .get_findings (test_file , Test ())
144217
@@ -164,7 +237,7 @@ def test_gcp_json_parser(self):
164237
165238 def test_kubernetes_csv_parser (self ):
166239 """Test parsing Kubernetes CSV report with findings"""
167- with (get_unit_tests_scans_path ("prowler" ) / "kubernetes .csv" ).open (encoding = "utf-8" ) as test_file :
240+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_kubernetes .csv" ).open (encoding = "utf-8" ) as test_file :
168241 parser = ProwlerParser ()
169242 findings = parser .get_findings (test_file , Test ())
170243
@@ -177,6 +250,7 @@ def test_kubernetes_csv_parser(self):
177250 # Verify basic properties that should be present in any finding
178251 self .assertIsNotNone (finding .title )
179252 self .assertIsNotNone (finding .severity )
253+ self .assertIsNotNone (finding .description )
180254
181255 # Verify cloud provider data (Kubernetes tag)
182256 tag_found = False
@@ -199,62 +273,96 @@ def test_kubernetes_csv_parser(self):
199273 "Remediation:" in finding .mitigation ,
200274 "No remediation information found in mitigation" ,
201275 )
202-
203- def test_kubernetes_json_parser (self ):
204- """Test parsing Kubernetes JSON report with findings"""
205- with (get_unit_tests_scans_path ("prowler" ) / "kubernetes.json" ).open (encoding = "utf-8" ) as test_file :
206276 parser = ProwlerParser ()
207277 findings = parser .get_findings (test_file , Test ())
208278
209- # Check that we have exactly 2 findings for kubernetes.json
210- self .assertEqual ( 2 , len (findings ))
279+ # Check that we have at least one finding
280+ self .assertTrue ( len (findings ) > 0 )
211281
212- # Verify first finding (should be AlwaysPullImages)
213- always_pull_findings = [f for f in findings if "AlwaysPullImages" in f .title ]
214- self .assertTrue (len (always_pull_findings ) > 0 , "No AlwaysPullImages finding detected" )
282+ # Take the first finding for validation
283+ finding = findings [0 ]
215284
216- always_pull_finding = always_pull_findings [0 ]
217- # Skip check_id assertion as it's not provided in the test data
218- self .assertEqual ("Medium" , always_pull_finding .severity )
219- # Verify cloud provider data
220- self .assertIn ("kubernetes" , [tag .lower () for tag in always_pull_finding .unsaved_tags ])
285+ # Verify basic properties that should be present in any finding
286+ self .assertIsNotNone (finding .title )
287+ self .assertIsNotNone (finding .severity )
288+
289+ # Verify cloud provider data (Kubernetes tag)
290+ tag_found = False
291+ for tag in finding .unsaved_tags :
292+ if "kubernetes" in tag .lower ():
293+ tag_found = True
294+ break
295+ self .assertTrue (tag_found , "No Kubernetes-related tag found in finding" )
221296
222- # Check for resource and remediation data
223- if always_pull_finding .mitigation :
224- # Verify resource data
297+ # Verify resource data exists in mitigation
298+ if finding .mitigation :
225299 self .assertTrue (
226- any ("Resource" in line for line in always_pull_finding .mitigation .split ("\n " )),
227- "Resource data not found in mitigation for AlwaysPullImages finding " ,
300+ any ("Resource" in line for line in finding .mitigation .split ("\n " )),
301+ "Resource data not found in mitigation" ,
228302 )
229303
230- # Verify remediation data
304+ # Verify remediation data exists in mitigation
305+ if finding .mitigation :
231306 self .assertTrue (
232- "Remediation:" in always_pull_finding .mitigation ,
233- "Remediation information not found in AlwaysPullImages finding " ,
307+ "Remediation:" in finding .mitigation ,
308+ "No remediation information found in mitigation " ,
234309 )
235310
236- # Verify second finding
237- other_findings = [f for f in findings if "AlwaysPullImages" not in f .title ]
238- self .assertTrue (len (other_findings ) > 0 , "Only AlwaysPullImages finding detected" )
311+ def test_kubernetes_json_parser (self ):
312+ """Test parsing Kubernetes OCSF JSON report with findings"""
313+ with (get_unit_tests_scans_path ("prowler" ) / "examples/output/example_output_kubernetes.ocsf.json" ).open (encoding = "utf-8" ) as test_file :
314+ parser = ProwlerParser ()
315+ findings = parser .get_findings (test_file , Test ())
239316
240- other_finding = other_findings [0 ]
241- self .assertIsNotNone (other_finding .title )
242- self .assertIsNotNone (other_finding .severity )
243- self .assertEqual ("High" , other_finding .severity )
317+ # Check that we have at least one finding
318+ self .assertTrue (len (findings ) > 0 )
244319
245- # Verify cloud provider data in second finding
246- self . assertIn ( "kubernetes" , [ tag . lower () for tag in other_finding . unsaved_tags ])
320+ # Take the first finding for validation
321+ finding = findings [ 0 ]
247322
248- # Check for resource and remediation data in second finding
249- if other_finding .mitigation :
250- # Verify resource data
323+ # Verify basic properties that should be present in any finding
324+ self .assertIsNotNone (finding .title )
325+ self .assertIsNotNone (finding .severity )
326+
327+ # Verify cloud provider data
328+ self .assertTrue (
329+ any ("kubernetes" in tag .lower () for tag in finding .unsaved_tags ),
330+ "No Kubernetes-related tag found in finding" ,
331+ )
332+
333+ # Verify remediation data when available
334+ if finding .mitigation :
251335 self .assertTrue (
252- any ( "Resource " in line for line in other_finding .mitigation . split ( " \n " )) ,
253- "Resource data not found in mitigation for second finding " ,
336+ "Remediation: " in finding .mitigation ,
337+ "No remediation information found in mitigation" ,
254338 )
255339
256- # Verify remediation data
340+ # Check that we have 6 findings for kubernetes.ocsf.json
341+ self .assertEqual (6 , len (findings ))
342+
343+ # Look for specific findings in the result set
344+ always_pull_findings = [f for f in findings if "AlwaysPullImages" in f .title ]
345+ self .assertTrue (len (always_pull_findings ) > 0 , "No AlwaysPullImages finding detected" )
346+
347+ # Verify at least one finding has Medium severity
348+ medium_findings = [f for f in findings if f .severity == "Medium" ]
349+ self .assertTrue (len (medium_findings ) > 0 , "No medium severity findings detected" )
350+
351+ # Verify at least one finding has High severity
352+ high_findings = [f for f in findings if f .severity == "High" ]
353+ self .assertTrue (len (high_findings ) > 0 , "No high severity findings detected" )
354+
355+ # Check that all findings have the kubernetes tag
356+ for finding in findings :
257357 self .assertTrue (
258- "Remediation: " in other_finding . mitigation ,
259- "Remediation information not found in second finding " ,
358+ any ( "kubernetes " in tag . lower () for tag in finding . unsaved_tags ) ,
359+ f"Finding { finding . title } missing Kubernetes tag " ,
260360 )
361+
362+ # Check for remediation data in each finding with mitigation
363+ for finding in findings :
364+ if finding .mitigation :
365+ self .assertTrue (
366+ "Remediation:" in finding .mitigation ,
367+ f"Remediation information not found in { finding .title } " ,
368+ )
0 commit comments