// Queued and failed continue events must not corrupt the TUI transcript. package tui import ( "errors" "strings" "testing" "time" "albedo/cli/internal/daemon" tea "charm.land/bubbletea/v2" "github.com/charmbracelet/x/ansi" ) func TestDotContinueDoesNotAppearInUI(t *testing.T) { m := newTestChatModel(t, &daemon.Session{ID: "s"}) m.SetSize(80, 30) m.appendSettledEntry(HistoryEntry{Kind: EntryAssistant, Speaker: "albedo", Text: "ready", Timestamp: time.Now().UnixMilli() - 1000}) var cmds []tea.Cmd m.submitInput(".", &cmds) if len(m.pendingUsers) != 0 { t.Fatalf("expected 0 pending users for dot continue, got %d", len(m.pendingUsers)) } if len(m.pendingRows()) != 0 { t.Fatalf("expected 0 pending rows for dot continue, got %d", len(m.pendingRows())) } afterView := ansi.Strip(m.Viewport.View()) if strings.Contains(afterView, "│ .") || strings.Contains(afterView, "│ continue") || strings.Contains(afterView, "│ you") { t.Fatalf("transcript should not contain dot or continue prompt:\n%s", afterView) } if !m.isSending { t.Fatal("expected isSending to be true") } if len(cmds) == 0 { t.Fatal("expected cmds to be returned for continue submission") } } func TestDotContinueErrorDoesNotCorruptPendingUsers(t *testing.T) { m := newTestChatModel(t, &daemon.Session{ID: "s"}) m.pendingUsers = []PendingUserTurn{{Text: "real user prompt", At: time.Now().UnixMilli()}} m.TextArea.SetValue("") errMsg := ChatTurnSentMsg{ SessionID: "s", Generation: m.Generation, Prompt: ".", Continue: true, Err: errors.New("network failure"), } um, _ := m.Update(errMsg) if len(um.pendingUsers) != 1 || um.pendingUsers[0].Text != "real user prompt" { t.Fatalf("pending user turn was corrupted or popped: %+v", um.pendingUsers) } if um.TextArea.Value() == "." { t.Fatalf("text area was overwritten with dot: %q", um.TextArea.Value()) } } func TestMessageSubmitClearsTurnFailed(t *testing.T) { m := newTestChatModel(t, &daemon.Session{ID: "s"}) m.SetSize(80, 30) m.TurnFailed = true m.Stopped = true var cmds []tea.Cmd m.submitInput("retry prompt", &cmds) if m.TurnFailed { t.Fatal("expected TurnFailed to be false after submitting input") } if m.Stopped { t.Fatal("expected Stopped to be false after submitting input") } if !m.isSending || len(m.pendingUsers) != 1 || m.pendingUsers[0].Text != "retry prompt" || len(cmds) == 0 { t.Fatal("retry did not start a new submission") } } func TestDotContinueClearsTurnFailed(t *testing.T) { m := newTestChatModel(t, &daemon.Session{ID: "s"}) m.SetSize(80, 30) m.TurnFailed = true m.Stopped = true var cmds []tea.Cmd m.submitInput(".", &cmds) if m.TurnFailed { t.Fatal("expected TurnFailed to be false after submitting dot continue") } if m.Stopped { t.Fatal("expected Stopped to be false after submitting dot continue") } if !m.isSending || len(cmds) == 0 { t.Fatal("continue did not start a new submission") } }