package sqlstore import ( "context" "testing" "time" "gitea-codex-bot/internal/config" "gitea-codex-bot/internal/domain" ) func TestSQLiteMigrationsAndJobLifecycle(t *testing.T) { settings := config.Settings{DatabaseURL: "sqlite://" + t.TempDir() + "/test.db"} st, err := Open(settings) if err != nil { t.Fatal(err) } defer st.Close() ctx := context.Background() if err := st.Migrate(ctx); err != nil { t.Fatal(err) } event := domain.WebhookEvent{EventName: "issue_comment", DeliveryID: "d1", Repo: "acme/repo", PRNumber: 9, HeadSHA: "abc123", CommentID: 11, CommentBody: "@codex review", Sender: "alice", PayloadSHA256: "digest"} inserted, err := st.InsertWebhookEvent(ctx, event) if err != nil || !inserted { t.Fatalf("insert event: %v %v", inserted, err) } duplicate, err := st.InsertWebhookEvent(ctx, event) if err != nil || duplicate { t.Fatalf("duplicate event result: %v %v", duplicate, err) } job, err := st.EnqueueJob(ctx, event, domain.ParsedCommand{Name: "review", Raw: event.CommentBody, Mode: "summary"}) if err != nil { t.Fatal(err) } claimed, run, err := st.ClaimNextJob(ctx, time.Now().UTC(), 5*time.Minute, 2) if err != nil || claimed == nil || run == nil { t.Fatalf("claim: %#v %#v %v", claimed, run, err) } result := domain.ReviewResult{Verdict: "correct", Confidence: 1, Summary: "ok", Findings: []domain.Finding{}} if err := st.FinishJob(ctx, job.ID, run.ID, true, false, &result, nil); err != nil { t.Fatal(err) } latest, err := st.LatestJob(ctx) if err != nil || latest == nil || latest.Status != domain.JobSucceeded { t.Fatalf("latest: %#v %v", latest, err) } remaining, err := st.CooldownRemaining(ctx, event.Repo, event.PRNumber, time.Minute) if err != nil || remaining <= 0 { t.Fatalf("cooldown: %d %v", remaining, err) } }