@@ -214,45 +214,92 @@ void shouldBeAbleToDetectCRUDOperationsAndQueriesForPlantByWebsphere() throws Ex
214214 var runCodeAnalyzerOnPlantsByWebsphere = container .execInContainer (
215215 "bash" , "-c" ,
216216 String .format (
217- "export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --input=/test-applications/plantsbywebsphere --analysis-level=1 --verbose " ,
217+ "export JAVA_HOME=%s && java -jar /opt/jars/codeanalyzer-%s.jar --input=/test-applications/plantsbywebsphere --analysis-level=1" ,
218218 javaHomePath , codeanalyzerVersion
219219 )
220220 );
221221
222222
223+ Assertions .assertEquals (0 , runCodeAnalyzerOnPlantsByWebsphere .getExitCode (), "CodeAnalyzer command should succeed" );
223224 String output = runCodeAnalyzerOnPlantsByWebsphere .getStdout ();
225+ Gson gson = new Gson ();
226+ JsonObject jsonObject = gson .fromJson (output , JsonObject .class );
227+ JsonObject symbolTable = jsonObject .getAsJsonObject ("symbol_table" );
228+ Assertions .assertNotNull (symbolTable );
229+ Assertions .assertTrue (symbolTable .size () > 0 , "Symbol table should not be empty" );
230+
231+ boolean hasReadOperation = false ;
232+ boolean hasCreateOperation = false ;
233+ boolean hasUpdateOperation = false ;
234+ boolean hasNamedQuery = false ;
235+ int crudOperationCount = 0 ;
236+ int crudQueryCount = 0 ;
237+
238+ for (Map .Entry <String , JsonElement > compilationUnitEntry : symbolTable .entrySet ()) {
239+ JsonObject compilationUnit = compilationUnitEntry .getValue ().getAsJsonObject ();
240+ if (!compilationUnit .has ("type_declarations" )) {
241+ continue ;
242+ }
243+ JsonObject typeDeclarations = compilationUnit .getAsJsonObject ("type_declarations" );
244+ for (Map .Entry <String , JsonElement > typeEntry : typeDeclarations .entrySet ()) {
245+ JsonObject typeDeclaration = typeEntry .getValue ().getAsJsonObject ();
246+ if (!typeDeclaration .has ("callable_declarations" )) {
247+ continue ;
248+ }
249+ JsonObject callableDeclarations = typeDeclaration .getAsJsonObject ("callable_declarations" );
250+ for (Map .Entry <String , JsonElement > callableEntry : callableDeclarations .entrySet ()) {
251+ JsonObject callable = callableEntry .getValue ().getAsJsonObject ();
252+ JsonArray crudOperations = callable .getAsJsonArray ("crud_operations" );
253+ if (crudOperations != null ) {
254+ for (JsonElement crudOperationElement : crudOperations ) {
255+ JsonObject crudOperation = crudOperationElement .getAsJsonObject ();
256+ crudOperationCount ++;
257+ Assertions .assertTrue (crudOperation .has ("line_number" ), "CRUD operation should have line_number" );
258+ Assertions .assertTrue (crudOperation .has ("operation_type" ), "CRUD operation should have operation_type" );
259+ Assertions .assertTrue (crudOperation .has ("target_table" ), "CRUD operation should have target_table" );
260+ Assertions .assertTrue (crudOperation .has ("involved_columns" ), "CRUD operation should have involved_columns" );
261+ Assertions .assertTrue (crudOperation .has ("condition" ), "CRUD operation should have condition" );
262+ Assertions .assertTrue (crudOperation .has ("joined_tables" ), "CRUD operation should have joined_tables" );
263+ String operationType = crudOperation .get ("operation_type" ).getAsString ();
264+ int lineNumber = crudOperation .get ("line_number" ).getAsInt ();
265+ Assertions .assertTrue (lineNumber > 0 , "CRUD operation should have positive line_number" );
266+ if ("READ" .equals (operationType )) {
267+ hasReadOperation = true ;
268+ }
269+ if ("CREATE" .equals (operationType )) {
270+ hasCreateOperation = true ;
271+ }
272+ if ("UPDATE" .equals (operationType )) {
273+ hasUpdateOperation = true ;
274+ }
275+ }
276+ }
277+ JsonArray crudQueries = callable .getAsJsonArray ("crud_queries" );
278+ if (crudQueries != null ) {
279+ for (JsonElement crudQueryElement : crudQueries ) {
280+ JsonObject crudQuery = crudQueryElement .getAsJsonObject ();
281+ crudQueryCount ++;
282+ Assertions .assertTrue (crudQuery .has ("line_number" ), "CRUD query should have line_number" );
283+ Assertions .assertTrue (crudQuery .has ("query_type" ), "CRUD query should have query_type" );
284+ Assertions .assertTrue (crudQuery .has ("query_arguments" ), "CRUD query should have query_arguments" );
285+ String queryType = crudQuery .get ("query_type" ).getAsString ();
286+ int lineNumber = crudQuery .get ("line_number" ).getAsInt ();
287+ Assertions .assertTrue (lineNumber > 0 , "CRUD query should have positive line_number" );
288+ if ("NAMED" .equals (queryType )) {
289+ hasNamedQuery = true ;
290+ }
291+ }
292+ }
293+ }
294+ }
295+ }
224296
225- Assertions .assertTrue (output .contains ("\" query_type\" : \" NAMED\" " ), "No entry point classes found" );
226- Assertions .assertTrue (output .contains ("\" operation_type\" : \" READ\" " ), "No entry point methods found" );
227- Assertions .assertTrue (output .contains ("\" operation_type\" : \" UPDATE\" " ), "No entry point methods found" );
228- Assertions .assertTrue (output .contains ("\" operation_type\" : \" CREATE\" " ), "No entry point methods found" );
229-
230- // Convert the expected JSON structure into a string
231- String expectedCrudOperation =
232- "\" crud_operations\" : [" +
233- "{" +
234- "\" line_number\" : 115," +
235- "\" operation_type\" : \" READ\" ," +
236- "\" target_table\" : null," +
237- "\" involved_columns\" : null," +
238- "\" condition\" : null," +
239- "\" joined_tables\" : null" +
240- "}]" ;
241-
242- // Expected JSON for CRUD Queries
243- String expectedCrudQuery =
244- "\" crud_queries\" : [" +
245- "{" +
246- "\" line_number\" : 141," ;
247-
248- // Normalize the output and expected strings to ignore formatting differences
249- String normalizedOutput = output .replaceAll ("\\ s+" , "" );
250- String normalizedExpectedCrudOperation = expectedCrudOperation .replaceAll ("\\ s+" , "" );
251- String normalizedExpectedCrudQuery = expectedCrudQuery .replaceAll ("\\ s+" , "" );
252-
253- // Assertions for both CRUD operations and queries
254- Assertions .assertTrue (normalizedOutput .contains (normalizedExpectedCrudOperation ), "Expected CRUD operation JSON structure not found" );
255- Assertions .assertTrue (normalizedOutput .contains (normalizedExpectedCrudQuery ), "Expected CRUD query JSON structure not found" );
297+ Assertions .assertTrue (crudOperationCount > 0 , "No CRUD operations found" );
298+ Assertions .assertTrue (crudQueryCount > 0 , "No CRUD queries found" );
299+ Assertions .assertTrue (hasNamedQuery , "No NAMED CRUD query found" );
300+ Assertions .assertTrue (hasReadOperation , "No READ CRUD operation found" );
301+ Assertions .assertTrue (hasCreateOperation , "No CREATE CRUD operation found" );
302+ Assertions .assertTrue (hasUpdateOperation , "No UPDATE CRUD operation found" );
256303 }
257304
258305 @ Test
@@ -324,7 +371,9 @@ void parametersInCallableMustHaveStartAndEndLineAndColumns() throws IOException,
324371 JsonObject type = element .getValue ().getAsJsonObject ();
325372 if (type .has ("type_declarations" )) {
326373 JsonObject typeDeclarations = type .getAsJsonObject ("type_declarations" );
327- JsonObject mainMethod = typeDeclarations .getAsJsonObject ("org.example.App" ).getAsJsonObject ("callable_declarations" ).getAsJsonObject ("main(String[])" );
374+ JsonObject mainMethod = typeDeclarations .getAsJsonObject ("org.example.App" )
375+ .getAsJsonObject ("callable_declarations" )
376+ .getAsJsonObject ("main(java.lang.String[])" );
328377 JsonArray parameters = mainMethod .getAsJsonArray ("parameters" );
329378 // There should be 1 parameter
330379 Assertions .assertEquals (1 , parameters .size (), "Callable should have 1 parameter" );
0 commit comments