]> git.giacomolli.uk - onechat/blobdiff - schedule_test.go
Accept owner photos and image files in Telegram
[onechat] / schedule_test.go
index 3048d7584d4e8e793d6b178ab4aa476ba05b1172..6610c26b141a83a3f99bbc9f4a38946206c73f19 100644 (file)
@@ -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