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) } }