api-version-route.test.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
  2. function mockJsonResponse(data: unknown, init?: ResponseInit) {
  3. return new Response(JSON.stringify(data), {
  4. status: 200,
  5. headers: { "Content-Type": "application/json" },
  6. ...init,
  7. });
  8. }
  9. describe("/api/version (dev)", () => {
  10. beforeEach(() => {
  11. vi.resetModules();
  12. process.env.NEXT_PUBLIC_APP_VERSION = "dev-aaaaaaa";
  13. });
  14. afterEach(() => {
  15. vi.unstubAllGlobals();
  16. delete process.env.NEXT_PUBLIC_APP_VERSION;
  17. delete process.env.GITHUB_TOKEN;
  18. delete process.env.GH_TOKEN;
  19. });
  20. test("应在 dev HEAD 不同时提示更新", async () => {
  21. vi.stubGlobal(
  22. "fetch",
  23. vi.fn(async (input: RequestInfo | URL) => {
  24. const url = typeof input === "string" ? input : input.toString();
  25. if (url.includes("/commits/dev")) {
  26. return mockJsonResponse({
  27. sha: "bbbbbbbcccccccccccccccccccccccccccccccccc",
  28. html_url: "https://github.com/ding113/claude-code-hub/commit/bbbbbbb",
  29. commit: { committer: { date: "2025-12-21T00:00:00Z" } },
  30. });
  31. }
  32. throw new Error(`Unexpected fetch: ${url}`);
  33. })
  34. );
  35. const { GET } = await import("@/app/api/version/route");
  36. const response = await GET();
  37. expect(response.status).toBe(200);
  38. const data = await response.json();
  39. expect(data.current).toBe("dev-aaaaaaa");
  40. expect(data.latest).toBe("dev-bbbbbbb");
  41. expect(data.hasUpdate).toBe(true);
  42. expect(data.releaseUrl).toContain("/compare/aaaaaaa...bbbbbbb");
  43. expect(data.publishedAt).toBe("2025-12-21T00:00:00Z");
  44. });
  45. test("应在 dev HEAD 相同时不提示更新", async () => {
  46. process.env.NEXT_PUBLIC_APP_VERSION = "dev-bbbbbbb";
  47. vi.stubGlobal(
  48. "fetch",
  49. vi.fn(async (input: RequestInfo | URL) => {
  50. const url = typeof input === "string" ? input : input.toString();
  51. if (url.includes("/commits/dev")) {
  52. return mockJsonResponse({
  53. sha: "bbbbbbbcccccccccccccccccccccccccccccccccc",
  54. html_url: "https://github.com/ding113/claude-code-hub/commit/bbbbbbb",
  55. commit: { committer: { date: "2025-12-21T00:00:00Z" } },
  56. });
  57. }
  58. throw new Error(`Unexpected fetch: ${url}`);
  59. })
  60. );
  61. const { GET } = await import("@/app/api/version/route");
  62. const response = await GET();
  63. expect(response.status).toBe(200);
  64. const data = await response.json();
  65. expect(data.current).toBe("dev-bbbbbbb");
  66. expect(data.latest).toBe("dev-bbbbbbb");
  67. expect(data.hasUpdate).toBe(false);
  68. expect(data.releaseUrl).toBe("https://github.com/ding113/claude-code-hub/commit/bbbbbbb");
  69. });
  70. });