Спеца 12.13: интерфейс + Nil + чистые хелперы (StateText/TraceLine/ ActivityLine/TaskStatusText/StatusBadge/Itoa) в internal/ui/state_panel.go, Fyne-реализация в internal/ui/desktop/state_panel.go. window.go — чистая компоновка: все 5 панелей вынесены как контракты.
50 lines
1.6 KiB
Go
50 lines
1.6 KiB
Go
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("строка")
|
|
} |