refactor(ui): вынести панель «Детали задачи» (TaskDetailPanel) из монолита окна
Спеца 12.11: интерфейс + Nil + TaskDetailText в internal/ui/task_detail.go, Fyne-реализация в internal/ui/desktop/task_detail_panel.go. selectTask делегирует в панель; диалог и «Состояние» — отдельные панели, не трогаем.
This commit is contained in:
36
internal/ui/task_detail_test.go
Normal file
36
internal/ui/task_detail_test.go
Normal file
@@ -0,0 +1,36 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user