package ui import ( "strings" "testing" "github.com/kamelion/ratatoskr-go/internal/events" "github.com/kamelion/ratatoskr-go/internal/model" "github.com/kamelion/ratatoskr-go/internal/storage" ) // StateText — снимок трасс (спец 12.13), pure-функция без Fyne. func TestStateText(t *testing.T) { got := StateText(nil) if !strings.Contains(got, "Нет активных агентов.") { t.Errorf("пусто: got %q", got) } tr := storage.Trace{Agent: "analyst", Status: model.TraceRunning, SessionID: "s1"} got = StateText([]storage.Trace{tr}) if !strings.Contains(got, "ANALYST: running") { t.Errorf("агент/статус не попали: %q", got) } if !strings.Contains(got, "session s1") { t.Errorf("session не попала: %q", got) } } // Live-строки — чистые хелперы. func TestStateLines(t *testing.T) { if TraceLine("analyst", model.TraceRunning) != "ANALYST: running" { t.Errorf("TraceLine: %q", TraceLine("analyst", model.TraceRunning)) } if ActivityLine("dev", "review") != "DEV → review" { t.Errorf("ActivityLine: %q", ActivityLine("dev", "review")) } e := events.TaskStatusChanged{ID: 7, From: model.StatusRunning, To: model.StatusSuccess} got := TaskStatusText(e) if !strings.Contains(got, "✅") || !strings.Contains(got, "#7") { t.Errorf("TaskStatusText: %q", got) } } // NilStatePanel — no-op контракт (спец 12.8): безопасно для headless/тестов. func TestNilStatePanelNoop(t *testing.T) { p := NewNilStatePanel() p.SetText("снимок") p.Append("строка") }