Files
neural-hunt/internal/data/successor_test.go
2026-08-10 16:20:59 +02:00

69 lines
2.4 KiB
Go

package data
import (
"context"
"testing"
"neuralhunt/internal/auth"
)
func TestSuccessorInheritsTaskConfigAndSelection(t *testing.T) {
ctx := context.Background()
db, err := OpenSQLite(ctx, t.TempDir()+"/test.db")
if err != nil {
t.Fatal(err)
}
defer db.Close()
s := New(db)
if err := s.EnsureActiveTasks(ctx, 1, 40); err != nil {
t.Fatal(err)
}
ts, err := s.ActiveTasks(ctx)
if err != nil || len(ts) != 1 {
t.Fatalf("active tasks: len=%d err=%v", len(ts), err)
}
pred := ts[0]
if err := s.UpdateTaskConfig(ctx, pred.ID, "Prime Field", "Beschreibung", "winner in crystalline neural lattice", "no text"); err != nil {
t.Fatal(err)
}
if err := s.SetTaskStyleReference(ctx, pred.ID, "abc123.jpg"); err != nil {
t.Fatal(err)
}
if err := s.SetTaskIntervals(ctx, pred.ID, 13, 14); err != nil {
t.Fatal(err)
}
jwk := auth.PublicJWK{Kty: "EC", Crv: "P-256", X: "AQ", Y: "Ag"}
// UpsertClient stores the JWK without validating its curve; crypto validation
// belongs to auth handlers and is irrelevant to this persistence test.
if err := s.UpsertClient(ctx, "client_test", jwk); err != nil {
t.Fatal(err)
}
if err := s.SetClientTaskSelection(ctx, "client_test", pred.ID); err != nil {
t.Fatal(err)
}
if err := s.CloseTask(ctx, pred.ID); err != nil {
t.Fatal(err)
}
next, err := s.EnsureSuccessorTask(ctx, pred.ID, 32)
if err != nil {
t.Fatal(err)
}
if next.ParentTaskID == nil || *next.ParentTaskID != pred.ID {
t.Fatalf("parent mismatch: %#v", next.ParentTaskID)
}
if next.RangeBits != 40 || next.DisplayName != "Prime Field" || next.Description != "Beschreibung" || next.NFTPromptInstructions != "winner in crystalline neural lattice" || next.NFTNegativePrompt != "no text" || next.NFTStyleReference != "abc123.jpg" {
t.Fatalf("successor did not inherit config: %+v", next)
}
if next.GuessMinIntervalSec == nil || *next.GuessMinIntervalSec != 13 || next.ClientSubmitIntervalSec == nil || *next.ClientSubmitIntervalSec != 14 {
t.Fatalf("successor did not inherit intervals: %+v", next)
}
selected, err := s.SelectedTaskID(ctx, "client_test")
if err != nil || selected != next.ID {
t.Fatalf("selection was not migrated: selected=%q next=%q err=%v", selected, next.ID, err)
}
again, err := s.EnsureSuccessorTask(ctx, pred.ID, 32)
if err != nil || again.ID != next.ID {
t.Fatalf("successor must be idempotent: first=%q second=%q err=%v", next.ID, again.ID, err)
}
}