|
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
import {
|
|
|
applyMarkup,
|
|
|
applyMarkupToTier,
|
|
|
getMarkupPercent,
|
|
|
} from "@/modules/pricing/engine";
|
|
|
|
|
|
vi.mock("@/lib/prisma", () => ({
|
|
|
prisma: {
|
|
|
markupConfig: {
|
|
|
findFirst: vi.fn(),
|
|
|
},
|
|
|
},
|
|
|
}));
|
|
|
|
|
|
import { prisma } from "@/lib/prisma";
|
|
|
|
|
|
const mockedFindFirst = vi.mocked(prisma.markupConfig.findFirst);
|
|
|
|
|
|
describe("applyMarkup", () => {
|
|
|
it("TC-103:raw_freight=320,surcharges=15,markup=10% → 32.00/367.00", () => {
|
|
|
const rawTotal = 320 + 15;
|
|
|
const result = applyMarkup(320, rawTotal, 10);
|
|
|
expect(result.markupAmount).toBe(32.0);
|
|
|
expect(result.finalTotal).toBe(367.0);
|
|
|
});
|
|
|
|
|
|
it("raw_freight=380,markup=10% → 38.00/418.00", () => {
|
|
|
const result = applyMarkup(380, 380, 10);
|
|
|
expect(result.markupAmount).toBe(38.0);
|
|
|
expect(result.finalTotal).toBe(418.0);
|
|
|
});
|
|
|
|
|
|
it("surcharge=0 仅对 raw_freight 加价", () => {
|
|
|
const result = applyMarkup(320, 320, 10);
|
|
|
expect(result.markupAmount).toBe(32.0);
|
|
|
expect(result.finalTotal).toBe(352.0);
|
|
|
});
|
|
|
|
|
|
it("0% 加价", () => {
|
|
|
const result = applyMarkup(320, 335, 0);
|
|
|
expect(result.markupAmount).toBe(0);
|
|
|
expect(result.finalTotal).toBe(335);
|
|
|
});
|
|
|
|
|
|
it("30% 边界", () => {
|
|
|
const result = applyMarkup(100, 100, 30);
|
|
|
expect(result.markupAmount).toBe(30);
|
|
|
expect(result.finalTotal).toBe(130);
|
|
|
});
|
|
|
|
|
|
it("0.01% 细粒度加价", () => {
|
|
|
const result = applyMarkup(1000, 1000, 0.01);
|
|
|
expect(result.markupAmount).toBe(0.1);
|
|
|
expect(result.finalTotal).toBe(1000.1);
|
|
|
});
|
|
|
|
|
|
it("固定金额加价", () => {
|
|
|
const result = applyMarkup(320, 335, {
|
|
|
type: "fixed",
|
|
|
percent: 0,
|
|
|
fixedAmount: 50,
|
|
|
});
|
|
|
expect(result.markupAmount).toBe(50);
|
|
|
expect(result.finalTotal).toBe(385);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe("applyMarkupToTier", () => {
|
|
|
it("生成 breakdown 三项", () => {
|
|
|
const tier = applyMarkupToTier(
|
|
|
{
|
|
|
service_level: "standard",
|
|
|
rate_option: "lowest",
|
|
|
carrier: "Mothership",
|
|
|
transit_days: "5-7",
|
|
|
transit_description: "最低价格",
|
|
|
raw_freight: 320,
|
|
|
surcharges: 15,
|
|
|
raw_total: 335,
|
|
|
},
|
|
|
10,
|
|
|
);
|
|
|
expect(tier.breakdown).toHaveLength(3);
|
|
|
expect(tier.final_total).toBe(367);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe("getMarkupPercent", () => {
|
|
|
beforeEach(() => {
|
|
|
mockedFindFirst.mockReset();
|
|
|
});
|
|
|
|
|
|
it("未配置 customer_id → 0.0", async () => {
|
|
|
mockedFindFirst.mockResolvedValue(null);
|
|
|
expect(await getMarkupPercent("CUST_UNKNOWN")).toBe(0);
|
|
|
});
|
|
|
|
|
|
it("已配置 10.0% → 10.0", async () => {
|
|
|
mockedFindFirst.mockResolvedValue({
|
|
|
markupType: "percent",
|
|
|
markupPercent: 10.0,
|
|
|
markupFixedAmount: null,
|
|
|
} as never);
|
|
|
expect(await getMarkupPercent("CUST_002")).toBe(10);
|
|
|
});
|
|
|
});
|