Files
CosmicClash/server/store/server_shutdown_sql_test.go
T

44 lines
1.4 KiB
Go

package store
import (
"context"
"database/sql"
"strings"
"testing"
"time"
"github.com/cosmic-clash/cosmic-clash/server/domain"
)
func TestServerShutdownSQLUsesIdempotencyLockAndAudit(t *testing.T) {
checks := map[string][]string{
"insert": {"idempotency_keys", "ON CONFLICT (scope, idempotency_key) DO NOTHING", "payload_digest"},
"select": {"scope = $1", "idempotency_key = $2", "FOR UPDATE"},
"match": {"match_id = $1", "server_id = $2", "FOR UPDATE"},
"audit": {"SERVER_SHUTDOWN", "request_id", "metadata"},
}
queries := map[string]string{"insert": ServerShutdownIdempotencyInsertSQL, "select": ServerShutdownIdempotencySelectSQL, "match": ServerShutdownMatchLockSQL, "audit": ServerShutdownAuditSQL}
for name, fragments := range checks {
for _, fragment := range fragments {
if !strings.Contains(queries[name], fragment) {
t.Fatalf("%s query missing %q: %s", name, fragment, queries[name])
}
}
}
}
func TestRecordServerShutdownRejectsInvalidArguments(t *testing.T) {
binding := domain.WorkloadBinding{MatchID: "match-1", ServerID: "server-1"}
now := time.Unix(1000, 0).UTC()
for name, values := range map[string][2]string{
"missing reason": {"", "shutdown-key-123456"},
"short key": {"planned", "short"},
} {
t.Run(name, func(t *testing.T) {
if err := RecordServerShutdown(context.Background(), (*sql.DB)(nil), binding, values[0], values[1], now); err == nil {
t.Fatal("expected validation error")
}
})
}
}