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.
100 lines
3.0 KiB
100 lines
3.0 KiB
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
|
|
vi.mock("@/lib/rpa/worker-health", () => ({
|
|
isAnyRpaWorkerHealthy: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("@/lib/rpa/spawn-address-candidates", () => ({
|
|
spawnFetchMothershipAddressCandidates: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("@/workers/rpa/queue", () => ({
|
|
addAddressCandidatesJob: vi.fn(),
|
|
}));
|
|
|
|
const redisGet = vi.fn();
|
|
|
|
vi.mock("@/lib/redis", () => ({
|
|
ensureRedisReady: vi.fn().mockResolvedValue(undefined),
|
|
getRedis: vi.fn(() => ({
|
|
setex: vi.fn().mockResolvedValue("OK"),
|
|
get: redisGet,
|
|
})),
|
|
resetRedisClient: vi.fn(),
|
|
}));
|
|
|
|
import { spawnFetchMothershipAddressCandidates } from "@/lib/rpa/spawn-address-candidates";
|
|
import { isAnyRpaWorkerHealthy } from "@/lib/rpa/worker-health";
|
|
import { requestMothershipCandidatesViaWorker } from "@/modules/address/candidates-queue";
|
|
import { addAddressCandidatesJob } from "@/workers/rpa/queue";
|
|
|
|
const input = {
|
|
pickup: {
|
|
street: "1234 Warehouse Blvd",
|
|
city: "Los Angeles",
|
|
state: "CA",
|
|
zip: "90001",
|
|
},
|
|
delivery: {
|
|
street: "5678 Distribution Dr",
|
|
city: "Dallas",
|
|
state: "TX",
|
|
zip: "75201",
|
|
},
|
|
};
|
|
|
|
const mockResult = {
|
|
pickup_candidates: [{ display_label: "A", option_id: "1" }],
|
|
delivery_candidates: [{ display_label: "B", option_id: "2" }],
|
|
requires_selection: false,
|
|
};
|
|
|
|
describe("requestMothershipCandidatesViaWorker", () => {
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
redisGet.mockReset();
|
|
delete process.env.RPA_QUEUE_ENABLED;
|
|
});
|
|
|
|
it("Worker 无心跳时默认走 spawn", async () => {
|
|
delete process.env.RPA_PARKED_SESSION;
|
|
vi.mocked(isAnyRpaWorkerHealthy).mockResolvedValue(false);
|
|
vi.mocked(spawnFetchMothershipAddressCandidates).mockResolvedValue(
|
|
mockResult,
|
|
);
|
|
|
|
const result = await requestMothershipCandidatesViaWorker(input);
|
|
|
|
expect(result).toEqual(mockResult);
|
|
expect(spawnFetchMothershipAddressCandidates).toHaveBeenCalledWith(input);
|
|
});
|
|
|
|
it("Worker 无心跳且 RPA_PARKED_SESSION=true 时抛错", async () => {
|
|
process.env.RPA_QUEUE_ENABLED = "true";
|
|
process.env.RPA_PARKED_SESSION = "true";
|
|
vi.mocked(isAnyRpaWorkerHealthy).mockResolvedValue(false);
|
|
|
|
await expect(requestMothershipCandidatesViaWorker(input)).rejects.toMatchObject(
|
|
{ code: "PAGE_LOAD_TIMEOUT" },
|
|
);
|
|
expect(spawnFetchMothershipAddressCandidates).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("Worker 有心跳时只走队列等待结果,不 spawn", async () => {
|
|
process.env.RPA_QUEUE_ENABLED = "true";
|
|
vi.mocked(isAnyRpaWorkerHealthy).mockResolvedValue(true);
|
|
vi.mocked(addAddressCandidatesJob).mockResolvedValue(undefined);
|
|
redisGet
|
|
.mockResolvedValueOnce(null)
|
|
.mockResolvedValueOnce(
|
|
JSON.stringify({ ok: true, data: mockResult }),
|
|
);
|
|
|
|
const result = await requestMothershipCandidatesViaWorker(input);
|
|
|
|
expect(result).toEqual(mockResult);
|
|
expect(addAddressCandidatesJob).toHaveBeenCalled();
|
|
expect(spawnFetchMothershipAddressCandidates).not.toHaveBeenCalled();
|
|
});
|
|
});
|