f19b271642
Rebuild the Gitea Codex review bot from the product contract with a Go HTTP service, durable SQL queue, typed Gitea client, isolated runner, and deployment updates. Co-Authored-By: Claude <noreply@anthropic.com>
53 lines
1.8 KiB
Go
53 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|