nextjs.mock.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * Mock Next.js 特定 API 用于测试环境
  3. *
  4. * 目的:
  5. * - Mock next/headers cookies()
  6. * - Mock next-intl getTranslations()
  7. *
  8. * 这样测试环境就能正常调用 Server Actions
  9. */
  10. import { vi } from "vitest";
  11. // ==================== Mock next/headers ====================
  12. vi.mock("next/headers", () => ({
  13. cookies: vi.fn(() => ({
  14. get: vi.fn((name: string) => {
  15. // 从测试环境变量读取 Cookie
  16. if (name === "auth-token") {
  17. const token = process.env.TEST_ADMIN_TOKEN || process.env.ADMIN_TOKEN;
  18. return token ? { value: token } : undefined;
  19. }
  20. return undefined;
  21. }),
  22. set: vi.fn(),
  23. delete: vi.fn(),
  24. has: vi.fn((name: string) => name === "auth-token" && !!process.env.TEST_ADMIN_TOKEN),
  25. })),
  26. headers: vi.fn(() => ({
  27. get: vi.fn(() => null),
  28. })),
  29. }));
  30. // ==================== Mock next-intl ====================
  31. vi.mock("next-intl/server", () => ({
  32. getTranslations: vi.fn(() => {
  33. return (key: string, params?: Record<string, unknown>) => {
  34. // 简单的翻译映射
  35. const messages: Record<string, string> = {
  36. "users.created": "用户创建成功",
  37. "users.updated": "用户更新成功",
  38. "users.deleted": "用户删除成功",
  39. "users.toggledEnabled": "用户状态已切换",
  40. "users.renewed": "用户已续期",
  41. "providers.created": "供应商创建成功",
  42. "providers.updated": "供应商更新成功",
  43. "providers.deleted": "供应商删除成功",
  44. "providers.toggledEnabled": "供应商状态已切换",
  45. "keys.created": "密钥创建成功",
  46. "keys.deleted": "密钥删除成功",
  47. "errors.unauthorized": "未认证",
  48. "errors.forbidden": "权限不足",
  49. "errors.notFound": "未找到",
  50. "errors.invalidInput": "输入无效",
  51. };
  52. let msg = messages[key] || key;
  53. // 替换参数
  54. if (params) {
  55. Object.entries(params).forEach(([k, v]) => {
  56. msg = msg.replace(`{${k}}`, String(v));
  57. });
  58. }
  59. return msg;
  60. };
  61. }),
  62. }));