|
| 1 | +package cli |
| 2 | + |
| 3 | +import ( |
| 4 | + "bytes" |
| 5 | + "io" |
| 6 | + "strings" |
| 7 | + "testing" |
| 8 | + |
| 9 | + "github.com/LAA-Software-Engineering/agentic-control-plane/internal/state" |
| 10 | +) |
| 11 | + |
| 12 | +func TestResolveRunAttributionFlags_envOverrides(t *testing.T) { |
| 13 | + t.Setenv(EnvTenantID, "env-tenant") |
| 14 | + t.Setenv(EnvThreadID, "env-thread") |
| 15 | + t.Setenv(EnvActorID, "env-actor") |
| 16 | + |
| 17 | + got := resolveRunAttributionFlags("", "", "", "", "", "", "", false) |
| 18 | + if got.TenantID != "env-tenant" || got.ThreadID != "env-thread" || got.ActorID != "env-actor" { |
| 19 | + t.Fatalf("env overrides: %+v", got) |
| 20 | + } |
| 21 | + |
| 22 | + got = resolveRunAttributionFlags("flag-tenant", "", "", "", "", "", "", false) |
| 23 | + if got.TenantID != "flag-tenant" { |
| 24 | + t.Fatalf("flag wins: %+v", got) |
| 25 | + } |
| 26 | +} |
| 27 | + |
| 28 | +func TestWarnAttributionDefaults(t *testing.T) { |
| 29 | + var buf bytes.Buffer |
| 30 | + warnAttributionDefaults(&buf, state.RunAttribution{}) |
| 31 | + if !strings.Contains(buf.String(), "warning:") || !strings.Contains(buf.String(), "tenant-1") { |
| 32 | + t.Fatalf("warn: %q", buf.String()) |
| 33 | + } |
| 34 | + buf.Reset() |
| 35 | + warnAttributionDefaults(&buf, state.RunAttribution{TenantID: "t", ThreadID: "th", ActorID: "a"}) |
| 36 | + if buf.Len() != 0 { |
| 37 | + t.Fatalf("no warn expected: %q", buf.String()) |
| 38 | + } |
| 39 | +} |
| 40 | + |
| 41 | +func TestRun_requireAttributionRejectsDefaults(t *testing.T) { |
| 42 | + root := runProjRoot(t) |
| 43 | + db := t.TempDir() + "/req.db" |
| 44 | + |
| 45 | + ResetGlobalsForTest() |
| 46 | + cmd := NewRootCmd() |
| 47 | + cmd.SetOut(io.Discard) |
| 48 | + var errBuf bytes.Buffer |
| 49 | + cmd.SetErr(&errBuf) |
| 50 | + cmd.SetArgs([]string{ |
| 51 | + "run", "workflow/demo", |
| 52 | + "--project", root, |
| 53 | + "--state", db, |
| 54 | + "--input", "topic=x", |
| 55 | + "--require-attribution", |
| 56 | + }) |
| 57 | + err := cmd.Execute() |
| 58 | + if err == nil { |
| 59 | + t.Fatal("expected validation error") |
| 60 | + } |
| 61 | + if !strings.Contains(err.Error(), "attribution required") { |
| 62 | + t.Fatalf("err = %v", err) |
| 63 | + } |
| 64 | +} |
| 65 | + |
| 66 | +func TestRun_requireAttributionViaEnv(t *testing.T) { |
| 67 | + t.Setenv(EnvRequireAttribution, "1") |
| 68 | + root := runProjRoot(t) |
| 69 | + db := t.TempDir() + "/req-env.db" |
| 70 | + |
| 71 | + ResetGlobalsForTest() |
| 72 | + cmd := NewRootCmd() |
| 73 | + cmd.SetOut(io.Discard) |
| 74 | + cmd.SetErr(io.Discard) |
| 75 | + cmd.SetArgs([]string{ |
| 76 | + "run", "workflow/demo", |
| 77 | + "--project", root, |
| 78 | + "--state", db, |
| 79 | + "--input", "topic=x", |
| 80 | + }) |
| 81 | + err := cmd.Execute() |
| 82 | + if err == nil { |
| 83 | + t.Fatal("expected validation error") |
| 84 | + } |
| 85 | + if !strings.Contains(err.Error(), "attribution required") { |
| 86 | + t.Fatalf("err = %v", err) |
| 87 | + } |
| 88 | +} |
| 89 | + |
| 90 | +func TestRun_warnsOnDefaultAttribution(t *testing.T) { |
| 91 | + root := runProjRoot(t) |
| 92 | + db := t.TempDir() + "/warn.db" |
| 93 | + |
| 94 | + ResetGlobalsForTest() |
| 95 | + cmd := NewRootCmd() |
| 96 | + cmd.SetOut(io.Discard) |
| 97 | + var errBuf bytes.Buffer |
| 98 | + cmd.SetErr(&errBuf) |
| 99 | + cmd.SetArgs([]string{ |
| 100 | + "run", "workflow/demo", |
| 101 | + "--project", root, |
| 102 | + "--state", db, |
| 103 | + "--input", "topic=warn-test", |
| 104 | + }) |
| 105 | + if err := cmd.Execute(); err != nil { |
| 106 | + t.Fatal(err) |
| 107 | + } |
| 108 | + if !strings.Contains(errBuf.String(), "warning:") { |
| 109 | + t.Fatalf("stderr = %q", errBuf.String()) |
| 110 | + } |
| 111 | +} |
| 112 | + |
| 113 | +func TestEnvTruthy(t *testing.T) { |
| 114 | + t.Setenv("AGENTCTL_TEST_TRUTHY", "yes") |
| 115 | + if !envTruthy("AGENTCTL_TEST_TRUTHY") { |
| 116 | + t.Fatal("expected truthy") |
| 117 | + } |
| 118 | + t.Setenv("AGENTCTL_TEST_TRUTHY", "0") |
| 119 | + if envTruthy("AGENTCTL_TEST_TRUTHY") { |
| 120 | + t.Fatal("expected false") |
| 121 | + } |
| 122 | +} |
0 commit comments