69 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|