X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/2ad578a24f252706976cddb41bee6cc969f251cd..2124c559da8f164a43a3da987b399b6ac6125035:/schedule_test.go?ds=sidebyside diff --git a/schedule_test.go b/schedule_test.go index 3048d75..6610c26 100644 --- a/schedule_test.go +++ b/schedule_test.go @@ -128,7 +128,7 @@ func TestSchedulesSurviveARestart(t *testing.T) { require.NoError(t, err) require.Equal(t, os.FileMode(0o600), info.Mode().Perm()) - reopened, err := openSchedules(path, schedules.clock, discardLog()) + reopened, err := openSchedules(path, "OneChat", schedules.clock, discardLog()) require.NoError(t, err) require.Equal(t, "2 | Monday 2026-11-09 08:00 -03:00 | 0 8 * * 1-5 | Tell the user the news.", reopened.List()) @@ -231,7 +231,7 @@ func TestOpenSchedulesRefusesABadCron(t *testing.T) { path := filepath.Join(t.TempDir(), scheduleFileName) require.NoError(t, os.WriteFile(path, []byte(`{"next":1,"schedules":[{"id":1,"text":"x","cron":"* * * * *","due":"2026-11-09T09:00:00-03:00"}]}`), 0o600)) - _, err := openSchedules(path, time.Now, discardLog()) + _, err := openSchedules(path, "OneChat", time.Now, discardLog()) require.ErrorContains(t, err, "schedule 1: the runs of") } @@ -241,7 +241,7 @@ func TestSchedulesRunStartsATurnWhenDue(t *testing.T) { } logs := &SyncBuffer{} - schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), clock.Now, daemonTestLogger(logs)) + schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), "OneChat", clock.Now, daemonTestLogger(logs)) require.NoError(t, err) server := newModelFake(t) @@ -270,7 +270,7 @@ func TestSchedulesRunMissedSchedulesOnceAtTheStart(t *testing.T) { } logs := &SyncBuffer{} - schedules, err := openSchedules(path, clock.Now, daemonTestLogger(logs)) + schedules, err := openSchedules(path, "OneChat", clock.Now, daemonTestLogger(logs)) require.NoError(t, err) server := newModelFake(t) @@ -292,7 +292,7 @@ func TestDaemonRunsADueSchedule(t *testing.T) { now: time.Date(2026, time.November, 8, 20, 0, 0, 0, time.FixedZone("", -3*60*60)), } - schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), clock.Now, discardLog()) + schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), "OneChat", clock.Now, discardLog()) require.NoError(t, err) schedules.check = time.Millisecond @@ -329,6 +329,36 @@ func TestSubagentHasNoScheduleTools(t *testing.T) { require.Equal(t, `error: unknown tool "schedule_remove"`, box.run(t.Context(), "schedule_remove", `{"id":1}`)) } +func TestSchedulesKeepTheirOwnerAcrossRestart(t *testing.T) { + path := filepath.Join(t.TempDir(), scheduleFileName) + clock := newTestClock() + schedules, err := openSchedules(path, "GreenOtter", clock.Now, discardLog()) + require.NoError(t, err) + + _, err = schedules.Set("Check the plants.", new(clock.Now().Add(time.Minute).Format(scheduleAtLayout)), nil) + require.NoError(t, err) + + reopened, err := openSchedules(path, "GreenOtter", clock.Now, discardLog()) + require.NoError(t, err) + require.Equal(t, "GreenOtter", reopened.sorted()[0].Owner) + + _, err = openSchedules(path, "OneChat", clock.Now, discardLog()) + require.ErrorContains(t, err, "belongs to") +} + +func TestSchedulesAssignTheOwnerToSavedRootSchedules(t *testing.T) { + path := filepath.Join(t.TempDir(), scheduleFileName) + require.NoError(t, os.WriteFile(path, []byte(`{"next":1,"schedules":[{"id":1,"text":"Check the news.","due":"2026-11-09T09:00:00-03:00"}]}`), 0o600)) + + schedules, err := openSchedules(path, "OneChat", newTestClock().Now, discardLog()) + require.NoError(t, err) + require.Equal(t, "OneChat", schedules.sorted()[0].Owner) + + data, err := os.ReadFile(path) + require.NoError(t, err) + require.Contains(t, string(data), `"owner":"OneChat"`) +} + // ScheduleTestClock is a clock that a test sets while Run reads it. type ScheduleTestClock struct { mutex sync.Mutex @@ -359,7 +389,7 @@ func scheduleTestOpen(t *testing.T) (*Schedules, string) { now: time.Date(2026, time.November, 8, 20, 0, 0, 0, time.FixedZone("", -3*60*60)), } - schedules, err := openSchedules(path, clock.Now, discardLog()) + schedules, err := openSchedules(path, "OneChat", clock.Now, discardLog()) require.NoError(t, err) return schedules, path