From dc113f7109c9b9201ffca08b6df6b944a615e1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E4=BA=8E=E6=99=8F?= <3146347095@qq.com> Date: Sun, 28 Jun 2026 16:06:38 +0800 Subject: [PATCH] test: cover default checker failure paths --- backend/src/__tests__/defaultChecker.test.ts | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/backend/src/__tests__/defaultChecker.test.ts b/backend/src/__tests__/defaultChecker.test.ts index 9c95644d..92aeaa16 100644 --- a/backend/src/__tests__/defaultChecker.test.ts +++ b/backend/src/__tests__/defaultChecker.test.ts @@ -92,4 +92,67 @@ describe("DefaultChecker", () => { }), ); }); + + it("skips a run when the default checker lock is already held", async () => { + const checker = new DefaultChecker(); + const warnSpy = jest + .spyOn(logger, "warn") + .mockImplementation(() => logger as typeof logger); + const releaseLock = jest.fn(); + + (checker as unknown as Record).acquireLock = async () => + false; + (checker as unknown as Record).releaseLock = releaseLock; + + const result = await checker.checkOverdueLoans(); + + expect(result).toBeNull(); + expect(releaseLock).not.toHaveBeenCalled(); + expect(warnSpy).toHaveBeenCalledWith( + "Default checker run skipped - another instance is already running", + {}, + ); + }); + + it("records a failed batch when default submission throws", async () => { + const checker = new DefaultChecker(); + const releaseLock = jest.fn(async () => undefined); + + (checker as unknown as Record).acquireLock = async () => + true; + (checker as unknown as Record).releaseLock = releaseLock; + (checker as unknown as Record).assertConfigured = () => ({ + signer: {}, + server: { + getLatestLedger: async () => ({ sequence: 4321 }), + }, + passphrase: "test-passphrase", + }); + (checker as unknown as Record).fetchOverdueStats = + async () => ({ + overdueCount: 2, + oldestDueLedger: 4200, + ledgersPastOldestDue: 121, + }); + (checker as unknown as Record).submitCheckDefaults = + async () => { + throw new Error("submission failed"); + }; + + const result = await checker.checkOverdueLoans([201, 202]); + + expect(result).toMatchObject({ + currentLedger: 4321, + loansChecked: 2, + successfulSubmissions: 0, + failedSubmissions: 1, + }); + expect(result!.batches).toEqual([ + { + loanIds: [201, 202], + error: "default check batch failed: submission failed", + }, + ]); + expect(releaseLock).toHaveBeenCalledTimes(1); + }); });