You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.5 KiB
88 lines
2.5 KiB
import { describe, expect, it, vi, beforeEach } from "vitest";
|
|
|
|
const mockCreate = vi.fn();
|
|
const mockUpdate = vi.fn();
|
|
const mockGenerateQuoteId = vi.fn();
|
|
const mockEnqueue = vi.fn();
|
|
const mockHandleConflict = vi.fn();
|
|
|
|
vi.mock("@/lib/prisma", () => ({
|
|
prisma: {
|
|
quoteRecord: {
|
|
create: (...args: unknown[]) => mockCreate(...args),
|
|
update: (...args: unknown[]) => mockUpdate(...args),
|
|
},
|
|
},
|
|
}));
|
|
|
|
vi.mock("@/modules/quote/quote-id", () => ({
|
|
generateQuoteId: () => mockGenerateQuoteId(),
|
|
isQuoteIdUniqueConflict: (error: unknown) =>
|
|
typeof error === "object" &&
|
|
error !== null &&
|
|
(error as { code?: string }).code === "P2002",
|
|
handleQuoteIdConflict: (...args: unknown[]) => mockHandleConflict(...args),
|
|
}));
|
|
|
|
vi.mock("@/modules/priority1/rpa-queue", () => ({
|
|
enqueuePriority1QuoteJob: (...args: unknown[]) => mockEnqueue(...args),
|
|
}));
|
|
|
|
vi.mock("@/modules/metrics/collector", () => ({
|
|
safeRecord: (task: () => Promise<void>) => {
|
|
void task();
|
|
},
|
|
markQuoteStarted: vi.fn(),
|
|
}));
|
|
|
|
import { DEFAULT_PRIORITY1_DEMO } from "@/workers/rpa/priority1/demo-input";
|
|
import {
|
|
Priority1EnqueueError,
|
|
submitPriority1Quote,
|
|
} from "@/modules/priority1/orchestrator";
|
|
|
|
describe("submitPriority1Quote", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mockGenerateQuoteId.mockResolvedValue("QTE_20260701_0001");
|
|
mockCreate.mockResolvedValue({});
|
|
mockUpdate.mockResolvedValue({});
|
|
mockEnqueue.mockResolvedValue(undefined);
|
|
});
|
|
|
|
it("入队成功返回 processing", async () => {
|
|
const result = await submitPriority1Quote({
|
|
request_id: "req-1",
|
|
customer_id: "CUST_001",
|
|
priority1_input: DEFAULT_PRIORITY1_DEMO,
|
|
});
|
|
expect(result).toEqual({
|
|
quote_id: "QTE_20260701_0001",
|
|
status: "processing",
|
|
});
|
|
expect(mockEnqueue).toHaveBeenCalledOnce();
|
|
});
|
|
|
|
it("Redis 入队失败时抛出可读错误并标记 quote 失败", async () => {
|
|
mockEnqueue.mockRejectedValue(new Error("REDIS_URL 未配置"));
|
|
|
|
await expect(
|
|
submitPriority1Quote({
|
|
request_id: "req-2",
|
|
customer_id: "CUST_001",
|
|
priority1_input: DEFAULT_PRIORITY1_DEMO,
|
|
}),
|
|
).rejects.toBeInstanceOf(Priority1EnqueueError);
|
|
|
|
expect(mockUpdate).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
where: { quoteId: "QTE_20260701_0001" },
|
|
data: expect.objectContaining({
|
|
status: "failed",
|
|
errorCode: "QUOTE_UNAVAILABLE",
|
|
}),
|
|
}),
|
|
);
|
|
});
|
|
});
|