session-origin-chain-integration.test.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { describe, expect, test, vi } from "vitest";
  2. import type { ProviderChainItem } from "../../../src/types/message";
  3. type SessionRequestRow = {
  4. requestSequence: number;
  5. providerChain: ProviderChainItem[];
  6. };
  7. describe("getSessionOriginChain integration", () => {
  8. test("returns the first request origin chain for a multi-request session", async () => {
  9. vi.resetModules();
  10. const firstRequestChain: ProviderChainItem[] = [
  11. {
  12. id: 101,
  13. name: "provider-a",
  14. reason: "initial_selection",
  15. selectionMethod: "weighted_random",
  16. },
  17. ];
  18. const secondRequestChain: ProviderChainItem[] = [
  19. {
  20. id: 101,
  21. name: "provider-a",
  22. reason: "session_reuse",
  23. selectionMethod: "session_reuse",
  24. },
  25. ];
  26. const sessionRequests: SessionRequestRow[] = [
  27. { requestSequence: 1, providerChain: firstRequestChain },
  28. { requestSequence: 2, providerChain: secondRequestChain },
  29. ];
  30. const limitMock = vi.fn((limit: number) =>
  31. Promise.resolve(
  32. [...sessionRequests]
  33. .sort((a, b) => a.requestSequence - b.requestSequence)
  34. .slice(0, limit)
  35. .map((row) => ({ providerChain: row.providerChain }))
  36. )
  37. );
  38. const orderByMock = vi.fn(() => ({ limit: limitMock }));
  39. const whereMock = vi.fn(() => ({ orderBy: orderByMock }));
  40. const fromMock = vi.fn(() => ({ where: whereMock }));
  41. const selectMock = vi.fn(() => ({ from: fromMock }));
  42. vi.doMock("@/drizzle/db", () => ({
  43. db: {
  44. select: selectMock,
  45. },
  46. }));
  47. vi.doMock("@/lib/auth", () => ({
  48. getSession: vi.fn().mockResolvedValue({ user: { id: 1, role: "admin" } }),
  49. }));
  50. vi.doMock("@/repository/key", () => ({
  51. findKeyList: vi.fn(),
  52. }));
  53. vi.doMock("@/lib/logger", () => ({
  54. logger: {
  55. error: vi.fn(),
  56. warn: vi.fn(),
  57. info: vi.fn(),
  58. debug: vi.fn(),
  59. trace: vi.fn(),
  60. },
  61. }));
  62. const { getSessionOriginChain } = await import("../../../src/actions/session-origin-chain");
  63. const result = await getSessionOriginChain("test-session");
  64. expect(result).toEqual({ ok: true, data: firstRequestChain });
  65. expect(result.ok).toBe(true);
  66. if (!result.ok || !result.data) {
  67. throw new Error("Expected action to return origin chain data");
  68. }
  69. expect(result.data[0]?.reason).toBe("initial_selection");
  70. expect(result.data).not.toEqual(secondRequestChain);
  71. expect(selectMock).toHaveBeenCalledTimes(1);
  72. expect(limitMock).toHaveBeenCalledWith(1);
  73. });
  74. });