Files
superwork/tui/internal/tui/settings_test.go
T
2026-06-23 05:02:15 +08:00

131 lines
2.9 KiB
Go

package tui
import (
"testing"
tea "charm.land/bubbletea/v2"
"superwork-tui/internal/config"
)
func makeSettingsModel() Model {
m := Model{
state: stateLoaded,
width: 120,
height: 40,
}
return m
}
func sendCtrlS(m Model) (Model, tea.Cmd) {
next, cmd := m.Update(keyMsg("ctrl+s"))
return next.(Model), cmd
}
func TestSettingsPanelOpen(t *testing.T) {
m := makeSettingsModel()
m2, _ := sendKey(m, ",")
if m2.state != stateSettings {
t.Errorf("state = %v, want stateSettings after ','", m2.state)
}
if m2.settingsState == nil {
t.Error("settingsState should not be nil after opening")
}
}
func TestSettingsPanelEsc(t *testing.T) {
m := makeSettingsModel()
m, _ = sendKey(m, ",")
if m.state != stateSettings {
t.Fatal("precondition: should be stateSettings")
}
m2, _ := sendEsc(m)
if m2.state != stateLoaded {
t.Errorf("state = %v, want stateLoaded after esc", m2.state)
}
if m2.settingsState != nil {
t.Error("settingsState should be nil after esc (cancelled)")
}
}
func TestSettingsPanelSave_Valid(t *testing.T) {
m := makeSettingsModel()
m, _ = sendKey(m, ",")
if m.state != stateSettings {
t.Fatal("precondition: should be stateSettings")
}
saved := false
m.settingsState.saveFn = func(s *config.Settings) error {
saved = true
return nil
}
// Set a valid port in the webhook_port field (field index 0).
m.settingsState.fields[0].input.SetValue("8080")
m2, _ := sendCtrlS(m)
if !saved {
t.Error("saveFn should have been called")
}
if m2.state != stateLoaded {
t.Errorf("state = %v, want stateLoaded after save", m2.state)
}
if m2.settingsState != nil {
t.Error("settingsState should be nil after save")
}
}
func TestSettingsPanelSave_InvalidPort(t *testing.T) {
m := makeSettingsModel()
m, _ = sendKey(m, ",")
if m.state != stateSettings {
t.Fatal("precondition: should be stateSettings")
}
saved := false
m.settingsState.saveFn = func(s *config.Settings) error {
saved = true
return nil
}
m.settingsState.fields[0].input.SetValue("99999")
m2, _ := sendCtrlS(m)
if saved {
t.Error("saveFn should NOT have been called for invalid port")
}
if m2.state != stateSettings {
t.Errorf("state = %v, want stateSettings after invalid port", m2.state)
}
if m2.statusMsg == "" {
t.Error("statusMsg should contain error about invalid port")
}
}
func TestSettingsPanelSave_PortZero(t *testing.T) {
m := makeSettingsModel()
m, _ = sendKey(m, ",")
if m.state != stateSettings {
t.Fatal("precondition: should be stateSettings")
}
saved := false
m.settingsState.saveFn = func(s *config.Settings) error {
saved = true
return nil
}
m.settingsState.fields[0].input.SetValue("0")
m2, _ := sendCtrlS(m)
if saved {
t.Error("saveFn should NOT have been called for port 0")
}
if m2.state != stateSettings {
t.Errorf("state = %v, want stateSettings after port 0", m2.state)
}
if m2.statusMsg == "" {
t.Error("statusMsg should contain error about invalid port")
}
}