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.
82 lines
2.2 KiB
82 lines
2.2 KiB
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
import {
|
|
generateServiceToken,
|
|
hashServiceToken,
|
|
} from "@/modules/customer/token-crypto";
|
|
|
|
vi.mock("@/lib/prisma", () => ({
|
|
prisma: {
|
|
hostCustomer: {
|
|
findMany: vi.fn(),
|
|
findFirst: vi.fn(),
|
|
},
|
|
serviceApiKey: {
|
|
findFirst: vi.fn(),
|
|
},
|
|
},
|
|
}));
|
|
|
|
import { prisma } from "@/lib/prisma";
|
|
import { resolveDbServiceToken } from "@/modules/customer/customer-service";
|
|
import {
|
|
resetServiceTokenCache,
|
|
verifyServiceTokenAsync,
|
|
} from "@/modules/auth/service-token";
|
|
|
|
const DEMO_TOKENS = JSON.stringify({
|
|
"demo-host-token": {
|
|
customerId: "CUST_001",
|
|
permissions: ["pricing:markup:write"],
|
|
},
|
|
});
|
|
|
|
describe("verifyServiceTokenAsync", () => {
|
|
beforeEach(() => {
|
|
process.env.HOST_SERVICE_TOKENS = DEMO_TOKENS;
|
|
resetServiceTokenCache();
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it("env token 仍可用", async () => {
|
|
const result = await verifyServiceTokenAsync("demo-host-token", "CUST_001");
|
|
expect(result.customerId).toBe("CUST_001");
|
|
});
|
|
|
|
it("DB token 校验通过", async () => {
|
|
const raw = generateServiceToken();
|
|
vi.mocked(prisma.serviceApiKey.findFirst).mockResolvedValue({
|
|
customerId: "CUST_004",
|
|
permissions: ["pricing:markup:write"],
|
|
isActive: true,
|
|
tokenHash: hashServiceToken(raw),
|
|
customer: { status: "active", isDeleted: false },
|
|
} as never);
|
|
|
|
const result = await verifyServiceTokenAsync(raw, "CUST_004");
|
|
expect(result.customerId).toBe("CUST_004");
|
|
expect(prisma.serviceApiKey.findFirst).toHaveBeenCalled();
|
|
});
|
|
|
|
it("无效 token 返回 401", async () => {
|
|
vi.mocked(prisma.serviceApiKey.findFirst).mockResolvedValue(null);
|
|
await expect(
|
|
verifyServiceTokenAsync("bad-token", "CUST_004"),
|
|
).rejects.toMatchObject({
|
|
code: "UNAUTHORIZED",
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("resolveDbServiceToken", () => {
|
|
it("按 hash 解析客户", async () => {
|
|
const raw = generateServiceToken();
|
|
vi.mocked(prisma.serviceApiKey.findFirst).mockResolvedValue({
|
|
customerId: "CUST_002",
|
|
permissions: ["pricing:markup:write"],
|
|
} as never);
|
|
|
|
const resolved = await resolveDbServiceToken(raw);
|
|
expect(resolved?.customerId).toBe("CUST_002");
|
|
});
|
|
});
|