import { afterEach, describe, expect, it } from "vitest"; import fs from "node:fs"; import path from "node:path"; import { isFlockNonRetryableFailure, releaseFlockExclusiveLock, withFlockExclusiveLock, } from "@/lib/flock/exclusive-lock"; const LOCK_PATH = path.join(process.cwd(), ".rpa", "flock-rpa.lock"); afterEach(() => { releaseFlockExclusiveLock("test"); try { fs.unlinkSync(LOCK_PATH); } catch { /* ignore */ } }); describe("isFlockNonRetryableFailure", () => { it("识别上限与拒号", () => { expect( isFlockNonRetryableFailure( "FLOCK_QUOTE_LIMIT:Thank you for your interest", ), ).toBe(true); expect( isFlockNonRetryableFailure("FLOCK_ACCOUNT_REJECTED:issue creating"), ).toBe(true); expect(isFlockNonRetryableFailure("互斥锁占用")).toBe(true); expect(isFlockNonRetryableFailure("网络超时")).toBe(false); }); }); describe("withFlockExclusiveLock", () => { it("串行持有锁", async () => { const order: string[] = []; await withFlockExclusiveLock("test", async () => { order.push("a"); expect(fs.existsSync(LOCK_PATH)).toBe(true); }); expect(fs.existsSync(LOCK_PATH)).toBe(false); expect(order).toEqual(["a"]); }); });