]> git.giacomolli.uk - onechat/blobdiff - backup_test.go
Describe queued event delivery boundaries
[onechat] / backup_test.go
index 2fb218a584770b9e6fe3ac59e9dab340c1713265..1638ed0d40be2673dfa6cef0c3e6b09b132e9558 100644 (file)
@@ -111,6 +111,55 @@ func TestRunningDaemonBackupRestoresTheChatAndLinks(t *testing.T) {
        require.Equal(t, childText, restoredText)
 }
 
        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")
 func TestBackupRestoresEachChildWithItsOwnState(t *testing.T) {
        dir := t.TempDir()
        daemonChildConfig(t, dir, "Garden")