feat. rebuild service in Go
ci / test (pull_request) Successful in 1m54s
ci / publish (pull_request) Has been skipped

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>
This commit is contained in:
Space-Banane
2026-07-12 21:51:01 +02:00
parent fdd3819ff8
commit f19b271642
74 changed files with 2623 additions and 4819 deletions
+52
View File
@@ -0,0 +1,52 @@
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)
}
}