79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|