]> git.giacomolli.uk - onechat/blobdiff - backup_test.go
Describe queued event delivery boundaries
[onechat] / backup_test.go
index 8628ee4a5858cadd4c8118018113694ae2d0c1c4..1638ed0d40be2673dfa6cef0c3e6b09b132e9558 100644 (file)
@@ -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,55 @@ 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",
+               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.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 +286,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 +388,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)
        })