Files
MujicaUI/snooze_picker_test.go
T

122 lines
3.4 KiB
Go

package mujica
import (
"slices"
"testing"
"time"
"github.com/egoist/mygo/ui"
)
func TestSnoozeChoicesPreserveWallHour(t *testing.T) {
loc, err := time.LoadLocation("America/New_York")
if err != nil {
t.Fatal(err)
}
for _, now := range []time.Time{
time.Date(2026, 3, 7, 14, 0, 0, 0, loc),
time.Date(2026, 10, 31, 14, 0, 0, 0, loc),
} {
choices := SnoozeChoices(now, 9)
if at := choices[1].At; at.Hour() != 9 || at.Day() != now.AddDate(0, 0, 1).Day() {
t.Fatalf("tomorrow wall time: %v", at)
}
}
}
func TestSnoozeChoices(t *testing.T) {
wed := time.Date(2026, 10, 7, 14, 20, 0, 0, time.UTC)
got := SnoozeChoices(wed, 9)
want := []SnoozeChoice{
{"snooze_picker.later", time.Date(2026, 10, 7, 17, 0, 0, 0, time.UTC)},
{"snooze_picker.tomorrow", time.Date(2026, 10, 8, 9, 0, 0, 0, time.UTC)},
{"snooze_picker.weekend", time.Date(2026, 10, 10, 9, 0, 0, 0, time.UTC)},
{"snooze_picker.nextWeek", time.Date(2026, 10, 12, 9, 0, 0, 0, time.UTC)},
}
if !slices.Equal(got, want) {
t.Fatalf("choices %v", got)
}
late := SnoozeChoices(time.Date(2026, 10, 10, 22, 0, 0, 0, time.UTC), 9)
if len(late) != 2 || late[0].Key != "snooze_picker.tomorrow" {
t.Fatalf("Saturday night %v", late)
}
}
func TestSnoozePickerChoose(t *testing.T) {
var until time.Time
n := 0
tt := ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
if SnoozePicker(c, &until, SnoozePickerOptions{Location: time.UTC}).Changed() {
n++
}
}, 500, 600)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeyEnter)
now := time.Now().UTC()
tomorrow := time.Date(now.Year(), now.Month(), now.Day()+1, 9, 0, 0, 0, time.UTC)
later := now.Add(3 * time.Hour).Truncate(time.Hour)
want := tomorrow
if later.Day() != now.Day() {
want = SnoozeChoices(now, 9)[1].At
}
if !until.Equal(want) || n != 1 {
t.Fatalf("until %v, want %v", until, want)
}
if err := tt.Click("Pick date and time"); err != nil {
t.Fatal(err)
}
if !tt.HasText("Snooze") {
t.Fatal("custom picker not shown")
}
mediaPanics(t, "hour", func(c *ui.Context) { SnoozePicker(c, &until, SnoozePickerOptions{MorningHour: 30}) })
}
func TestSnoozePickerSnapshot(t *testing.T) {
until := time.Time{}
snapshot(t, "snooze_picker", 340, 260, func(c *ui.Context) {
ui.Column(c).Padding(20).Children(func() {
SnoozePicker(c, &until, SnoozePickerOptions{Location: time.UTC, Now: time.Date(2026, 10, 7, 14, 20, 0, 0, time.UTC)})
})
})
}
func TestSnoozePickerCustomCommitAndDisabled(t *testing.T) {
now := time.Date(2026, 10, 7, 14, 20, 0, 0, time.UTC)
var until time.Time
disabled, changes := false, 0
tt := ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
if SnoozePicker(c, &until, SnoozePickerOptions{Now: now, Location: time.UTC, Disabled: disabled}).Changed() {
changes++
}
}, 500, 640)
for _, label := range []string{"Pick date and time", "2026-10-07 17:00 UTC", "Time: Hours"} {
if err := tt.Click(label); err != nil {
t.Fatal(err)
}
}
tt.Key(0, ui.KeyUp)
if err := tt.Click("Confirm"); err != nil {
t.Fatal(err)
}
if !until.IsZero() || changes != 0 {
t.Fatal("custom draft committed before Snooze")
}
if err := tt.Click("Snooze"); err != nil {
t.Fatal(err)
}
want := time.Date(2026, 10, 7, 18, 0, 0, 0, time.UTC)
if !until.Equal(want) || changes != 1 {
t.Fatalf("until=%v changes=%d", until, changes)
}
disabled = true
tt.Frame()
_ = tt.Click("Tomorrow")
tt.Key(0, ui.KeyEnter)
if !until.Equal(want) || changes != 1 {
t.Fatal("disabled snooze changed")
}
}