{ "id": "leave-policy", "name": "설정 - 휴가정책", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "url": "/ko/settings/leave-policy", "menuNavigation": { "level1": "설정", "level2": "휴가정책", "expectedUrl": "/ko/settings/leave-policy" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "level1": { "text": "설정", "alternativeNames": ["설정", "Settings", "환경설정"], "scrollConfig": { "maxScrollAttempts": 5, "scrollAmount": 200, "waitAfterScroll": 300 } }, "level2": { "text": "휴가관리", "alternativeNames": ["휴가관리", "Leave Management", "휴가정책"], "scrollConfig": { "maxScrollAttempts": 3, "scrollAmount": 150, "waitAfterScroll": 300 } }, "expectedUrl": "/ko/settings/leave-policy", "fallbackUrl": "/ko/settings/leave-policy" }, "expectedAPIs": [ { "method": "GET", "path": "/api/v1/leave-policy", "description": "휴가 정책 조회" }, { "method": "PUT", "path": "/api/v1/leave-policy", "description": "휴가 정책 저장" } ], "steps": [ { "id": 0, "name": "사이드바 준비", "description": "사이드바를 최상단으로 스크롤하여 메뉴 탐색 준비", "actions": [ { "type": "execute", "script": "document.querySelector('.sidebar-scroll, [class*=\"sidebar\"], nav')?.scrollTo({top: 0, behavior: 'instant'})" }, { "type": "wait", "duration": 500 } ], "expected": { "sidebarReady": true } }, { "id": 1, "name": "2단계 메뉴 진입: 설정 > 휴가관리", "description": "설정 > 휴가관리 메뉴로 이동하여 페이지 로드 확인 (scrollAndFind 패턴 사용)", "actions": [ { "type": "scrollAndFind", "target": "설정", "scrollContainer": ".sidebar-scroll, [class*='sidebar'], nav", "maxAttempts": 5, "scrollAmount": 200, "waitAfterScroll": 300, "alternativeNames": ["설정", "Settings", "환경설정"] }, { "type": "click", "target": "설정" }, { "type": "wait", "duration": 500 }, { "type": "scrollAndFind", "target": "휴가관리", "scrollContainer": ".sidebar-scroll, [class*='sidebar'], nav", "maxAttempts": 3, "scrollAmount": 150, "waitAfterScroll": 300, "alternativeNames": ["휴가관리", "Leave Management", "휴가정책"] }, { "type": "click", "target": "휴가관리" }, { "type": "wait", "target": "페이지 로드 완료" } ], "expected": { "url": "/ko/settings/leave-policy", "title": "휴가관리", "authenticated": true } }, { "id": 2, "name": "로딩 스피너 표시 확인", "action": "verify", "target": "loading", "expected": "'휴가 정책을 불러오는 중...' 표시" }, { "id": 3, "name": "페이지 제목 확인", "action": "verify", "target": "heading", "expected": "'휴가관리' 텍스트 표시" }, { "id": 4, "name": "설명 텍스트 확인", "action": "verify", "target": "description", "expected": "'휴가 정책을 관리합니다' 텍스트 표시" }, { "id": 5, "name": "저장 버튼 확인", "action": "verify", "target": "button", "expected": "'저장' 버튼 표시" }, { "id": 6, "name": "기준 설정 카드 확인", "action": "verify", "target": "card", "expected": "'기준 설정' 카드 표시" }, { "id": 7, "name": "연차 설정 카드 확인", "action": "verify", "target": "card", "expected": "'연차 설정' 카드 표시" }, { "id": 8, "name": "이월 설정 카드 확인", "action": "verify", "target": "card", "expected": "'이월 설정' 카드 표시" }, { "id": 9, "name": "초기 기준 타입 확인", "action": "verify", "target": "combobox", "expected": "'회계연도' 선택 상태" }, { "id": 10, "name": "초기 기준일 - 월 확인", "action": "verify", "target": "combobox", "expected": "'1월' 선택 상태, 활성화됨" }, { "id": 11, "name": "초기 기준일 - 일 확인", "action": "verify", "target": "combobox", "expected": "'1일' 선택 상태, 활성화됨" }, { "id": 12, "name": "기준 셀렉트 클릭", "action": "click", "target": "기준 셀렉트", "expected": "옵션 리스트 열림", "critical": true }, { "id": 13, "name": "기준 옵션 개수 확인", "action": "verify", "target": "options", "expected": "회계연도, 입사일 2개 옵션 표시" }, { "id": 14, "name": "입사일 기준 선택", "action": "select", "target": "입사일 옵션", "expected": "'입사일' 선택됨", "critical": true }, { "id": 15, "name": "입사일 선택 후 - 기준일 월 비활성화 확인", "action": "verify", "target": "combobox", "expected": "기준일 '월' 셀렉트 비활성화 (disabled)" }, { "id": 16, "name": "입사일 선택 후 - 기준일 일 비활성화 확인", "action": "verify", "target": "combobox", "expected": "기준일 '일' 셀렉트 비활성화 (disabled)" }, { "id": 17, "name": "회계연도로 다시 변경", "action": "select", "target": "회계연도 옵션", "expected": "'회계연도' 선택됨" }, { "id": 18, "name": "회계연도 선택 후 - 기준일 월 활성화 확인", "action": "verify", "target": "combobox", "expected": "기준일 '월' 셀렉트 활성화됨" }, { "id": 19, "name": "회계연도 선택 후 - 기준일 일 활성화 확인", "action": "verify", "target": "combobox", "expected": "기준일 '일' 셀렉트 활성화됨" }, { "id": 20, "name": "기준일 월 셀렉트 클릭", "action": "click", "target": "기준일 월 셀렉트", "expected": "월 옵션 리스트 열림" }, { "id": 21, "name": "기준일 월 옵션 개수 확인", "action": "verify", "target": "options", "expected": "1월~12월, 12개 옵션 표시" }, { "id": 22, "name": "기준일 월 변경 (6월)", "action": "select", "target": "6월 옵션", "expected": "'6월' 선택됨", "critical": true }, { "id": 23, "name": "기준일 일 셀렉트 클릭", "action": "click", "target": "기준일 일 셀렉트", "expected": "일 옵션 리스트 열림" }, { "id": 24, "name": "기준일 일 옵션 개수 확인", "action": "verify", "target": "options", "expected": "1일~31일, 31개 옵션 표시" }, { "id": 25, "name": "기준일 일 변경 (15일)", "action": "select", "target": "15일 옵션", "expected": "'15일' 선택됨", "critical": true }, { "id": 26, "name": "기본 연차 일수 초기값 확인", "action": "verify", "target": "spinbutton", "expected": "15일 표시" }, { "id": 27, "name": "기본 연차 일수 변경", "action": "input", "target": "기본 연차 일수 입력 필드", "value": "20", "expected": "20 입력됨", "critical": true }, { "id": 28, "name": "근속년수당 추가 연차 초기값 확인", "action": "verify", "target": "spinbutton", "expected": "1일 표시" }, { "id": 29, "name": "근속년수당 추가 연차 변경", "action": "input", "target": "근속년수당 추가 연차 입력 필드", "value": "2", "expected": "2 입력됨", "critical": true }, { "id": 30, "name": "최대 연차 일수 초기값 확인", "action": "verify", "target": "spinbutton", "expected": "25일 표시" }, { "id": 31, "name": "최대 연차 일수 변경", "action": "input", "target": "최대 연차 일수 입력 필드", "value": "30", "expected": "30 입력됨", "critical": true }, { "id": 32, "name": "연차 이월 허용 스위치 초기 상태 확인", "action": "verify", "target": "switch", "expected": "스위치 ON (checked) 상태" }, { "id": 33, "name": "이월 설정 필드 표시 확인", "action": "verify", "target": "fields", "expected": "'최대 이월 일수', '이월 연차 소멸 기간' 필드 표시됨" }, { "id": 34, "name": "최대 이월 일수 초기값 확인", "action": "verify", "target": "spinbutton", "expected": "10일 표시" }, { "id": 35, "name": "이월 연차 소멸 기간 초기값 확인", "action": "verify", "target": "spinbutton", "expected": "3개월 표시" }, { "id": 36, "name": "최대 이월 일수 변경", "action": "input", "target": "최대 이월 일수 입력 필드", "value": "15", "expected": "15 입력됨", "critical": true }, { "id": 37, "name": "이월 연차 소멸 기간 변경", "action": "input", "target": "이월 연차 소멸 기간 입력 필드", "value": "6", "expected": "6 입력됨", "critical": true }, { "id": 38, "name": "저장 버튼 클릭", "action": "click", "target": "저장 버튼", "expected": "저장 API 호출, 로딩 상태 표시", "critical": true }, { "id": 39, "name": "저장 완료 토스트 확인", "action": "verify", "target": "toast", "expected": "'휴가 정책이 저장되었습니다.' 토스트 표시" }, { "id": 40, "name": "URL 유지 확인", "action": "verify", "target": "url", "expected": "URL이 /settings/leave-policy 유지 (에러 페이지 이동 없음)" }, { "id": 41, "name": "페이지 새로고침", "action": "reload", "target": "page", "expected": "페이지 새로고침 후 GET API 재호출" }, { "id": 42, "name": "설정 지속성 - 기준 타입", "action": "verify", "target": "combobox", "expected": "'회계연도' 선택 상태 유지" }, { "id": 43, "name": "설정 지속성 - 기준일 월", "action": "verify", "target": "combobox", "expected": "'6월' 선택 상태 유지" }, { "id": 44, "name": "설정 지속성 - 기준일 일", "action": "verify", "target": "combobox", "expected": "'15일' 선택 상태 유지" }, { "id": 45, "name": "설정 지속성 - 기본 연차 일수", "action": "verify", "target": "spinbutton", "expected": "20일 유지" }, { "id": 46, "name": "설정 지속성 - 근속년수당 추가 연차", "action": "verify", "target": "spinbutton", "expected": "2일 유지" }, { "id": 47, "name": "설정 지속성 - 최대 연차 일수", "action": "verify", "target": "spinbutton", "expected": "30일 유지" }, { "id": 48, "name": "설정 지속성 - 이월 허용", "action": "verify", "target": "switch", "expected": "스위치 ON 상태 유지" }, { "id": 49, "name": "설정 지속성 - 최대 이월 일수", "action": "verify", "target": "spinbutton", "expected": "15일 유지" }, { "id": 50, "name": "설정 지속성 - 이월 소멸 기간", "action": "verify", "target": "spinbutton", "expected": "6개월 유지" }, { "id": 51, "name": "연차 이월 허용 스위치 OFF", "action": "click", "target": "연차 이월 허용 스위치", "expected": "스위치 OFF 상태", "critical": true }, { "id": 52, "name": "이월 OFF 후 - 하위 필드 숨김 확인", "action": "verify", "target": "fields", "expected": "'최대 이월 일수', '이월 연차 소멸 기간' 필드 숨겨짐" }, { "id": 53, "name": "이월 OFF 후 - 안내 문구 숨김 확인", "action": "verify", "target": "paragraph", "expected": "'이월된 연차는...' 안내 문구 숨겨짐" }, { "id": 54, "name": "연차 이월 허용 스위치 다시 ON", "action": "click", "target": "연차 이월 허용 스위치", "expected": "스위치 ON 상태" }, { "id": 55, "name": "이월 ON 후 - 하위 필드 표시 확인", "action": "verify", "target": "fields", "expected": "'최대 이월 일수', '이월 연차 소멸 기간' 필드 표시됨" }, { "id": 56, "name": "이월 ON 후 - 이전 값 유지 확인", "action": "verify", "target": "spinbutton", "expected": "최대 이월 15일, 소멸 기간 6개월 유지" }, { "id": 57, "name": "기준 타입 변경 (입사일)", "action": "select", "target": "입사일 옵션", "expected": "'입사일' 선택됨" }, { "id": 58, "name": "입사일 선택 후 저장", "action": "click", "target": "저장 버튼", "expected": "저장 성공 토스트 표시" }, { "id": 59, "name": "입사일 저장 후 새로고침", "action": "reload", "target": "page", "expected": "페이지 새로고침" }, { "id": 60, "name": "입사일 설정 지속성 확인", "action": "verify", "target": "combobox", "expected": "'입사일' 선택 상태 유지" }, { "id": 61, "name": "입사일 유지 시 - 기준일 비활성화 확인", "action": "verify", "target": "combobox", "expected": "기준일 월/일 셀렉트 비활성화 (disabled)" }, { "id": 62, "name": "숫자 입력 유효성 - 음수 테스트", "action": "input", "target": "기본 연차 일수 입력 필드", "value": "-5", "expected": "음수 입력 불가 또는 0으로 변환" }, { "id": 63, "name": "숫자 입력 유효성 - 최대값 초과 테스트", "action": "input", "target": "기본 연차 일수 입력 필드", "value": "150", "expected": "최대값(100) 제한 적용" }, { "id": 64, "name": "숫자 입력 유효성 - 문자 입력 테스트", "action": "input", "target": "기본 연차 일수 입력 필드", "value": "abc", "expected": "숫자 이외 입력 불가 또는 0으로 변환" }, { "id": 65, "name": "콘솔 에러 확인", "action": "verify", "target": "console", "expected": "콘솔에 에러 로그 없음" }, { "id": 66, "name": "안내 문구 개수 확인", "action": "verify", "target": "help-text", "expected": "3개 카드별 안내 문구 표시" }, { "id": 67, "name": "최종 상태 확인", "action": "verify", "target": "page", "expected": "페이지 정상 동작, 모든 설정 저장됨" } ], "testData": { "settings": { "fiscal": { "standardType": "fiscal", "fiscalStartMonth": 6, "fiscalStartDay": 15, "defaultAnnualLeave": 20, "additionalLeavePerYear": 2, "maxAnnualLeave": 30, "carryOverEnabled": true, "carryOverMaxDays": 15, "carryOverExpiryMonths": 6 }, "hire": { "standardType": "hire", "defaultAnnualLeave": 20, "additionalLeavePerYear": 2, "maxAnnualLeave": 30, "carryOverEnabled": true, "carryOverMaxDays": 15, "carryOverExpiryMonths": 6 } }, "monthOptions": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "dayOptions": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] } }