X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/2a276c273c21a1752d541bf87e074c5d1c27e30f..6c7859cfea123479aba046614ee81028651ddaf5:/backup_test.go?ds=sidebyside diff --git a/backup_test.go b/backup_test.go index 6271f8a..81fefd9 100644 --- a/backup_test.go +++ b/backup_test.go @@ -26,6 +26,7 @@ func TestRunningDaemonBackupRestoresTheChatAndLinks(t *testing.T) { "agent/instructions.md": "Keep the instructions.\n", "agent/telegram-offset.json": "23\n", } + for name, data := range files { path := filepath.Join(dir, name) require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o700)) @@ -110,6 +111,57 @@ func TestRunningDaemonBackupRestoresTheChatAndLinks(t *testing.T) { require.Equal(t, childText, restoredText) } +func TestBackupKeepsPendingNotificationsAndCompletedRetryReceipts(t *testing.T) { + directory := t.TempDir() + server := newModelFake(t) + test := newDaemonMessageTest(t, directory, server) + _, err := test.messages.Notify(&NotifyInput{ + Source: "check", + ID: "completed", + Text: "A completed result.", + }) + require.NoError(t, err) + require.NoError(t, test.messages.Notifications(test.loops[0])) + require.NoError(t, test.loops[0].turn(t.Context())) + + _, err = test.messages.Notify(&NotifyInput{ + Source: "check", + ID: "pending", + AgentID: test.agents[1].agent.config.ID, + Text: "A pending result.", + }) + require.NoError(t, err) + + clock := newTestClock() + whatsapp, _, _ := whatsappStartTest(t, directory, clock) + archive := filepath.Join(t.TempDir(), "events.tar.gz") + _, err = backupData(t.Context(), directory, archive, whatsapp, test.messages.SnapshotAgents) + require.NoError(t, err) + + restored := t.TempDir() + require.NoError(t, backupRestore(t.Context(), archive, restored)) + + before, err := os.ReadFile(test.messages.path) + require.NoError(t, err) + + after, err := os.ReadFile(filepath.Join(restored, daemonAgentDirName, "messages.json")) + require.NoError(t, err) + require.Equal(t, before, after) + + recovered := newDaemonMessageTest(t, restored, server) + require.Len(t, recovered.Queue(t).Pending, 1) + require.Equal(t, test.agents[1].agent.config.ID, recovered.Queue(t).Pending[0].TargetID) + require.Len(t, recovered.Queue(t).Notifications, 2) + + duplicate, err := recovered.messages.Notify(&NotifyInput{ + Source: "check", + ID: "completed", + Text: "A completed result.", + }) + require.NoError(t, err) + require.Equal(t, "duplicate", duplicate.Status) +} + func TestBackupRestoresEachChildWithItsOwnState(t *testing.T) { dir := t.TempDir() daemonChildConfig(t, dir, "Garden") @@ -236,6 +288,7 @@ func TestUnsafeRestoreInstallsNoArchiveFiles(t *testing.T) { Mode: 0o600, }, ) + dir := t.TempDir() err := backupRestore(t.Context(), archive, dir) require.ErrorContains(t, err, "unsafe archive path") @@ -337,6 +390,7 @@ func TestSessionBackupWaitsForRemovalToFinish(t *testing.T) { require.Never(t, func() bool { return len(backedUp) != 0 }, 50*time.Millisecond, time.Millisecond) + release.Do(func() { close(disconnect.release) }) @@ -378,7 +432,7 @@ func backupStartDaemon(t *testing.T, dir string) (*Memory, *WhatsApp, *Subagents whatsapp, _, _ := whatsappStartTest(t, dir, clock) subagents := newSubagents(filepath.Join(agent.dir, subagentDirName), clock.Now, subagentNameRandom) - schedules, err := openSchedules(filepath.Join(agent.dir, scheduleFileName), clock.Now, discardLog()) + schedules, err := openSchedules(filepath.Join(agent.dir, scheduleFileName), "OneChat", clock.Now, discardLog()) require.NoError(t, err) server := newModelFake(t)