Skip to content

Commit 0e0aa1d

Browse files
committed
feat: 팩토리 함수를 이용한 이벤트 데이터 생성
1 parent e6ba9c9 commit 0e0aa1d

File tree

4 files changed

+58
-34
lines changed

4 files changed

+58
-34
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { randomUUID } from 'crypto';
2+
3+
import { Event } from '../../types';
4+
5+
export const makeEvent = (overrides: Partial<Event> = {}): Event => ({
6+
id: overrides.id ?? randomUUID(),
7+
title: '테스트 이벤트',
8+
date: '2025-10-15',
9+
startTime: '09:00',
10+
endTime: '10:00',
11+
description: '',
12+
location: '',
13+
category: '',
14+
repeat: { type: 'none', interval: 0 },
15+
notificationTime: 10,
16+
...overrides,
17+
});
18+
19+
export const makeEvents = (count: number, mapper: () => Partial<Event> = () => ({})): Event[] =>
20+
Array.from({ length: count }, (_, i) => makeEvent({ id: `${i + 1}`, ...(mapper?.() ?? {}) }));

src/__tests__/hooks/medium.useEventOperations.spec.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import {
55
setupMockHandlerDeletion,
66
setupMockHandlerUpdating,
77
} from '../../__mocks__/handlersUtils.ts';
8-
import { events } from '../../__mocks__/response/events.json';
98
import { useEventOperations } from '../../hooks/useEventOperations.ts';
109
import { server } from '../../setupTests.ts';
1110
import { Event } from '../../types.ts';
11+
import { makeEvents } from '../factories/eventFactory';
1212

1313
const enqueueSnackbarFn = vi.fn();
1414

@@ -23,7 +23,8 @@ vi.mock('notistack', async () => {
2323
});
2424

2525
it('저장되어있는 초기 이벤트 데이터를 불러온다.', async () => {
26-
server.use(...setupMockHandlerCreation(events as Event[]));
26+
const initialEvents = makeEvents(1);
27+
server.use(...setupMockHandlerCreation(initialEvents));
2728

2829
const fetchSpy = vi.spyOn(global, 'fetch');
2930

@@ -38,7 +39,8 @@ it('저장되어있는 초기 이벤트 데이터를 불러온다.', async () =>
3839
});
3940

4041
it('정의된 이벤트 정보를 기준으로 적절하게 저장이 된다', async () => {
41-
server.use(...setupMockHandlerCreation(events as Event[]));
42+
const initialEvents = makeEvents(1, () => ({ title: '기존 회의' }));
43+
server.use(...setupMockHandlerCreation(initialEvents));
4244

4345
const { result } = renderHook(() => useEventOperations(false));
4446

@@ -49,19 +51,16 @@ it('정의된 이벤트 정보를 기준으로 적절하게 저장이 된다', a
4951
});
5052

5153
it("새로 정의된 'title', 'endTime' 기준으로 적절하게 일정이 업데이트 된다", async () => {
52-
server.use(...setupMockHandlerUpdating(events as Event[]));
54+
const initialEvents = makeEvents(1, () => ({ id: '1', title: '기존 회의' }));
55+
server.use(...setupMockHandlerUpdating(initialEvents));
5356
const { result } = renderHook(() => useEventOperations(true));
5457

5558
await waitFor(() => {
5659
expect(result.current.events.length).toBeGreaterThan(0);
5760
expect(result.current.events[0].title).toEqual('기존 회의');
5861
});
5962

60-
const updatedEvent = {
61-
id: '1',
62-
title: '기존이 아닌 회의',
63-
endTime: '16:00',
64-
};
63+
const updatedEvent = { id: '1', title: '기존이 아닌 회의', endTime: '16:00' };
6564

6665
await act(async () => {
6766
await result.current.saveEvent(updatedEvent as Event);
@@ -79,7 +78,8 @@ it("새로 정의된 'title', 'endTime' 기준으로 적절하게 일정이 업
7978
});
8079

8180
it('존재하는 이벤트 삭제 시 에러없이 아이템이 삭제된다.', async () => {
82-
server.use(...setupMockHandlerDeletion(events as Event[]));
81+
const initialEvents = makeEvents(1, () => ({ id: '1', title: '기존 회의' }));
82+
server.use(...setupMockHandlerDeletion(initialEvents));
8383

8484
const { result } = renderHook(() => useEventOperations(false));
8585

@@ -100,7 +100,8 @@ it('존재하는 이벤트 삭제 시 에러없이 아이템이 삭제된다.',
100100
});
101101

102102
it("이벤트 로딩 실패 시 '이벤트 로딩 실패'라는 텍스트와 함께 에러 토스트가 표시되어야 한다", async () => {
103-
server.use(...setupMockHandlerCreation(events as Event[], { getIsSuccess: false }));
103+
const initialEvents = makeEvents(1);
104+
server.use(...setupMockHandlerCreation(initialEvents, { getIsSuccess: false }));
104105

105106
renderHook(() => useEventOperations(false));
106107

@@ -110,7 +111,8 @@ it("이벤트 로딩 실패 시 '이벤트 로딩 실패'라는 텍스트와 함
110111
});
111112

112113
it("존재하지 않는 이벤트 수정 시 '일정 저장 실패'라는 토스트가 노출되며 에러 처리가 되어야 한다", async () => {
113-
server.use(...setupMockHandlerUpdating(events as Event[]));
114+
const initialEvents = makeEvents(1, () => ({ id: '1' }));
115+
server.use(...setupMockHandlerUpdating(initialEvents));
114116

115117
const { result } = renderHook(() => useEventOperations(true));
116118
const updatedEvent = {
@@ -128,7 +130,8 @@ it("존재하지 않는 이벤트 수정 시 '일정 저장 실패'라는 토스
128130
});
129131

130132
it("네트워크 오류 시 '일정 삭제 실패'라는 텍스트가 노출되며 이벤트 삭제가 실패해야 한다", async () => {
131-
server.use(...setupMockHandlerDeletion(events as Event[], { deleteIsSuccess: false }));
133+
const initialEvents = makeEvents(1, () => ({ id: '1' }));
134+
server.use(...setupMockHandlerDeletion(initialEvents, { deleteIsSuccess: false }));
132135

133136
const { result } = renderHook(() => useEventOperations(false));
134137

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { act, renderHook, waitFor } from '@testing-library/react';
22

3-
import { events } from '../../__mocks__/response/events.json';
43
import { useNotifications } from '../../hooks/useNotifications.ts';
54
import { Event } from '../../types.ts';
65
import { formatDate } from '../../utils/dateUtils.ts';
6+
import { makeEvent } from '../factories/eventFactory';
77
import { parseHM } from '../utils.ts';
88

99
beforeEach(() => {
@@ -15,45 +15,41 @@ afterEach(() => {
1515
});
1616

1717
it('초기 상태에서는 알림이 없어야 한다', async () => {
18-
const { result } = renderHook(() => useNotifications(events as Event[]));
19-
20-
waitFor(() => expect(result.current.notifications.length).toBe(0));
18+
const event = makeEvent();
19+
const { result } = renderHook(() => useNotifications([event]));
20+
await waitFor(() => expect(result.current.notifications.length).toBe(0));
2121
});
2222

2323
it('지정된 시간이 된 경우 알림이 새롭게 생성되어 추가된다', async () => {
24-
const { result } = renderHook(() => useNotifications(events as Event[]));
25-
26-
const start = new Date(`${events[0].date}T${events[0].startTime}`);
27-
const beforeStart = start.getTime() - 10 * 60000;
24+
const event = makeEvent({ date: '2025-10-15', startTime: '09:00', notificationTime: 10 });
25+
const { result } = renderHook(() => useNotifications([event]));
2826

27+
const start = new Date(`${event.date}T${event.startTime}`);
2928
await act(async () => {
30-
vi.setSystemTime(new Date(beforeStart - 1000));
29+
vi.setSystemTime(new Date(start.getTime() - 60_000));
3130
vi.advanceTimersByTime(1000);
3231
});
3332

34-
waitFor(() => expect(result.current.notifications.length).toBe(1));
33+
await waitFor(() => expect(result.current.notifications.length).toBe(1));
3534
});
3635

3736
it('index를 기준으로 알림을 적절하게 제거할 수 있다', async () => {
38-
const { result } = renderHook(() => useNotifications(events as Event[]));
39-
40-
const start = new Date(`${events[0].date}T${events[0].startTime}`);
41-
const beforeStart = start.getTime() - 10 * 60000;
37+
const event = makeEvent({ date: '2025-10-15', startTime: '09:00', notificationTime: 10 });
38+
const { result } = renderHook(() => useNotifications([event]));
4239

40+
const start = new Date(`${event.date}T${event.startTime}`);
4341
await act(async () => {
44-
vi.setSystemTime(new Date(beforeStart - 1000));
42+
vi.setSystemTime(new Date(start.getTime() - 60_000));
4543
vi.advanceTimersByTime(1000);
4644
});
4745

48-
waitFor(() => expect(result.current.notifications.length).toBe(1));
49-
50-
const removedIndex = 0;
46+
await waitFor(() => expect(result.current.notifications.length).toBe(1));
5147

5248
await act(async () => {
53-
result.current.removeNotification(removedIndex);
49+
result.current.removeNotification(0);
5450
});
5551

56-
waitFor(() => expect(result.current.notifications.length).toBe(0));
52+
await waitFor(() => expect(result.current.notifications.length).toBe(0));
5753
});
5854

5955
it('이미 알림이 발생한 이벤트에 대해서는 중복 알림이 발생하지 않아야 한다', () => {});

src/__tests__/unit/easy.notificationUtils.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ describe('getUpcomingEvents', () => {
1616
const result = getUpcomingEvents([dummyEvent], now, []);
1717
const eventIndex = result.findIndex((event) => event.id === dummyEvent.id);
1818

19-
expect(result[eventIndex]).toEqual(dummyEvent);
19+
expect(result[eventIndex]).toEqual({
20+
id: '1',
21+
date: '2025-08-19',
22+
startTime: '16:00',
23+
notificationTime: 10,
24+
});
2025
});
2126

2227
it('이미 알림이 간 이벤트는 제외한다', () => {

0 commit comments

Comments
 (0)