Спеца 12.11: интерфейс + Nil + TaskDetailText в internal/ui/task_detail.go, Fyne-реализация в internal/ui/desktop/task_detail_panel.go. selectTask делегирует в панель; диалог и «Состояние» — отдельные панели, не трогаем.
36 lines
1.2 KiB
Go
36 lines
1.2 KiB
Go
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()
|
|
} |