package app import ( "bytes" "strings" "testing" ) func TestExecuteValidCommands(t *testing.T) { cases := []struct { name string args []string wantOut string }{ {name: "run", args: []string{"run"}, wantOut: "narratio run: not yet implemented"}, {name: "plan", args: []string{"plan"}, wantOut: "narratio plan: not yet implemented"}, {name: "status", args: []string{"status"}, wantOut: "narratio status: not yet implemented"}, {name: "resume", args: []string{"resume"}, wantOut: "narratio resume: not yet implemented"}, {name: "run-stage", args: []string{"run-stage", "polish"}, wantOut: "narratio run-stage: not yet implemented"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { var stdout bytes.Buffer var stderr bytes.Buffer code := Execute(tc.args, &stdout, &stderr) if code != 0 { t.Fatalf("exit code = %d, want 0", code) } if stderr.Len() != 0 { t.Fatalf("stderr = %q, want empty", stderr.String()) } if !strings.Contains(stdout.String(), tc.wantOut) { t.Fatalf("stdout = %q, want to contain %q", stdout.String(), tc.wantOut) } }) } } func TestExecuteInvalidCommand(t *testing.T) { var stdout bytes.Buffer var stderr bytes.Buffer code := Execute([]string{"bogus"}, &stdout, &stderr) if code == 0 { t.Fatalf("exit code = 0, want non-zero") } if stdout.Len() != 0 { t.Fatalf("stdout = %q, want empty", stdout.String()) } out := stderr.String() if !strings.Contains(out, "unknown command") { t.Fatalf("stderr = %q, want unknown command message", out) } if !strings.Contains(out, "Usage: narratio") { t.Fatalf("stderr = %q, want usage message", out) } } func TestExecuteMissingCommand(t *testing.T) { var stdout bytes.Buffer var stderr bytes.Buffer code := Execute(nil, &stdout, &stderr) if code == 0 { t.Fatalf("exit code = 0, want non-zero") } if stdout.Len() != 0 { t.Fatalf("stdout = %q, want empty", stdout.String()) } if !strings.Contains(stderr.String(), "Usage: narratio") { t.Fatalf("stderr = %q, want usage message", stderr.String()) } }