refactor(ui): вынести панель «Состояние» (StatePanel) из монолита окна
Спеца 12.13: интерфейс + Nil + чистые хелперы (StateText/TraceLine/ ActivityLine/TaskStatusText/StatusBadge/Itoa) в internal/ui/state_panel.go, Fyne-реализация в internal/ui/desktop/state_panel.go. window.go — чистая компоновка: все 5 панелей вынесены как контракты.
This commit is contained in:
50
internal/ui/state_panel_test.go
Normal file
50
internal/ui/state_panel_test.go
Normal file
@@ -0,0 +1,50 @@
|
||||
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("строка")
|
||||
}
|
||||
Reference in New Issue
Block a user