1111import jsonschema
1212
1313from codemodder import __version__ , registry
14+ from codemodder .sonar_results import SonarResultSet
1415
1516from .validations import execute_code
1617
@@ -115,19 +116,6 @@ def _assert_run_fields(self, run, output_path):
115116 assert run ["directory" ] == os .path .abspath (self .code_dir )
116117 assert run ["sarifs" ] == []
117118
118- def _assert_sonar_fields (self , result ):
119- assert result ["detectionTool" ]["name" ] == "Sonar"
120- assert (
121- result ["detectionTool" ]["rule" ]["id" ]
122- == self .codemod_instance ._metadata .tool .rule_id
123- )
124- assert (
125- result ["detectionTool" ]["rule" ]["name" ]
126- == self .codemod_instance ._metadata .tool .rule_name
127- )
128- # TODO: empty array until we add findings metadata
129- assert result ["detectionTool" ]["findings" ] == []
130-
131119 def _assert_results_fields (self , results , output_path ):
132120 assert len (results ) == 1
133121 result = results [0 ]
@@ -146,13 +134,7 @@ def _assert_results_fields(self, results, output_path):
146134 ]:
147135 assert reference ["url" ] == reference ["description" ]
148136
149- if self .sonar_issues_json :
150- assert self .codemod_instance ._metadata .tool is not None
151- assert (
152- result ["references" ][- 1 ]["description" ]
153- == self .codemod_instance ._metadata .tool .rule_name
154- )
155- self ._assert_sonar_fields (result )
137+ self ._assert_sonar_fields (result )
156138
157139 assert len (result ["changeset" ]) == self .num_changed_files
158140
@@ -169,6 +151,9 @@ def _assert_results_fields(self, results, output_path):
169151 assert line_change ["lineNumber" ] == int (self .expected_line_change )
170152 assert line_change ["description" ] == self .change_description
171153
154+ def _assert_sonar_fields (self , result ):
155+ del result
156+
172157 def _assert_codetf_output (self , codetf_schema ):
173158 with open (self .output_path , "r" , encoding = "utf-8" ) as f :
174159 codetf = json .load (f )
@@ -277,6 +262,7 @@ def setup_class(cls):
277262 # in parallel at this time since they would all override the same
278263 # tests/samples/requirements.txt file, unless we change that to
279264 # a temporary file.
265+ cls .check_sonar_issues ()
280266
281267 @classmethod
282268 def teardown_class (cls ):
@@ -286,6 +272,37 @@ def teardown_class(cls):
286272 with open (cls .code_path , mode = "w" , encoding = "utf-8" ) as f :
287273 f .write (cls .original_code )
288274
275+ @classmethod
276+ def check_sonar_issues (cls ):
277+ sonar_results = SonarResultSet .from_json (cls .sonar_issues_json )
278+
279+ assert (
280+ cls .codemod .rule_id in sonar_results
281+ ), f"Make sure to add a sonar issue for { cls .codemod .rule_id } in { cls .sonar_issues_json } "
282+ results_for_codemod = sonar_results [cls .codemod .rule_id ]
283+ file_path = pathlib .Path (cls .code_filename )
284+ assert (
285+ file_path in results_for_codemod
286+ ), f"Make sure to add a sonar issue for file `{ cls .code_filename } ` under rule `{ cls .codemod .rule_id } ` in { cls .sonar_issues_json } "
287+
288+ def _assert_sonar_fields (self , result ):
289+ assert self .codemod_instance ._metadata .tool is not None
290+ assert (
291+ result ["references" ][- 1 ]["description" ]
292+ == self .codemod_instance ._metadata .tool .rule_name
293+ )
294+ assert result ["detectionTool" ]["name" ] == "Sonar"
295+ assert (
296+ result ["detectionTool" ]["rule" ]["id" ]
297+ == self .codemod_instance ._metadata .tool .rule_id
298+ )
299+ assert (
300+ result ["detectionTool" ]["rule" ]["name" ]
301+ == self .codemod_instance ._metadata .tool .rule_name
302+ )
303+ # TODO: empty array until we add findings metadata
304+ assert result ["detectionTool" ]["findings" ] == []
305+
289306
290307def original_and_expected_from_code_path (code_path , replacements ):
291308 """
0 commit comments