Skip to content

Commit b2d6dff

Browse files
committed
test: 단일 일정 삭제시 해당 일정만 삭제 테스트
1 parent 5d12d8d commit b2d6dff

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

src/App.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,11 @@ function App() {
602602
<IconButton aria-label="Edit event" onClick={() => editEvent(event)}>
603603
<Edit />
604604
</IconButton>
605-
<IconButton aria-label="Delete event" onClick={() => deleteEvent(event.id)}>
606-
<Delete />
605+
<IconButton
606+
aria-label={`Delete event ${event.date}`}
607+
onClick={() => deleteEvent(event.id)}
608+
>
609+
<Delete data-testid="DeleteIcon" aria-hidden={false} role="img" />
607610
</IconButton>
608611
</Stack>
609612
</Stack>

src/__tests__/repeat/integration/integration.spec.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ import { CssBaseline } from '@mui/material';
22
import { createTheme, ThemeProvider } from '@mui/material/styles';
33
import { screen, within, waitFor, render } from '@testing-library/react';
44
import { userEvent } from '@testing-library/user-event';
5+
import { http, HttpResponse } from 'msw';
56
import { SnackbarProvider } from 'notistack';
67
import { ReactElement } from 'react';
78

9+
import { handlers } from '../../../__mocks__/handlers';
810
import {
911
setupMockHandlerCreation,
1012
setupMockHandlerUpdating,
1113
} from '../../../__mocks__/handlersUtils';
14+
import { setupMockHandlerDeletion } from '../../../__mocks__/handlersUtils';
1215
import App from '../../../App';
16+
import { server } from '../../../setupTests';
17+
import { makeEvent } from '../../utils';
1318

1419
const theme = createTheme();
1520

@@ -99,4 +104,57 @@ describe('반복 UI 및 표시', () => {
99104
expect(weekView.queryByLabelText('반복 일정 아이콘')).not.toBeInTheDocument();
100105
});
101106
});
107+
108+
it('반복일정을 단일 삭제하면 해당 날짜 셀에서만 사라진다', async () => {
109+
// 현재 주간 뷰 범위에 10/16, 10/17이 포함되도록 고정
110+
vi.setSystemTime(new Date('2025-10-16'));
111+
112+
// 반복: daily 10/15 시작 ~ 10/22 종료, 서버에는 베이스 이벤트 1건만 존재
113+
const series = makeEvent({
114+
id: 'r1',
115+
title: '반복 삭제 테스트',
116+
date: '2025-10-15',
117+
startTime: '09:00',
118+
endTime: '10:00',
119+
category: '업무',
120+
repeat: { type: 'daily', interval: 1, endDate: '2025-10-22' },
121+
});
122+
123+
setupMockHandlerCreation([series]);
124+
125+
const { user } = setup(<App />);
126+
127+
await user.click(within(screen.getByLabelText('뷰 타입 선택')).getByRole('combobox'));
128+
await user.click(screen.getByRole('option', { name: 'month-option' }));
129+
const monthView = within(screen.getByTestId('month-view'));
130+
131+
const day16Cell = within(monthView.getByText('16').closest('td')!);
132+
await waitFor(() => expect(day16Cell.getByText('반복 삭제 테스트')).toBeInTheDocument());
133+
134+
const day17Cell = within(monthView.getByText('17').closest('td')!);
135+
await waitFor(() => expect(day17Cell.getByText('반복 삭제 테스트')).toBeInTheDocument());
136+
137+
let mockEvents = [series];
138+
139+
server.use(
140+
http.get('/api/events', () => {
141+
return HttpResponse.json({ events: mockEvents });
142+
}),
143+
http.delete('/api/events/:id', ({ params }) => {
144+
const { id } = params;
145+
mockEvents = mockEvents.filter((event) => event.id !== id);
146+
return new HttpResponse(null, { status: 204 });
147+
})
148+
);
149+
150+
const deleteBtn = screen.getByRole('button', {
151+
name: 'Delete event 2025-10-16',
152+
});
153+
await user.click(deleteBtn);
154+
155+
await waitFor(() => {
156+
expect(day16Cell.queryByText('반복 삭제 테스트')).not.toBeInTheDocument();
157+
expect(day17Cell.getByText('반복 삭제 테스트')).toBeInTheDocument();
158+
});
159+
});
102160
});

0 commit comments

Comments
 (0)