refactor(ui): вынести панель «Список задач» (TaskListPanel) из монолита окна
Спеца 12.10: интерфейс + Nil + TaskTitle в internal/ui/task_list_panel.go, Fyne-реализация в internal/ui/desktop/task_list_panel.go. Состояние выбора живёт в окне; выбранная строка подсвечивается (Select/Unselect).
This commit is contained in:
40
internal/ui/task_list_panel_test.go
Normal file
40
internal/ui/task_list_panel_test.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/kamelion/ratatoskr-go/internal/storage"
|
||||
)
|
||||
|
||||
// TaskTitle — строка в списке задач (спец 12.10), pure-функция без Fyne.
|
||||
func TestTaskTitle(t *testing.T) {
|
||||
empty := storage.Task{Status: storage.StatusReady}
|
||||
got := TaskTitle(empty)
|
||||
if !strings.Contains(got, "(без названия)") {
|
||||
t.Errorf("пустое название: got %q, want «(без названия)»", got)
|
||||
}
|
||||
if !strings.Contains(got, string(storage.StatusReady)) {
|
||||
t.Errorf("строка должна содержать статус, got %q", got)
|
||||
}
|
||||
|
||||
named := storage.Task{Title: "Тест", Status: storage.StatusRunning}
|
||||
got = TaskTitle(named)
|
||||
if !strings.Contains(got, "Тест") {
|
||||
t.Errorf("название не попало в строку: %q", got)
|
||||
}
|
||||
if !strings.Contains(got, string(storage.StatusRunning)) {
|
||||
t.Errorf("статус не попал в строку: %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
// NilTaskListPanel — no-op контракт (спец 12.8): безопасно для headless/тестов.
|
||||
func TestNilTaskListPanelNoop(t *testing.T) {
|
||||
p := NewNilTaskListPanel()
|
||||
p.SetTasks([]storage.Task{{ID: 1}})
|
||||
p.Select(1)
|
||||
|
||||
var got []int64
|
||||
p.OnSelect(func(id int64) { got = append(got, id) })
|
||||
// Nil не вызывает колбэки — нет виджета, но вызовы безопасны.
|
||||
}
|
||||
Reference in New Issue
Block a user