|
1 | 1 | import { beforeEach, describe, expect, it, vi } from "vitest"; |
2 | 2 |
|
3 | | -const { removeAccessToken, removeAdminApiEnvironment, saveAdminApiEnvironment } = vi.hoisted(() => ({ |
| 3 | +const { removeAccessToken } = vi.hoisted(() => ({ |
4 | 4 | removeAccessToken: vi.fn(), |
5 | | - removeAdminApiEnvironment: vi.fn(), |
6 | | - saveAdminApiEnvironment: vi.fn(), |
7 | 5 | })); |
8 | 6 |
|
9 | 7 | vi.mock("@/lib/api/auth", () => ({ |
10 | 8 | reissueAccessTokenApi: vi.fn(), |
11 | 9 | })); |
12 | 10 |
|
13 | | -vi.mock("@/lib/utils/localStorage", () => ({ |
14 | | - loadAccessToken: vi.fn(), |
15 | | - removeAccessToken, |
16 | | - removeAdminApiEnvironment, |
17 | | - saveAccessToken: vi.fn(), |
18 | | - saveAdminApiEnvironment, |
19 | | -})); |
| 11 | +// 환경(stage/prod) 저장·조회 함수는 실제 구현(jsdom localStorage)을 그대로 사용해, |
| 12 | +// clearSession()이 저장된 환경 값을 건드리지 않는지 회귀 테스트로 검증한다. |
| 13 | +vi.mock("@/lib/utils/localStorage", async (importOriginal) => { |
| 14 | + const actual = await importOriginal<typeof import("@/lib/utils/localStorage")>(); |
| 15 | + return { |
| 16 | + ...actual, |
| 17 | + loadAccessToken: vi.fn(), |
| 18 | + removeAccessToken, |
| 19 | + saveAccessToken: vi.fn(), |
| 20 | + }; |
| 21 | +}); |
20 | 22 |
|
21 | 23 | describe("switchAdminApiEnvironment", () => { |
22 | 24 | beforeEach(() => { |
23 | 25 | removeAccessToken.mockReset(); |
24 | | - removeAdminApiEnvironment.mockReset(); |
25 | | - saveAdminApiEnvironment.mockReset(); |
| 26 | + localStorage.clear(); |
26 | 27 | }); |
27 | 28 |
|
28 | | - it("세션(access token, 환경 값)을 모두 지운 뒤 새 환경을 저장한다", async () => { |
| 29 | + it("access token을 지운 뒤 새 환경을 저장하고 로그인 페이지로 리다이렉트한다", async () => { |
29 | 30 | const { switchAdminApiEnvironment } = await import("./session"); |
| 31 | + const { loadAdminApiEnvironment } = await import("@/lib/utils/localStorage"); |
30 | 32 | const redirect = vi.fn(); |
31 | | - const callOrder: string[] = []; |
32 | | - |
33 | | - removeAdminApiEnvironment.mockImplementation(() => callOrder.push("removeAdminApiEnvironment")); |
34 | | - saveAdminApiEnvironment.mockImplementation(() => callOrder.push("saveAdminApiEnvironment")); |
35 | 33 |
|
36 | 34 | switchAdminApiEnvironment("prod", redirect); |
37 | 35 |
|
38 | 36 | expect(removeAccessToken).toHaveBeenCalledOnce(); |
39 | | - expect(removeAdminApiEnvironment).toHaveBeenCalledOnce(); |
40 | | - expect(saveAdminApiEnvironment).toHaveBeenCalledWith("prod"); |
41 | | - expect(callOrder).toEqual(["removeAdminApiEnvironment", "saveAdminApiEnvironment"]); |
| 37 | + expect(loadAdminApiEnvironment()).toBe("prod"); |
42 | 38 | expect(redirect).toHaveBeenCalledWith("/auth/login"); |
43 | 39 | }); |
44 | 40 | }); |
| 41 | + |
| 42 | +describe("clearSession", () => { |
| 43 | + beforeEach(() => { |
| 44 | + removeAccessToken.mockReset(); |
| 45 | + localStorage.clear(); |
| 46 | + }); |
| 47 | + |
| 48 | + it("access token은 지우지만 저장된 어드민 API 환경 값은 유지한다 (회귀 테스트)", async () => { |
| 49 | + const { clearSession } = await import("./session"); |
| 50 | + const { loadAdminApiEnvironment, saveAdminApiEnvironment } = await import("@/lib/utils/localStorage"); |
| 51 | + |
| 52 | + saveAdminApiEnvironment("stage"); |
| 53 | + |
| 54 | + clearSession(); |
| 55 | + |
| 56 | + expect(removeAccessToken).toHaveBeenCalledOnce(); |
| 57 | + expect(loadAdminApiEnvironment()).toBe("stage"); |
| 58 | + }); |
| 59 | +}); |
0 commit comments