+ require.NoError(t, os.WriteFile(path, []byte(`{"next":2,"schedules":[{"id":1,"text":"Remind the user to call.","cron":"","due":"2026-11-08T09:00:00-03:00"},{"id":2,"text":"Tell the user the time.","cron":"0 * * * *","due":"2026-11-08T10:00:00-03:00"}]}`), 0o600))
+
+ clock := &ScheduleTestClock{
+ now: time.Date(2026, time.November, 8, 20, 30, 0, 0, time.FixedZone("", -3*60*60)),
+ }
+
+ logs := &SyncBuffer{}
+ schedules, err := openSchedules(path, clock.Now, log.New(logs, "", 0))
+ require.NoError(t, err)
+
+ server := newModelFake(t)
+ test := scheduleTestRun(t, schedules, server)
+ test.events.WaitFor(t, "idle", 1)
+ require.Equal(t, 1, server.Calls())
+
+ texts := turnInputTexts(t, server.Call(0))
+ require.Equal(t, []string{
+ "[Schedule 1] Sunday 2026-11-08 09:00 -03:00, once\nRemind the user to call.\n" + scheduleLateLine + "\n" + scheduleEmptyReply,
+ "[Schedule 2] Sunday 2026-11-08 10:00 -03:00, repeats 0 * * * *\nTell the user the time.\n" + scheduleLateLine + "\n" + scheduleEmptyReply,
+ }, texts[len(texts)-2:])
+ require.Equal(t, "2 | Sunday 2026-11-08 21:00 -03:00 | 0 * * * * | Tell the user the time.", schedules.List())
+ require.Equal(t, "schedule 1 ran 11h30m0s late\nschedule 2 ran 10h30m0s late\n", logs.String())
+}
+
+func TestDaemonRunsADueSchedule(t *testing.T) {
+ clock := &ScheduleTestClock{