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.

79 lines
2.1 KiB

import { beforeEach, describe, expect, it, vi } from "vitest";
const { findFirst } = vi.hoisted(() => ({
findFirst: vi.fn(),
}));
vi.mock("@/lib/prisma", () => ({
prisma: {
businessCustomerUser: {
findFirst,
findMany: vi.fn(),
},
},
}));
import {
resolveBusinessCustomerByAccount,
resolveBusinessCustomerIdForQuote,
} from "@/modules/customer/business-customer-user-service";
import { ValidationError } from "@/modules/quote/types";
describe("business-customer-user-service", () => {
beforeEach(() => {
findFirst.mockReset();
});
it("按账号命中业务客户", async () => {
findFirst.mockResolvedValue({
customerId: "CUST_004",
account: "demo_user",
businessCustomer: {
businessCustomerId: "bc-guid-1",
externalCode: "76642888",
name: "测试客户",
},
});
const hit = await resolveBusinessCustomerByAccount("CUST_004", "demo_user");
expect(hit?.business_customer_id).toBe("bc-guid-1");
expect(hit?.external_code).toBe("76642888");
});
it("询价:已有 BC 不覆盖", async () => {
const id = await resolveBusinessCustomerIdForQuote({
customerId: "CUST_004",
businessCustomerId: "bc-explicit",
businessUserAccount: "any",
});
expect(id).toBe("bc-explicit");
expect(findFirst).not.toHaveBeenCalled();
});
it("询价:无 BC + 账号未命中 → ValidationError", async () => {
findFirst.mockResolvedValue(null);
await expect(
resolveBusinessCustomerIdForQuote({
customerId: "CUST_004",
businessUserAccount: "missing_user",
}),
).rejects.toBeInstanceOf(ValidationError);
});
it("询价:无 BC + 账号命中 → 回填 BC", async () => {
findFirst.mockResolvedValue({
customerId: "CUST_004",
account: "demo_user",
businessCustomer: {
businessCustomerId: "bc-guid-2",
externalCode: "CM072",
name: "OpenTrucking Inc",
},
});
const id = await resolveBusinessCustomerIdForQuote({
customerId: "CUST_004",
businessUserAccount: "demo_user",
});
expect(id).toBe("bc-guid-2");
});
});