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 не вызывает колбэки — нет виджета, но вызовы безопасны. }