{ "id": "permission-management", "name": "설정 - 권한관리", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "url": "/ko/settings/permissions", "menuNavigation": { "level1": "설정", "level2": "권한관리", "expectedUrl": "/ko/settings/permissions" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지", "level1": "설정", "level2": "권한관리", "alternativeLevel1Names": ["설정", "Settings", "환경설정", "시스템설정", "관리"], "alternativeLevel2Names": ["권한관리", "권한 관리", "Permissions", "역할관리", "Role Management"], "scrollConfig": { "sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar", "menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']", "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 } }, "expectedAPIs": [ { "method": "GET", "path": "/api/roles", "description": "역할 목록 조회" }, { "method": "GET", "path": "/api/roles/stats", "description": "역할 통계 조회" }, { "method": "POST", "path": "/api/roles", "description": "역할 생성" }, { "method": "GET", "path": "/api/roles/{id}", "description": "역할 상세 조회" }, { "method": "PUT", "path": "/api/roles/{id}", "description": "역할 수정" }, { "method": "DELETE", "path": "/api/roles/{id}", "description": "역할 삭제" }, { "method": "GET", "path": "/api/roles/{id}/permissions", "description": "역할별 권한 매트릭스 조회" }, { "method": "PUT", "path": "/api/roles/{id}/permissions", "description": "역할별 권한 저장" } ], "steps": [ { "id": "step-00", "name": "사이드바 메뉴 탐색 준비", "description": "사이드바를 최상단으로 스크롤하고 메뉴 구조 파악", "actions": [ { "type": "scroll", "target": "sidebar", "direction": "top", "description": "사이드바 최상단으로 스크롤" }, { "type": "wait", "duration": 500 } ] }, { "id": "step-01", "name": "2단계 메뉴 진입: 설정 > 권한관리", "description": "사이드바를 스크롤하며 설정 > 권한관리 메뉴를 찾아 클릭", "actions": [ { "type": "scrollAndFind", "target": "설정", "alternativeTexts": ["설정", "Settings", "환경설정", "시스템설정"], "scrollContainer": "sidebar", "maxAttempts": 10, "description": "스크롤하며 설정 메뉴 찾기" }, { "type": "click", "target": "설정", "description": "설정 메뉴 클릭" }, { "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" }, { "type": "scrollAndFind", "target": "권한관리", "alternativeTexts": ["권한관리", "권한 관리", "Permissions", "역할관리"], "scrollContainer": "submenu", "maxAttempts": 5, "description": "서브메뉴에서 권한관리 찾기" }, { "type": "click", "target": "권한관리", "description": "권한관리 메뉴 클릭" }, { "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 } ], "expected": { "url": "/ko/settings/permissions", "title": "권한관리", "authenticated": true }, "verification": [ "설정 메뉴가 펼쳐졌는지 확인", "권한관리 서브메뉴 클릭 성공", "페이지 타이틀 '권한관리' 확인", "설명 '역할 기반 권한을 관리합니다' 확인", "Shield 아이콘 표시", "404 에러 없이 페이지 로드 완료" ] }, { "id": "step-02", "name": "통계 카드 확인", "action": "verify", "verification": [ "통계 카드 4개 표시: 전체 역할, 공개, 숨김, 사용 중", "각 카드에 아이콘과 숫자 표시" ] }, { "id": "step-03", "name": "탭 확인", "action": "verify", "verification": [ "탭 3개 표시: 전체, 공개, 숨김", "각 탭에 카운트 표시" ] }, { "id": "step-04", "name": "테이블 구조 확인", "action": "verify", "verification": [ "테이블 컬럼 확인: 체크박스, 번호, 역할, 설명, 상태, 등록일", "역할 등록 버튼 존재", "검색창 존재 (placeholder: '역할명, 설명 검색...')" ] }, { "id": "step-05", "name": "탭 필터 테스트 - 공개", "action": "click", "target": "공개 탭", "verification": [ "공개 탭 활성화", "공개 상태 역할만 표시", "데이터 필터링 확인" ] }, { "id": "step-06", "name": "탭 필터 테스트 - 숨김", "action": "click", "target": "숨김 탭", "verification": [ "숨김 탭 활성화", "숨김 상태 역할만 표시", "데이터 필터링 확인" ] }, { "id": "step-07", "name": "탭 필터 테스트 - 전체", "action": "click", "target": "전체 탭", "verification": [ "전체 탭 활성화", "모든 역할 표시" ] }, { "id": "step-08", "name": "검색 기능 테스트", "action": "type", "target": "검색 입력 필드", "value": "관리자", "verification": [ "'관리자' 포함된 역할만 표시", "실시간 필터링 동작" ] }, { "id": "step-09", "name": "검색 초기화", "action": "clear", "target": "검색 입력 필드", "verification": [ "검색어 제거됨", "전체 목록 복원" ] }, { "id": "step-10", "name": "역할 등록 페이지 이동", "action": "click", "target": "역할 등록 버튼", "verification": [ "URL 변경: /settings/permissions?mode=new", "페이지 타이틀 변경 확인" ] }, { "id": "step-11", "name": "역할명 입력", "action": "type", "target": "권한명 입력 필드", "value": "E2E 테스트 역할", "verification": [ "입력 값 반영 확인" ] }, { "id": "step-12", "name": "설명 입력", "action": "type", "target": "설명 입력 필드 (있는 경우)", "value": "E2E 테스트를 위한 역할입니다", "verification": [ "입력 값 반영 확인" ] }, { "id": "step-13", "name": "상태 선택", "action": "select", "target": "상태 드롭다운", "value": "공개", "verification": [ "상태 선택 확인" ] }, { "id": "step-14", "name": "역할 등록", "action": "click", "target": "등록 버튼", "critical": true, "verification": [ "현재 URL 저장", "등록 버튼 클릭", "URL 변경 여부 확인 (에러 페이지 이동 방지)", "에러 텍스트 없음 ('페이지를 찾을 수 없습니다', '404', 'Not Found' 등)", "API 호출 확인: POST /api/roles", "API 응답 200 OK 확인", "목록 페이지로 리다이렉트 또는 상세 페이지 이동", "성공 토스트 메시지 확인" ] }, { "id": "step-15", "name": "목록에서 신규 역할 확인", "action": "verify", "verification": [ "목록 페이지 진입 (URL: /settings/permissions)", "'E2E 테스트 역할' 목록에 표시", "통계 카드 숫자 증가 확인" ] }, { "id": "step-16", "name": "역할 상세 페이지 이동", "action": "click", "target": "E2E 테스트 역할 행", "verification": [ "URL 변경: /settings/permissions/{id}", "페이지 타이틀 '권한 상세' 확인", "기본 정보 섹션 표시", "메뉴별 권한 테이블 표시" ] }, { "id": "step-17", "name": "기본 정보 확인", "action": "verify", "verification": [ "권한명 입력 필드에 'E2E 테스트 역할' 표시", "상태 드롭다운에 '공개' 선택됨", "삭제 버튼 존재", "수정 버튼 존재", "목록으로 버튼 존재" ] }, { "id": "step-18", "name": "권한 테이블 구조 확인", "action": "verify", "verification": [ "테이블 헤더: 메뉴, 조회, 생성, 수정, 삭제, 승인, 내보내기, 관리", "각 헤더에 전체 선택 체크박스 존재", "메뉴 목록 표시 (부모 메뉴 접기/펼치기 아이콘 있음)", "각 메뉴별 권한 체크박스 존재" ] }, { "id": "step-19", "name": "부모 메뉴 펼치기", "action": "click", "target": "첫 번째 부모 메뉴 펼치기 아이콘", "verification": [ "자식 메뉴 목록 표시", "아이콘이 ChevronDown으로 변경", "자식 메뉴는 들여쓰기되어 표시" ] }, { "id": "step-20", "name": "개별 권한 체크박스 토글", "action": "click", "target": "첫 번째 메뉴의 '조회' 체크박스", "verification": [ "체크박스 상태 변경", "자동 저장 동작 (API 호출 확인)" ] }, { "id": "step-21", "name": "컬럼 전체 선택", "action": "click", "target": "'조회' 헤더 체크박스", "verification": [ "모든 메뉴의 '조회' 권한 체크", "자동 저장 동작 확인" ] }, { "id": "step-22", "name": "권한명 수정", "action": "type", "target": "권한명 입력 필드", "value": "E2E 테스트 역할 (수정됨)", "verification": [ "입력 값 변경 확인" ] }, { "id": "step-23", "name": "권한명 수정 저장 (blur)", "action": "blur", "target": "권한명 입력 필드", "verification": [ "자동 저장 동작 (API 호출)", "PUT /api/roles/{id} 확인" ] }, { "id": "step-24", "name": "상태 변경", "action": "select", "target": "상태 드롭다운", "value": "숨김", "verification": [ "상태 변경 확인", "자동 저장 동작" ] }, { "id": "step-25", "name": "목록으로 이동", "action": "click", "target": "목록으로 버튼", "verification": [ "URL 변경: /settings/permissions", "목록 페이지 표시" ] }, { "id": "step-26", "name": "수정된 역할 확인", "action": "verify", "verification": [ "'E2E 테스트 역할 (수정됨)' 목록에 표시", "상태 Badge '숨김'으로 표시" ] }, { "id": "step-27", "name": "숨김 탭으로 이동", "action": "click", "target": "숨김 탭", "verification": [ "숨김 상태 역할만 표시", "'E2E 테스트 역할 (수정됨)' 표시됨" ] }, { "id": "step-28", "name": "전체 탭으로 복귀", "action": "click", "target": "전체 탭", "verification": [ "모든 역할 표시" ] }, { "id": "step-29", "name": "체크박스 선택", "action": "click", "target": "E2E 테스트 역할 체크박스", "verification": [ "체크박스 선택됨", "'1개 항목 선택됨' 표시", "'선택 삭제 (1)' 버튼 표시", "작업 컬럼 추가 (권한 설정, 수정, 삭제 버튼)" ] }, { "id": "step-30", "name": "단일 삭제 - 작업 컬럼 삭제 버튼", "action": "click", "target": "작업 컬럼의 삭제 버튼", "verification": [ "삭제 확인 다이얼로그 표시", "다이얼로그 제목: '역할 삭제'", "경고 메시지: '이 역할을 사용 중인 사원이 있으면 해당 사원의 역할이 초기화됩니다.'" ] }, { "id": "step-31", "name": "삭제 취소", "action": "click", "target": "다이얼로그 취소 버튼", "verification": [ "다이얼로그 닫힘", "역할 삭제되지 않음" ] }, { "id": "step-32", "name": "일괄 삭제 버튼 클릭", "action": "click", "target": "선택 삭제 버튼", "verification": [ "삭제 확인 다이얼로그 표시", "'선택한 1개의 역할을 삭제하시겠습니까?' 메시지" ] }, { "id": "step-33", "name": "일괄 삭제 실행", "action": "click", "target": "다이얼로그 삭제 버튼", "critical": true, "verification": [ "삭제 중 로딩 표시 ('삭제 중...')", "API 호출: DELETE /api/roles/{id}", "API 응답 200 OK 확인", "다이얼로그 닫힘", "성공 토스트 메시지 확인", "목록에서 삭제된 역할 제거됨", "통계 카드 숫자 감소 확인" ] }, { "id": "step-34", "name": "체크박스 전체 선택", "action": "click", "target": "테이블 헤더 체크박스", "verification": [ "현재 페이지의 모든 항목 선택", "'N개 항목 선택됨' 표시", "'선택 삭제 (N)' 버튼 표시" ] }, { "id": "step-35", "name": "전체 선택 해제", "action": "click", "target": "테이블 헤더 체크박스", "verification": [ "모든 선택 해제", "'선택 삭제' 버튼 숨김", "작업 컬럼 제거" ] }, { "id": "step-36", "name": "페이지네이션 테스트 (데이터 충분 시)", "action": "verify", "verification": [ "페이지네이션 컨트롤 존재 여부 확인", "페이지당 20개 항목 표시", "총 페이지 수 표시" ] }, { "id": "step-37", "name": "반응형 테스트 - 모바일", "action": "resize", "width": 375, "height": 667, "verification": [ "모바일 카드 레이아웃으로 변경", "각 카드에 역할명, 상태, 설명, 등록일 표시", "카드에 권한 설정, 수정 버튼 존재" ] } ], "testData": { "role": { "name": "E2E 테스트 역할", "description": "E2E 테스트를 위한 역할입니다", "status": "active" } }, "cleanup": { "description": "Step-33에서 테스트 데이터 삭제 완료" } }