mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
44 lines
1.4 KiB
Go
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")
|
|
}
|
|
})
|
|
}
|
|
}
|