X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/2124c559da8f164a43a3da987b399b6ac6125035..195c3fbb075383ac47bba310eb701b02774e8d10:/schedule_test.go?ds=inline diff --git a/schedule_test.go b/schedule_test.go index 6610c26..cb839d5 100644 --- a/schedule_test.go +++ b/schedule_test.go @@ -7,6 +7,7 @@ import ( "strings" "sync" "testing" + "testing/synctest" "time" "github.com/stretchr/testify/require" @@ -251,6 +252,9 @@ func TestSchedulesRunStartsATurnWhenDue(t *testing.T) { require.NoError(t, err) clock.Set(clock.Now().Add(5 * time.Minute)) + + schedules.changed <- struct{}{} + test.events.WaitFor(t, "idle", 1) require.Equal(t, 1, server.Calls()) @@ -295,7 +299,6 @@ func TestDaemonRunsADueSchedule(t *testing.T) { schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), "OneChat", clock.Now, discardLog()) require.NoError(t, err) - schedules.check = time.Millisecond whatsapp, _, _ := whatsappStartTest(t, t.TempDir(), newTestClock()) socket, _ := daemonStartTestWithSchedules(t, newModelFake(t), nil, whatsapp, schedules, clock.Now) client := terminalStartTestClient(t, socket) @@ -305,9 +308,43 @@ func TestDaemonRunsADueSchedule(t *testing.T) { require.NoError(t, err) clock.Set(clock.Now().Add(5 * time.Minute)) + + schedules.changed <- struct{}{} + client.WaitFor(t, "[Schedule 1] Sunday 2026-11-08 20:05 -03:00, once\nRemind the user to drink water.\n"+scheduleEmptyReply+"\n[working]\na line\n[done]") } +func TestSchedulesCheckTheClockAfterItsWaitLimit(t *testing.T) { + synctest.Test(t, func(t *testing.T) { + whatsapp, _, _ := whatsappStartTest(t, t.TempDir(), newTestClock()) + loop, events := newTestIdleTurnLoop(t, whatsapp) + clock := &ScheduleTestClock{now: time.Now()} + schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), "OneChat", clock.Now, discardLog()) + require.NoError(t, err) + + _, err = schedules.Set("Check the clock.", new(clock.Now().Add(5*time.Minute).Format(scheduleAtLayout)), nil) + require.NoError(t, err) + + ctx, cancel := context.WithCancel(t.Context()) + defer cancel() + + done := make(chan error, 1) + go func() { + done <- schedules.Run(ctx, loop) + }() + + synctest.Wait() + require.Zero(t, loop.memory.Len()) + clock.Set(clock.Now().Add(5 * time.Minute)) + time.Sleep(scheduleClockWaitTimeout) + synctest.Wait() + require.Equal(t, 1, loop.memory.Len()) + require.Contains(t, events.Last("work"), "Check the clock.") + cancel() + require.NoError(t, <-done) + }) +} + func TestToolboxRunsTheScheduleTools(t *testing.T) { schedules, _ := scheduleTestOpen(t) box := &Toolbox{ @@ -396,11 +433,10 @@ func scheduleTestOpen(t *testing.T) (*Schedules, string) { } // scheduleTestRun runs schedules in a new turn loop that calls server, until -// the test ends. Run looks at the times every millisecond. +// the test ends. func scheduleTestRun(t *testing.T, schedules *Schedules, server *ModelFake) *TurnTestLoop { t.Helper() - schedules.check = time.Millisecond test := newTestTurnLoop(t, server) ctx, cancel := context.WithCancel(t.Context()) done := make(chan error)