fix(backups): показывать частичный результат внутри формы

This commit is contained in:
Denozordec committed 2026-10-01 20:39:35 +07:00
1 parent ad457b90a9
commit 98b4c39a00
18 files changed
+112 -16

No files matched your search

+10 -1
View File
@@ -1,6 +1,6 @@
import assert from "node:assert/strict"
import { test } from "node:test"
import { pollBackupJob, backupJobOutcome, waitForBackupPoll } from "./backup-job-poll"
import { pollBackupJob, backupJobOutcome, backupJobResultError, waitForBackupPoll } from "./backup-job-poll"
import type { BackupJobStatusResponse } from "@mmapp/contracts/backups"
const target = { serverIds: ["1"], notes: "manual" }
const baseJob: BackupJobStatusResponse = { id: "job", status: "queued", serverIds: ["1"], notes: "manual", total: 1, completed: 0, requestedAt: "2026-10-01T00:00:00Z", created: [], failures: [] }
@@ -30,3 +30,12 @@ test("cancellation interrupts delay and suppresses late observation", async () =
await assert.rejects(() => pollBackupJob("base", "job", target, { signal: late.signal, onJob: () => { calls++ }, readJob: async () => { late.abort(); return baseJob } }))
assert.equal(calls, 0)
})
test("saved terminal job reconstructs partial errors without a previous hook error", () => {
assert.equal(backupJobResultError(baseJob), null)
const success: BackupJobStatusResponse = { ...baseJob, status: "done", completed: 1, created: [file] }
assert.equal(backupJobResultError(success), null)
assert.match(backupJobResultError({ ...success, created: [{ ...file, uploadError: "S3 unavailable" }] }) ?? "", /config.rsc: S3 unavailable/)
assert.match(backupJobResultError({ ...success, created: [], failures: [{ serverId: "1", error: "offline" }] }) ?? "", /Создано 0 из 1.*1: offline/)
assert.match(backupJobResultError({ ...baseJob, status: "failed" }) ?? "", /Задача завершилась с ошибкой/)
})