]> git.giacomolli.uk - onechat/blobdiff - schedule_test.go
Show stored images to the user
[onechat] / schedule_test.go
index 6610c26b141a83a3f99bbc9f4a38946206c73f19..cb839d5f95351d810c38a344319da5f3e8424bd6 100644 (file)
@@ -7,6 +7,7 @@ import (
        "strings"
        "sync"
        "testing"
        "strings"
        "sync"
        "testing"
+       "testing/synctest"
        "time"
 
        "github.com/stretchr/testify/require"
        "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))
        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())
 
        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, 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)
        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))
        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]")
 }
 
        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{
 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
 }
 
 // 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()
 
 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)
        test := newTestTurnLoop(t, server)
        ctx, cancel := context.WithCancel(t.Context())
        done := make(chan error)