package ui import ( "strings" "testing" "github.com/kamelion/ratatoskr-go/internal/storage" ) // TaskDetailText — строка деталей задачи (спец 12.11), pure-функция без Fyne. func TestTaskDetailText(t *testing.T) { noRepos := storage.Task{Goal: "Понять код"} got := TaskDetailText(noRepos) if got != "Цель: Понять код" { t.Errorf("без repos: got %q", got) } if strings.Contains(got, "Репозитории") { t.Errorf("без repos не должно быть репозиториев: %q", got) } withRepos := storage.Task{Goal: "Рефакторинг", Repos: []string{"a", "b"}} got = TaskDetailText(withRepos) if !strings.Contains(got, "Цель: Рефакторинг") { t.Errorf("цель не попала: %q", got) } if !strings.Contains(got, "Репозитории: a, b") { t.Errorf("репозитории не попали: %q", got) } } // NilTaskDetailPanel — no-op контракт (спец 12.8): безопасно для headless/тестов. func TestNilTaskDetailPanelNoop(t *testing.T) { p := NewNilTaskDetailPanel() p.ShowTask(storage.Task{ID: 1, Goal: "x"}) p.ShowEmpty() }