Skip to content

Commit 9333c35

Browse files
committed
πŸ› μ„Έμ…˜ 정리 μ‹œ μ–΄λ“œλ―Ό API ν™˜κ²½ 선택이 μ΄ˆκΈ°ν™”λ˜λŠ” 문제 μˆ˜μ •
1 parent 8f2c130 commit 9333c35

4 files changed

Lines changed: 38 additions & 48 deletions

File tree

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,59 @@
11
import { beforeEach, describe, expect, it, vi } from "vitest";
22

3-
const { removeAccessToken, removeAdminApiEnvironment, saveAdminApiEnvironment } = vi.hoisted(() => ({
3+
const { removeAccessToken } = vi.hoisted(() => ({
44
removeAccessToken: vi.fn(),
5-
removeAdminApiEnvironment: vi.fn(),
6-
saveAdminApiEnvironment: vi.fn(),
75
}));
86

97
vi.mock("@/lib/api/auth", () => ({
108
reissueAccessTokenApi: vi.fn(),
119
}));
1210

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+
});
2022

2123
describe("switchAdminApiEnvironment", () => {
2224
beforeEach(() => {
2325
removeAccessToken.mockReset();
24-
removeAdminApiEnvironment.mockReset();
25-
saveAdminApiEnvironment.mockReset();
26+
localStorage.clear();
2627
});
2728

28-
it("μ„Έμ…˜(access token, ν™˜κ²½ κ°’)을 λͺ¨λ‘ μ§€μš΄ λ’€ μƒˆ ν™˜κ²½μ„ μ €μž₯ν•œλ‹€", async () => {
29+
it("access token을 μ§€μš΄ λ’€ μƒˆ ν™˜κ²½μ„ μ €μž₯ν•˜κ³  둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈν•œλ‹€", async () => {
2930
const { switchAdminApiEnvironment } = await import("./session");
31+
const { loadAdminApiEnvironment } = await import("@/lib/utils/localStorage");
3032
const redirect = vi.fn();
31-
const callOrder: string[] = [];
32-
33-
removeAdminApiEnvironment.mockImplementation(() => callOrder.push("removeAdminApiEnvironment"));
34-
saveAdminApiEnvironment.mockImplementation(() => callOrder.push("saveAdminApiEnvironment"));
3533

3634
switchAdminApiEnvironment("prod", redirect);
3735

3836
expect(removeAccessToken).toHaveBeenCalledOnce();
39-
expect(removeAdminApiEnvironment).toHaveBeenCalledOnce();
40-
expect(saveAdminApiEnvironment).toHaveBeenCalledWith("prod");
41-
expect(callOrder).toEqual(["removeAdminApiEnvironment", "saveAdminApiEnvironment"]);
37+
expect(loadAdminApiEnvironment()).toBe("prod");
4238
expect(redirect).toHaveBeenCalledWith("/auth/login");
4339
});
4440
});
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+
});

β€Žapps/admin/src/lib/auth/session.tsβ€Ž

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
import { reissueAccessTokenApi } from "@/lib/api/auth";
22
import type { AdminApiEnvironment } from "@/lib/auth/environment";
33
import { isTokenExpired } from "@/lib/utils/jwtUtils";
4-
import {
5-
loadAccessToken,
6-
removeAccessToken,
7-
removeAdminApiEnvironment,
8-
saveAccessToken,
9-
saveAdminApiEnvironment,
10-
} from "@/lib/utils/localStorage";
4+
import { loadAccessToken, removeAccessToken, saveAccessToken, saveAdminApiEnvironment } from "@/lib/utils/localStorage";
115

126
let reissuePromise: Promise<string | null> | null = null;
137
let sessionVersion = 0;
@@ -30,13 +24,11 @@ export const clearSession = () => {
3024
sessionVersion += 1;
3125
reissuePromise = null;
3226
removeAccessToken();
33-
removeAdminApiEnvironment();
3427
};
3528

3629
/**
37-
* μ–΄λ“œλ―Ό API ν™˜κ²½(stage/prod)을 μ „ν™˜ν•œλ‹€. clearSession()이 ν™˜κ²½ μ €μž₯ ν‚€κΉŒμ§€ ν•¨κ»˜ μ§€μš°λ―€λ‘œ,
38-
* λ°˜λ“œμ‹œ clearSession β†’ saveAdminApiEnvironment μˆœμ„œλ‘œ μ²˜λ¦¬ν•΄μ•Ό μƒˆ ν™˜κ²½ 값이 μœ μ§€λœλ‹€.
39-
* 이후 react-query μΊμ‹œ λ“± λ©”λͺ¨λ¦¬ μƒνƒœλ₯Ό ν™•μ‹€νžˆ λΉ„μš°κΈ° μœ„ν•΄ 전체 νŽ˜μ΄μ§€ μ΄λ™μœΌλ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈν•œλ‹€.
30+
* μ–΄λ“œλ―Ό API ν™˜κ²½(stage/prod)을 μ „ν™˜ν•œλ‹€. μ„Έμ…˜(access token)을 μ •λ¦¬ν•œ λ’€ μƒˆ ν™˜κ²½ 값을 μ €μž₯ν•˜κ³ ,
31+
* react-query μΊμ‹œ λ“± λ©”λͺ¨λ¦¬ μƒνƒœλ₯Ό ν™•μ‹€νžˆ λΉ„μš°κΈ° μœ„ν•΄ 전체 νŽ˜μ΄μ§€ μ΄λ™μœΌλ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈν•œλ‹€.
4032
* redirectλŠ” ν…ŒμŠ€νŠΈμ—μ„œ μ£Όμž…ν•  수 μžˆλ„λ‘ λ§€κ°œλ³€μˆ˜λ‘œ λΆ„λ¦¬ν–ˆλ‹€.
4133
*/
4234
export const switchAdminApiEnvironment = (

β€Žapps/admin/src/lib/utils/localStorage.test.tsβ€Ž

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
loadAccessToken,
55
loadAdminApiEnvironment,
66
removeAccessToken,
7-
removeAdminApiEnvironment,
87
saveAccessToken,
98
saveAdminApiEnvironment,
109
} from "./localStorage";
@@ -55,14 +54,6 @@ describe("μ–΄λ“œλ―Ό API ν™˜κ²½ localStorage μ €μž₯", () => {
5554
expect(loadAdminApiEnvironment()).toBe("prod");
5655
});
5756

58-
it("ν™˜κ²½ 값을 μ œκ±°ν•œλ‹€", () => {
59-
saveAdminApiEnvironment("stage");
60-
61-
removeAdminApiEnvironment();
62-
63-
expect(loadAdminApiEnvironment()).toBeNull();
64-
});
65-
6657
it("λ ˆκ±°μ‹œ κ°’ 'dev'λŠ” 'stage'둜 ν•΄μ„ν•œλ‹€", () => {
6758
localStorage.setItem(ADMIN_API_ENVIRONMENT_KEY, "dev");
6859

β€Žapps/admin/src/lib/utils/localStorage.tsβ€Ž

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,3 @@ export const saveAdminApiEnvironment = (environment: AdminApiEnvironment) => {
5353
console.error("Could not save admin api environment", err);
5454
}
5555
};
56-
57-
export const removeAdminApiEnvironment = () => {
58-
try {
59-
localStorage.removeItem(ADMIN_API_ENVIRONMENT_KEY);
60-
} catch (err) {
61-
console.error("Could not remove admin api environment", err);
62-
}
63-
};

0 commit comments

Comments
Β (0)