11import CssBaseline from '@mui/material/CssBaseline' ;
22import { ThemeProvider , createTheme } from '@mui/material/styles' ;
3- import { render , screen , within , act } from '@testing-library/react' ;
3+ import { render , screen , within , act , fireEvent , RenderResult , waitFor } from '@testing-library/react' ;
44import { UserEvent , userEvent } from '@testing-library/user-event' ;
55import { http , HttpResponse } from 'msw' ;
66import { SnackbarProvider } from 'notistack' ;
@@ -10,8 +10,42 @@ import App from '../App';
1010import { server } from '../setupTests' ;
1111import { Event } from '../types' ;
1212
13+ // 테스트에 사용할 공용 렌더 함수 (MUI + Snackbar Provider 랩핑)
14+ const renderApp = ( ) => {
15+ const theme = createTheme ( ) ;
16+ return render (
17+ < ThemeProvider theme = { theme } >
18+ < CssBaseline />
19+ < SnackbarProvider maxSnack = { 1 } >
20+ < App />
21+ </ SnackbarProvider >
22+ </ ThemeProvider >
23+ ) ;
24+ } ;
25+
1326describe ( '일정 CRUD 및 기본 기능' , ( ) => {
14- it ( '입력한 새로운 일정 정보에 맞춰 모든 필드가 이벤트 리스트에 정확히 저장된다.' , async ( ) => {
27+ it . only ( '입력한 새로운 일정 정보에 맞춰 모든 필드가 이벤트 리스트에 정확히 저장된다.' , async ( ) => {
28+ renderApp ( ) ;
29+
30+ fireEvent . change ( screen . getByLabelText ( '제목' ) , { target : { value : '테스트 - 새 회의' } } ) ;
31+ fireEvent . change ( screen . getByLabelText ( '날짜' ) , { target : { value : '2025-08-01' } } ) ;
32+ fireEvent . change ( screen . getByLabelText ( '설명' ) , { target : { value : '테스트 - 설명' } } ) ;
33+ fireEvent . change ( screen . getByLabelText ( '시작 시간' ) , { target : { value : '17:00' } } ) ;
34+ fireEvent . change ( screen . getByLabelText ( '종료 시간' ) , { target : { value : '18:00' } } ) ;
35+
36+ await fireEvent . click (
37+ screen . getByTestId ( 'event-submit-button' )
38+ ) ;
39+
40+ await waitFor ( ( ) => {
41+ screen . getByTestId ( 'event-list' ) ;
42+ } )
43+
44+ const eventList = within ( screen . getByTestId ( 'event-list' ) ) ;
45+ expect ( eventList . getByText ( '테스트 - 새 회의' ) ) . toBeInTheDocument ( ) ;
46+ expect ( eventList . getByText ( '2025-08-01' ) ) . toBeInTheDocument ( ) ;
47+ expect ( eventList . getByText ( '테스트 - 설명' ) ) . toBeInTheDocument ( ) ;
48+
1549 // ! HINT. event를 추가 제거하고 저장하는 로직을 잘 살펴보고, 만약 그대로 구현한다면 어떤 문제가 있을 지 고민해보세요.
1650 } ) ;
1751
0 commit comments