package alertworker import ( "context" "os" "testing" "time" "github.com/itworx/pulse/internal/alert" "github.com/itworx/pulse/internal/database" ) func TestPostgreSQLLeaseStoreCoordinatesAndReclaimsExpiredLease(t *testing.T) { dsn := os.Getenv("PULSE_TEST_DATABASE_URL") if dsn == "" { t.Skip("PULSE_TEST_DATABASE_URL is not set") } ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() pool, err := database.NewPool(ctx, database.Config{URL: dsn, MaxConns: 4, MinConns: 1}) if err != nil { t.Fatal(err) } defer pool.Close() if err := database.Migrate(ctx, pool); err != nil { t.Fatal(err) } store := PostgresLeaseStore{Pool: pool} now := time.Date(2026, 8, 2, 5, 0, 0, 0, time.UTC) key := alert.NewID() scheduled := now first, acquired, err := store.Acquire(ctx, jobType, key, scheduled, "worker-a", now, time.Minute) if err != nil || !acquired { t.Fatalf("first acquire lease=%#v acquired=%v err=%v", first, acquired, err) } if _, acquired, err := store.Acquire(ctx, jobType, key, scheduled, "worker-b", now, time.Minute); err != nil || acquired { t.Fatalf("duplicate acquire acquired=%v err=%v", acquired, err) } if err := store.Complete(ctx, first, "completed", ""); err != nil { t.Fatal(err) } if _, acquired, err := store.Acquire(ctx, jobType, key, scheduled, "worker-b", now, time.Minute); err != nil || acquired { t.Fatalf("completed acquire acquired=%v err=%v", acquired, err) } expiredKey := alert.NewID() expired, acquired, err := store.Acquire(ctx, jobType, expiredKey, scheduled, "worker-a", now, time.Second) if err != nil || !acquired { t.Fatalf("expired first acquire=%#v acquired=%v err=%v", expired, acquired, err) } reclaimed, acquired, err := store.Acquire(ctx, jobType, expiredKey, scheduled, "worker-b", now.Add(2*time.Second), time.Minute) if err != nil || !acquired || reclaimed.JobKey != expiredKey { t.Fatalf("reclaim lease=%#v acquired=%v err=%v", reclaimed, acquired, err) } if err := store.Complete(ctx, reclaimed, "failed", "timeout"); err != nil { t.Fatal(err) } }