+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"`)
+}
+