Skip to content

Commit f3f5348

Browse files
committed
♻️ msw 관련 함수 리팩토링
1 parent 561b275 commit f3f5348

File tree

8 files changed

+205
-227
lines changed

8 files changed

+205
-227
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
### AHHACHUL-Frontend
2+
23
> **지하철에선? 아하철!**
3-
>
4+
>
45
> 지하철에서도 즐거우면 안될까요? 🙃🙃
56
67
## 👨‍💻 만든 사람들
8+
79
- 이효범 :octocat: 📚
8-
- 양아름 :octocat: 📚
910
- 최윤정 :octocat: 📚
11+
- 이희제 :octocat: 📚

services/one-app/src/app/(site)/login/callback/page.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ function LoginCallback() {
4242
providerCode,
4343
});
4444

45+
console.log({ result });
46+
4547
const { accessToken, refreshToken, isNeedAdditionalUserInfo } = result;
4648

4749
if (!isNeedAdditionalUserInfo) {
@@ -53,8 +55,7 @@ function LoginCallback() {
5355
}
5456
} catch (error) {
5557
console.error(error);
56-
57-
router.back();
58+
router.replace('/login?error=from_callback');
5859
} finally {
5960
isLoadingRef.current = false;
6061
}
Lines changed: 4 additions & 223 deletions
Original file line numberDiff line numberDiff line change
@@ -1,226 +1,7 @@
1-
import { http, HttpResponse, StrictResponse } from 'msw';
2-
import { faker } from '@faker-js/faker';
3-
4-
function generateDate() {
5-
const lastWeek = new Date(Date.now());
6-
lastWeek.setDate(lastWeek.getDate() - 7);
7-
return faker.date.between({
8-
from: lastWeek,
9-
to: Date.now(),
10-
});
11-
}
12-
const User = [
13-
{ memberId: 'createhb21', nickname: '효범', gender: 'MALE' },
14-
{ memberId: 'areumsheep', nickname: '아름', gender: 'FEMALE' },
15-
{ memberId: 'YoonJeongLulu', nickname: '윤정', gender: 'FEMALE' },
16-
];
17-
const Posts = [];
1+
import { authHandlers, lostFoundHandlers, userHandlers } from './units';
182

193
export const handlers = [
20-
http.post('/auth/login', async ({ request }) => {
21-
console.log('로그인');
22-
return HttpResponse.json({
23-
memberId: User[0].memberId,
24-
accessToken: faker.string.alphanumeric(20),
25-
accessTokenExpiresIn: faker.number.int({ max: 1000 }),
26-
refreshToken: faker.string.alphanumeric(20),
27-
refreshTokenExpiresIn: faker.number.int({ max: 100000 }),
28-
isNeedAdditionalUserInfo: false,
29-
});
30-
}),
31-
http.post('/auth/logout', () => {
32-
console.log('로그아웃');
33-
return new HttpResponse(null);
34-
}),
35-
http.get('/auth/redirect-url', () => {
36-
console.log('리다이렉트 URL 조회');
37-
return HttpResponse.json({
38-
code: '100',
39-
message: 'SUCCESS',
40-
result: {
41-
redirectUrl: 'redirectUrl',
42-
},
43-
});
44-
}),
45-
http.post('/auth/token/refresh', () => {
46-
console.log('토큰 재발급');
47-
return HttpResponse.json({
48-
accessToken: faker.string.alphanumeric(20),
49-
accessTokenExpiresIn: faker.number.int({ max: 1000 }),
50-
refreshToken: faker.string.alphanumeric(20),
51-
refreshTokenExpiresIn: faker.number.int({ max: 100000 }),
52-
});
53-
}),
54-
http.get('/members/:userId', ({ request, params }): StrictResponse<any> => {
55-
const { userId } = params;
56-
const found = User.find((v) => v.memberId === userId);
57-
if (found) {
58-
return HttpResponse.json(found);
59-
}
60-
return HttpResponse.json(
61-
{ message: 'no_such_user' },
62-
{
63-
status: 404,
64-
},
65-
);
66-
}),
67-
http.get('/members/:userId/posts', ({ request, params }) => {
68-
const { userId } = params;
69-
return HttpResponse.json([
70-
{
71-
id: 1,
72-
writer: User[0].nickname,
73-
content: `${1} ${userId}의 게시글`,
74-
image: { imageId: 1, imageUrl: faker.image.urlLoremFlickr() },
75-
createdAt: generateDate(),
76-
createdBy: User[0].memberId,
77-
},
78-
{
79-
id: 2,
80-
writer: User[0].nickname,
81-
content: `${2} ${userId}의 게시글`,
82-
image: [{ imageId: 1, imageUrl: faker.image.urlLoremFlickr() }],
83-
createdAt: generateDate(),
84-
createdBy: User[0].memberId,
85-
},
86-
{
87-
id: 3,
88-
writer: User[0].nickname,
89-
content: `${3} ${userId}의 게시글`,
90-
image: { imageId: 1, imageUrl: faker.image.urlLoremFlickr() },
91-
createdAt: generateDate(),
92-
createdBy: User[0].memberId,
93-
},
94-
{
95-
id: 4,
96-
writer: User[0].nickname,
97-
content: `${4} ${userId}의 게시글`,
98-
image: { imageId: 1, imageUrl: faker.image.urlLoremFlickr() },
99-
createdAt: generateDate(),
100-
createdBy: User[0].memberId,
101-
},
102-
{
103-
id: 5,
104-
writer: User[0].nickname,
105-
content: `${5} ${userId}의 게시글`,
106-
image: { imageId: 1, imageUrl: faker.image.urlLoremFlickr() },
107-
createdAt: generateDate(),
108-
createdBy: User[0].memberId,
109-
},
110-
]);
111-
}),
112-
http.get(
113-
'/community-posts/:postId',
114-
({ request, params }): StrictResponse<any> => {
115-
console.log('커뮤니티 글 상세 조회');
116-
const { postId } = params;
117-
if (parseInt(postId as string) > 10) {
118-
return HttpResponse.json(
119-
{ message: 'no_such_post' },
120-
{
121-
status: 404,
122-
},
123-
);
124-
}
125-
return HttpResponse.json({
126-
postId,
127-
writer: User[0].nickname,
128-
title: `${1} 게시글 아이디 ${postId}의 제목`,
129-
content: faker.lorem.paragraphs(),
130-
images: [
131-
{ imageId: 1, imageUrl: faker.image.urlLoremFlickr() },
132-
{ imageId: 2, imageUrl: faker.image.urlLoremFlickr() },
133-
{ imageId: 3, imageUrl: faker.image.urlLoremFlickr() },
134-
],
135-
createdAt: generateDate(),
136-
createdBy: User[0].memberId,
137-
});
138-
},
139-
),
140-
http.get('/posts/:postId/comments', ({ request, params }) => {
141-
console.log('커뮤니티 글 댓글 목록 조회');
142-
const { postId } = params;
143-
return HttpResponse.json({
144-
comments: [
145-
{
146-
parentComment: {
147-
id: 1,
148-
upperCommentId: null,
149-
content: faker.lorem.paragraphs(),
150-
status: 'CREATED',
151-
createdAt: generateDate(),
152-
createdBy: User[0].memberId,
153-
writer: User[0].nickname,
154-
},
155-
childComments: [
156-
{
157-
id: 2,
158-
upperCommentId: 1,
159-
content: faker.lorem.paragraphs(),
160-
status: 'CREATED',
161-
createdAt: generateDate(),
162-
createdBy: User[1].memberId,
163-
writer: User[1].nickname,
164-
},
165-
],
166-
},
167-
{
168-
parentComment: {
169-
id: 11,
170-
upperCommentId: null,
171-
content: faker.lorem.paragraphs(),
172-
status: 'DELETED',
173-
createdAt: generateDate(),
174-
createdBy: User[1].memberId,
175-
writer: User[1].nickname,
176-
},
177-
childComments: [
178-
{
179-
id: 22,
180-
upperCommentId: 11,
181-
content: faker.lorem.paragraphs(),
182-
status: 'CREATED',
183-
createdAt: generateDate(),
184-
createdBy: User[1].memberId,
185-
writer: User[1].nickname,
186-
},
187-
],
188-
},
189-
{
190-
parentComment: {
191-
id: 111,
192-
upperCommentId: null,
193-
content: faker.lorem.paragraphs(),
194-
status: 'CREATED',
195-
createdAt: generateDate(),
196-
createdBy: User[2].memberId,
197-
writer: User[2].nickname,
198-
},
199-
childComments: [
200-
{
201-
id: 222,
202-
upperCommentId: 111,
203-
content: faker.lorem.paragraphs(),
204-
status: 'CREATED',
205-
createdAt: generateDate(),
206-
createdBy: User[0].memberId,
207-
writer: User[0].nickname,
208-
},
209-
],
210-
},
211-
{
212-
parentComment: {
213-
id: 1111,
214-
upperCommentId: null,
215-
content: faker.lorem.paragraphs(),
216-
status: 'CREATED',
217-
createdAt: generateDate(),
218-
createdBy: User[2].memberId,
219-
writer: User[2].nickname,
220-
},
221-
childComments: [],
222-
},
223-
],
224-
});
225-
}),
4+
...authHandlers,
5+
...userHandlers,
6+
...lostFoundHandlers,
2267
];
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { HttpResponse } from 'msw';
2+
import { faker } from '@faker-js/faker';
3+
import { APIResponseCode, RESPONSE_MESSAGES } from '@/common/constants/api';
4+
5+
export const ERROR_RATE = 0.3;
6+
export const ADDITIONAL_INFO_RATE = 0.3;
7+
8+
export const User = [
9+
{ memberId: '1', nickname: '효범', gender: 'MALE' },
10+
{ memberId: '2', nickname: '윤정', gender: 'FEMALE' },
11+
{ memberId: '3', nickname: '희제', gender: 'MALE' },
12+
];
13+
14+
export const createErrorResponse = () =>
15+
HttpResponse.json(
16+
{
17+
code: APIResponseCode.BAD_REQUEST,
18+
message: RESPONSE_MESSAGES[APIResponseCode.BAD_REQUEST],
19+
result: null,
20+
},
21+
{ status: 400 },
22+
);
23+
24+
export const createSuccessResponse = <TData>(result: TData) =>
25+
HttpResponse.json({
26+
code: APIResponseCode.SUCCESS,
27+
message: RESPONSE_MESSAGES[APIResponseCode.SUCCESS],
28+
result,
29+
});
30+
31+
export const generateDate = () => {
32+
const lastWeek = new Date(Date.now());
33+
lastWeek.setDate(lastWeek.getDate() - 7);
34+
return faker.date.between({
35+
from: lastWeek,
36+
to: Date.now(),
37+
});
38+
};
39+
40+
export const generateImages = (count: number) =>
41+
Array.from({ length: count }, (_, index) => ({
42+
imageId: index + 1,
43+
imageUrl: faker.image.urlLoremFlickr(),
44+
}));
45+
46+
export const generateBasicArticleData = (
47+
postId: string,
48+
user: (typeof User)[0],
49+
imgLength = 3,
50+
) => ({
51+
postId,
52+
writer: user.nickname,
53+
title: `게시글 아이디 ${postId}의 제목`,
54+
content: faker.lorem.paragraphs(),
55+
images: generateImages(imgLength),
56+
createdAt: generateDate(),
57+
createdBy: user.memberId,
58+
});
59+
60+
const generateComment = (
61+
id: number,
62+
upperCommentId: number | null,
63+
user: (typeof User)[0],
64+
) => ({
65+
id,
66+
upperCommentId,
67+
content: faker.lorem.paragraphs(),
68+
status: faker.helpers.arrayElement(['CREATED', 'DELETED']),
69+
createdAt: generateDate(),
70+
createdBy: user.memberId,
71+
writer: user.nickname,
72+
});
73+
74+
export const generateCommentThread = () => {
75+
const parentComment = generateComment(
76+
faker.number.int({ min: 1, max: 1000 }),
77+
null,
78+
faker.helpers.arrayElement(User),
79+
);
80+
const childComments = Array.from(
81+
{ length: faker.number.int({ min: 0, max: 3 }) },
82+
() =>
83+
generateComment(
84+
faker.number.int({ min: 1001, max: 2000 }),
85+
parentComment.id,
86+
faker.helpers.arrayElement(User),
87+
),
88+
);
89+
return { parentComment, childComments };
90+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { http } from 'msw';
2+
import { faker } from '@faker-js/faker';
3+
import {
4+
User,
5+
ERROR_RATE,
6+
ADDITIONAL_INFO_RATE,
7+
createErrorResponse,
8+
createSuccessResponse,
9+
} from '../mock-utils';
10+
11+
const generateTokenData = () => ({
12+
accessToken: faker.string.alphanumeric(20),
13+
accessTokenExpiresIn: faker.number.int({ max: 100000 }),
14+
refreshToken: faker.string.alphanumeric(20),
15+
refreshTokenExpiresIn: faker.number.int({ max: 1000000 }),
16+
});
17+
18+
const createLoginSuccessResponse = (memberId: string) =>
19+
createSuccessResponse({
20+
memberId,
21+
...generateTokenData(),
22+
isNeedAdditionalUserInfo: Math.random() < ADDITIONAL_INFO_RATE,
23+
});
24+
25+
const mock_로그인 = http.post('/auth/login', async ({ request }) => {
26+
if (Math.random() < 0.3) {
27+
return createErrorResponse();
28+
}
29+
30+
return createLoginSuccessResponse(User[0].memberId);
31+
});
32+
33+
const mock_리다이렉트_URL_조회 = http.get('/auth/redirect-url', () => {
34+
if (Math.random() < ERROR_RATE) {
35+
return createErrorResponse();
36+
}
37+
38+
return createSuccessResponse({
39+
redirectUrl: 'https://dev.ahhachul.com/redirectUrl',
40+
});
41+
});
42+
43+
export default [mock_로그인, mock_리다이렉트_URL_조회];

0 commit comments

Comments
 (0)