// Page secret actions must mask typed input with EchoPassword and never leak plaintext in views. // Echo masking and view rendering live purely inside Bubble Tea models; // E2E lacks a PTY harness to observe unsubmitted keystroke echo. package tui import ( "albedo/cli/internal/daemon" "strings" "testing" "charm.land/bubbles/v2/textinput" tea "charm.land/bubbletea/v2" ) func TestPageSecretInputIsMasked(t *testing.T) { doc := &PageDocument{Title: "webhooks", Actions: []PageAction{ {ID: "rotate", Key: "ctrl+t", Label: "rotate", Fields: []daemon.FormField{{Name: "secret", Label: "replacement", Type: "secret", Required: true}}}, }} m := NewPageViewModel(nil, "session", "/webhooks") m.setDoc(doc) m.Busy = false m.SetSize(80, 24) m, _ = m.Update(tea.KeyPressMsg{Code: 't', Mod: tea.ModCtrl}) if m.Mode != modeText || m.TextInput.EchoMode != textinput.EchoPassword { t.Fatalf("secret action should mask input: %+v", m) } m.TextInput.SetValue("sensitive-signing-key") if strings.Contains(m.View(), "sensitive-signing-key") { t.Fatal("secret was rendered on the page") } }