package workflowrun import ( "context" "testing" "time" "inbox/internal/app/runtimeconfig" "inbox/internal/base/timeutil" "inbox/internal/domain/role" "inbox/internal/domain/workflow" sqlitestore "inbox/internal/store/sqlite" ) func TestStartCreatesRunWithConfigSnapshot(t *testing.T) { ctx := context.Background() clock := timeutil.FixedClock{Time: time.Date(2026, 3, 13, 17, 0, 0, 0, time.UTC)} store, err := sqlitestore.OpenInMemory(clock) if err != nil { t.Fatalf("OpenInMemory() error = %v", err) } defer store.Close() workspaceRoot := t.TempDir() now := timeutil.FormatRFC3339(clock.Now()) if _, err := store.DB().Exec(` INSERT INTO projects(id, slug, name, root_path, default_branch, status, created_at, updated_at) VALUES('proj_1', 'proj', 'Project', ?, 'main', 'active', ?, ?) `, workspaceRoot, now, now); err != nil { t.Fatalf("insert project: %v", err) } if _, err := store.DB().Exec(` INSERT INTO workspaces(id, project_id, slug, name, root_path, base_branch, worktree_branch, runtime_backend, status, created_at, updated_at) VALUES('ws_1', 'proj_1', 'main', 'Main', ?, 'main', 'worktree/main', 'local', 'active', ?, ?) `, workspaceRoot, now, now); err != nil { t.Fatalf("insert workspace: %v", err) } if _, err := store.UpsertRole(ctx, role.Definition{ Name: "backend", Title: "Backend", IsEnabled: true, IsBuiltin: true, }, "seed"); err != nil { t.Fatalf("UpsertRole() error = %v", err) } if _, err := store.UpsertRoleConfig(ctx, role.Config{ RoleName: "backend", ConfigTOML: "model = \"gpt-5.4\"", AuthJSON: "{\"OPENAI_API_KEY\":\"token-1\"}", }, "seed"); err != nil { t.Fatalf("UpsertRoleConfig() error = %v", err) } if _, err := store.DB().Exec(` INSERT INTO topics(id, workspace_id, slug, title, space, status, created_at, updated_at) VALUES('topic_1', 'ws_1', 'signup', 'Signup', 'workflow', 'execution', ?, ?) `, now, now); err != nil { t.Fatalf("insert topic: %v", err) } resolver := runtimeconfig.NewService(store, store, clock) service := NewService(store, resolver, clock) run, err := service.Start(ctx, workflow.Run{ WorkspaceID: "ws_1", TopicID: "topic_1", RoleName: "backend", Stage: workflow.StageExecution, Mode: "once", }) if err != nil { t.Fatalf("Start() error = %v", err) } if run.ConfigSnapshotJSON == "" || run.ConfigSnapshotJSON == "{}" { t.Fatalf("expected non-empty config snapshot, got %q", run.ConfigSnapshotJSON) } if run.Status != workflow.RunStatusRunning { t.Fatalf("expected running status, got %q", run.Status) } }