- „Belege vorbereiten“ startet den Lauf im Hintergrund (202) und fragt den Status ab; ein laufender Vorgang wird nicht erneut gestartet und beim Wiederöffnen der Seite weiterverfolgt - Eingangsbeleg und Dateiverknüpfung werden in einer Transaktion angelegt; ist die Datei bereits verknüpft, wird der neue Beleg verworfen - Fehler einzelner Dateien brechen den Lauf nicht mehr ab Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import test from "node:test"
|
|
import { prepareIncomingInvoices } from "../src/modules/cron/prepareIncomingInvoices"
|
|
|
|
function server(tenantLookups: { count: number }) {
|
|
let release: () => void = () => undefined
|
|
const gate = new Promise<void>((resolve) => { release = resolve })
|
|
const db: any = {
|
|
select: () => ({
|
|
from: () => ({
|
|
where: () => ({
|
|
orderBy: async () => {
|
|
tenantLookups.count += 1
|
|
await gate
|
|
return []
|
|
},
|
|
}),
|
|
}),
|
|
}),
|
|
}
|
|
const log = { error: () => undefined, info: () => undefined, warn: () => undefined }
|
|
return { server: { db, log } as any, release: () => release() }
|
|
}
|
|
|
|
test("start runs the preparation in the background and does not start a second run", async () => {
|
|
const lookups = { count: 0 }
|
|
const { server: srv, release } = server(lookups)
|
|
const service = prepareIncomingInvoices(srv)
|
|
|
|
const first = service.start(7)
|
|
const second = service.start(7)
|
|
assert.equal(first.running, true)
|
|
assert.equal(second.startedAt, first.startedAt)
|
|
assert.equal(service.status(8).running, false)
|
|
|
|
release()
|
|
await new Promise((resolve) => setImmediate(resolve))
|
|
await new Promise((resolve) => setImmediate(resolve))
|
|
|
|
const status = service.status(7)
|
|
assert.equal(lookups.count, 1)
|
|
assert.equal(status.running, false)
|
|
assert.ok(status.finishedAt)
|
|
assert.equal(status.result?.error, "Mandant nicht gefunden")
|
|
})
|