diff --git a/cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/SearchControllerIT.java b/cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/SearchControllerIT.java index 9e83b8ee..7a3bfa87 100644 --- a/cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/SearchControllerIT.java +++ b/cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/SearchControllerIT.java @@ -160,39 +160,64 @@ class SearchControllerIT extends AbstractClickHouseIT { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); JsonNode body = objectMapper.readTree(response.getBody()); - assertThat(body.get("total").asLong()).isEqualTo(2); + // At least 2 FAILED from our seed data (other test classes may add more) + assertThat(body.get("total").asLong()).isGreaterThanOrEqualTo(2); assertThat(body.get("offset").asInt()).isEqualTo(0); assertThat(body.get("limit").asInt()).isEqualTo(50); assertThat(body.get("data")).isNotNull(); + // All returned results must be FAILED body.get("data").forEach(item -> assertThat(item.get("status").asText()).isEqualTo("FAILED")); } @Test void searchByTimeRange_returnsOnlyExecutionsInRange() throws Exception { - // Only execution 1 and 2 are on 2026-03-10 before 13:00 + // Use correlationId + time range to precisely verify time filtering + // corr-alpha is at 10:00, within [09:00, 13:00] ResponseEntity response = searchGet( - "?timeFrom=2026-03-10T09:00:00Z&timeTo=2026-03-10T13:00:00Z"); + "?timeFrom=2026-03-10T09:00:00Z&timeTo=2026-03-10T13:00:00Z&correlationId=corr-alpha"); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); JsonNode body = objectMapper.readTree(response.getBody()); - assertThat(body.get("total").asLong()).isEqualTo(2); + assertThat(body.get("total").asLong()).isEqualTo(1); + assertThat(body.get("data").get(0).get("correlationId").asText()).isEqualTo("corr-alpha"); + + // corr-gamma is at 2026-03-11T08:00, outside [09:00, 13:00 on 03-10] + ResponseEntity response2 = searchGet( + "?timeFrom=2026-03-10T09:00:00Z&timeTo=2026-03-10T13:00:00Z&correlationId=corr-gamma"); + JsonNode body2 = objectMapper.readTree(response2.getBody()); + assertThat(body2.get("total").asLong()).isZero(); } @Test void searchByDuration_returnsOnlyMatchingExecutions() throws Exception { - // durationMin=100, durationMax=500 should match executions with 100, 200, 300 ms - ResponseEntity response = searchPost(""" + // Use correlationId to verify duration filter precisely + // corr-beta has 200ms, corr-delta has 300ms -- both in [100, 500] + ResponseEntity response = searchGet("?correlationId=corr-beta"); + JsonNode body = objectMapper.readTree(response.getBody()); + assertThat(body.get("total").asLong()).isEqualTo(1); + + // Verify duration filter excludes corr-alpha (50ms) when min=100 + ResponseEntity response2 = searchPost(""" { "durationMin": 100, - "durationMax": 500 + "durationMax": 500, + "correlationId": "corr-alpha" } """); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + JsonNode body2 = objectMapper.readTree(response2.getBody()); + assertThat(body2.get("total").asLong()).isZero(); - JsonNode body = objectMapper.readTree(response.getBody()); - // Exec 2 (200ms), Exec 4 (300ms), Execs 5-10 (100ms each = 6) - assertThat(body.get("total").asLong()).isEqualTo(8); + // Verify duration filter includes corr-delta (300ms) when in [100, 500] + ResponseEntity response3 = searchPost(""" + { + "durationMin": 100, + "durationMax": 500, + "correlationId": "corr-delta" + } + """); + JsonNode body3 = objectMapper.readTree(response3.getBody()); + assertThat(body3.get("total").asLong()).isEqualTo(1); } @Test @@ -302,9 +327,17 @@ class SearchControllerIT extends AbstractClickHouseIT { @Test void pagination_worksCorrectly() throws Exception { - // Get all 10 executions with pagination: offset=2, limit=3 + // First, get total count of COMPLETED executions (8 from our seed data, + // but may include data from other test classes) + ResponseEntity countResponse = searchGet("?status=COMPLETED&limit=1"); + JsonNode countBody = objectMapper.readTree(countResponse.getBody()); + long totalCompleted = countBody.get("total").asLong(); + assertThat(totalCompleted).isGreaterThanOrEqualTo(8); + + // Now test pagination with offset=2, limit=3 ResponseEntity response = searchPost(""" { + "status": "COMPLETED", "offset": 2, "limit": 3 } @@ -312,7 +345,7 @@ class SearchControllerIT extends AbstractClickHouseIT { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); JsonNode body = objectMapper.readTree(response.getBody()); - assertThat(body.get("total").asLong()).isEqualTo(10); + assertThat(body.get("total").asLong()).isEqualTo(totalCompleted); assertThat(body.get("data").size()).isEqualTo(3); assertThat(body.get("offset").asInt()).isEqualTo(2); assertThat(body.get("limit").asInt()).isEqualTo(3);