]> git.giacomolli.uk - onechat/blobdiff - backup_test.go
Exempt tracker metadata from commit signing
[onechat] / backup_test.go
index 6271f8a14abd51ab0682729be8820cc81c495057..81fefd9affeaa5494254809b4f604ff66047def1 100644 (file)
@@ -26,6 +26,7 @@ func TestRunningDaemonBackupRestoresTheChatAndLinks(t *testing.T) {
                "agent/instructions.md":      "Keep the instructions.\n",
                "agent/telegram-offset.json": "23\n",
        }
                "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))
        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)
 }
 
        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")
 func TestBackupRestoresEachChildWithItsOwnState(t *testing.T) {
        dir := t.TempDir()
        daemonChildConfig(t, dir, "Garden")
@@ -236,6 +288,7 @@ func TestUnsafeRestoreInstallsNoArchiveFiles(t *testing.T) {
                        Mode:     0o600,
                },
        )
                        Mode:     0o600,
                },
        )
+
        dir := t.TempDir()
        err := backupRestore(t.Context(), archive, dir)
        require.ErrorContains(t, err, "unsafe archive path")
        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)
        require.Never(t, func() bool {
                return len(backedUp) != 0
        }, 50*time.Millisecond, time.Millisecond)
+
        release.Do(func() {
                close(disconnect.release)
        })
        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)
 
        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)
        require.NoError(t, err)
 
        server := newModelFake(t)