fix(alerting): harden V12 migration IT against shared container state
- Replace hard-coded 'u1' user_id with per-test UUID to prevent PK collision on re-runs - Add @AfterEach null-safe cleanup for environments and users rows - Use containsExactlyInAnyOrder for enum assertions to catch misspelled names - Slug suffix on environment insert avoids slug uniqueness conflicts on re-runs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,21 @@
|
|||||||
package com.cameleer.server.app.alerting.storage;
|
package com.cameleer.server.app.alerting.storage;
|
||||||
|
|
||||||
import com.cameleer.server.app.AbstractPostgresIT;
|
import com.cameleer.server.app.AbstractPostgresIT;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
class V12MigrationIT extends AbstractPostgresIT {
|
class V12MigrationIT extends AbstractPostgresIT {
|
||||||
|
|
||||||
|
private java.util.UUID testEnvId;
|
||||||
|
private String testUserId;
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void cleanup() {
|
||||||
|
if (testEnvId != null) jdbcTemplate.update("DELETE FROM environments WHERE id = ?", testEnvId);
|
||||||
|
if (testUserId != null) jdbcTemplate.update("DELETE FROM users WHERE user_id = ?", testUserId);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void allAlertingTablesAndEnumsExist() {
|
void allAlertingTablesAndEnumsExist() {
|
||||||
var tables = jdbcTemplate.queryForList(
|
var tables = jdbcTemplate.queryForList(
|
||||||
@@ -22,38 +32,47 @@ class V12MigrationIT extends AbstractPostgresIT {
|
|||||||
"('severity_enum','condition_kind_enum','alert_state_enum'," +
|
"('severity_enum','condition_kind_enum','alert_state_enum'," +
|
||||||
"'target_kind_enum','notification_status_enum')",
|
"'target_kind_enum','notification_status_enum')",
|
||||||
String.class);
|
String.class);
|
||||||
assertThat(enums).hasSize(5);
|
assertThat(enums).containsExactlyInAnyOrder(
|
||||||
|
"severity_enum", "condition_kind_enum", "alert_state_enum",
|
||||||
|
"target_kind_enum", "notification_status_enum");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void deletingEnvironmentCascadesAlertingRows() {
|
void deletingEnvironmentCascadesAlertingRows() {
|
||||||
var envId = java.util.UUID.randomUUID();
|
testEnvId = java.util.UUID.randomUUID();
|
||||||
|
testUserId = java.util.UUID.randomUUID().toString();
|
||||||
|
|
||||||
jdbcTemplate.update(
|
jdbcTemplate.update(
|
||||||
"INSERT INTO environments (id, slug, display_name) VALUES (?, ?, ?)",
|
"INSERT INTO environments (id, slug, display_name) VALUES (?, ?, ?)",
|
||||||
envId, "test-cascade-env", "Test Cascade Env");
|
testEnvId, "test-cascade-env-" + testEnvId, "Test Cascade Env");
|
||||||
jdbcTemplate.update(
|
jdbcTemplate.update(
|
||||||
"INSERT INTO users (user_id, provider, email) " +
|
"INSERT INTO users (user_id, provider, email) VALUES (?, ?, ?)",
|
||||||
"VALUES (?, ?, ?)", "u1", "local", "a@b.test");
|
testUserId, "local", "test@example.com");
|
||||||
|
|
||||||
var ruleId = java.util.UUID.randomUUID();
|
var ruleId = java.util.UUID.randomUUID();
|
||||||
jdbcTemplate.update(
|
jdbcTemplate.update(
|
||||||
"INSERT INTO alert_rules (id, environment_id, name, severity, condition_kind, condition, " +
|
"INSERT INTO alert_rules (id, environment_id, name, severity, condition_kind, condition, " +
|
||||||
"notification_title_tmpl, notification_message_tmpl, created_by, updated_by) " +
|
"notification_title_tmpl, notification_message_tmpl, created_by, updated_by) " +
|
||||||
"VALUES (?, ?, 'r', 'WARNING', 'AGENT_STATE', '{}'::jsonb, 't', 'm', 'u1', 'u1')",
|
"VALUES (?, ?, 'r', 'WARNING', 'AGENT_STATE', '{}'::jsonb, 't', 'm', ?, ?)",
|
||||||
ruleId, envId);
|
ruleId, testEnvId, testUserId, testUserId);
|
||||||
|
|
||||||
var instanceId = java.util.UUID.randomUUID();
|
var instanceId = java.util.UUID.randomUUID();
|
||||||
jdbcTemplate.update(
|
jdbcTemplate.update(
|
||||||
"INSERT INTO alert_instances (id, rule_id, rule_snapshot, environment_id, state, severity, " +
|
"INSERT INTO alert_instances (id, rule_id, rule_snapshot, environment_id, state, severity, " +
|
||||||
"fired_at, context, title, message) VALUES (?, ?, '{}'::jsonb, ?, 'FIRING', 'WARNING', " +
|
"fired_at, context, title, message) VALUES (?, ?, '{}'::jsonb, ?, 'FIRING', 'WARNING', " +
|
||||||
"now(), '{}'::jsonb, 't', 'm')",
|
"now(), '{}'::jsonb, 't', 'm')",
|
||||||
instanceId, ruleId, envId);
|
instanceId, ruleId, testEnvId);
|
||||||
|
|
||||||
jdbcTemplate.update("DELETE FROM environments WHERE id = ?", envId);
|
jdbcTemplate.update("DELETE FROM environments WHERE id = ?", testEnvId);
|
||||||
|
|
||||||
assertThat(jdbcTemplate.queryForObject(
|
assertThat(jdbcTemplate.queryForObject(
|
||||||
"SELECT count(*) FROM alert_rules WHERE environment_id = ?",
|
"SELECT count(*) FROM alert_rules WHERE environment_id = ?",
|
||||||
Integer.class, envId)).isZero();
|
Integer.class, testEnvId)).isZero();
|
||||||
assertThat(jdbcTemplate.queryForObject(
|
assertThat(jdbcTemplate.queryForObject(
|
||||||
"SELECT count(*) FROM alert_instances WHERE environment_id = ?",
|
"SELECT count(*) FROM alert_instances WHERE environment_id = ?",
|
||||||
Integer.class, envId)).isZero();
|
Integer.class, testEnvId)).isZero();
|
||||||
|
|
||||||
|
// testEnvId already deleted; null it so @AfterEach doesn't attempt a no-op delete
|
||||||
|
testEnvId = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user