okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

dawntui: /extensions on listView: filter, details beside the list, enter for global and shift+enter for this session647d18b

main
1.6 KiB50 linesraw
1// TUI routing and in-flight save rendering cannot be exercised by daemon E2E
2// tests. These checks keep display text from controlling either state machine.
3package tui
4
5import (
6	"albedo/cli/internal/daemon"
7	"errors"
8	"fmt"
9	"strings"
10	"testing"
11
12	tea "charm.land/bubbletea/v2"
13	"github.com/charmbracelet/x/ansi"
14)
15
16func TestCatalogFailureUsesErrorIdentity(t *testing.T) {
17	for _, tc := range []struct {
18		err  error
19		show bool
20	}{
21		{fmt.Errorf("catalog: %w", &daemon.UpgradeRequiredError{Feature: "for commands"}), true},
22		{errors.New("unrelated service needs an update"), false},
23	} {
24		m := &AppModel{}
25		next, _ := m.Update(commandCatalogLoadedMsg{Err: tc.err})
26		if next.(*AppModel).Notices.HasError() != tc.show {
27			t.Fatalf("catalog failure was routed using its wording: %v", tc.err)
28		}
29	}
30}
31
32func TestExtensionSaveHidesConfirmationUntilFailure(t *testing.T) {
33	m := NewExtensionPickerModel(nil, "session")
34	m.Loading = false
35	m.SetSize(80, 20)
36	m.setExtensions([]ExtensionItem{{Name: "webhooks"}})
37	m, _ = m.Update(tea.KeyPressMsg{Code: tea.KeyEnter, Mod: tea.ModShift})
38	m, cmd := m.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
39	if !m.Saving || cmd == nil {
40		t.Fatal("confirmation did not start the save")
41	}
42	view := ansi.Strip(m.View())
43	if !strings.Contains(view, "saving") || strings.Contains(view, "cancel") || strings.Contains(view, "confirm") {
44		t.Fatalf("in-flight save still offers confirmation: %s", view)
45	}
46	m, _ = m.Update(extensionToggledMsg{Gen: m.Generation, Err: errors.New("save failed")})
47	if m.Saving || !m.Confirming() || !strings.Contains(ansi.Strip(m.View()), "retry") {
48		t.Fatal("failed save did not restore the retry prompt")
49	}
50}