fix(02-03): make search tests resilient to shared ClickHouse data
- Use correlationId scoping and >= assertions for status/duration tests - Prevents false failures when other test classes seed data in same container Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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<String> 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<String> 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<String> response = searchPost("""
|
||||
// Use correlationId to verify duration filter precisely
|
||||
// corr-beta has 200ms, corr-delta has 300ms -- both in [100, 500]
|
||||
ResponseEntity<String> 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<String> 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<String> 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<String> 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<String> 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);
|
||||
|
||||
Reference in New Issue
Block a user