package app import ( "bytes" "context" "os" "path/filepath" "strings" "testing" "time" "gitea.maximumdirect.net/eric/narratio/internal/manifest" ) func TestStatusCommandReadsManifest(t *testing.T) { manifestPath := writeManifestForStatus(t) var out bytes.Buffer err := Status(context.Background(), []string{"--manifest", manifestPath}, &out) if err != nil { t.Fatalf("Status() error = %v", err) } s := out.String() if !strings.Contains(s, "session_id: 2026-05-03") { t.Fatalf("output = %q, want session_id", s) } if !strings.Contains(s, "- merge: succeeded") { t.Fatalf("output = %q, want stage status", s) } } func TestStatusCommandMissingManifestFlag(t *testing.T) { var out bytes.Buffer err := Status(context.Background(), nil, &out) if err == nil { t.Fatal("expected error, got nil") } if !strings.Contains(err.Error(), "--manifest is required") { t.Fatalf("error = %q, want missing manifest flag", err.Error()) } } func TestStatusCommandBadManifest(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "manifest.json") if err := os.WriteFile(path, []byte("{not-json"), 0o644); err != nil { t.Fatalf("WriteFile() error = %v", err) } var out bytes.Buffer err := Status(context.Background(), []string{"--manifest", path}, &out) if err == nil { t.Fatal("expected error, got nil") } if !strings.Contains(err.Error(), "decode manifest") { t.Fatalf("error = %q, want decode error", err.Error()) } } func writeManifestForStatus(t *testing.T) string { t.Helper() store := &manifest.LocalStore{} m := manifest.New("2026-05-03", time.Date(2026, 5, 3, 10, 0, 0, 0, time.UTC)) m.MarkStageSucceeded("merge", time.Date(2026, 5, 3, 10, 5, 0, 0, time.UTC), nil) path := filepath.Join(t.TempDir(), "manifest.json") if err := store.Save(context.Background(), path, m); err != nil { t.Fatalf("Save() error = %v", err) } return path }