diff --git a/customer-event.json b/customer-event.json index 16c1ac6..3c38266 100644 --- a/customer-event.json +++ b/customer-event.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "고객센터 > 이벤트 게시판 메뉴의 이벤트 목록 기능 테스트", + "description": "고객센터 > 이벤트 게시판 메뉴의 이벤트 목록 조회/상세보기 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "고객센터", "level2": "이벤트 게시판", - "expectedUrl": "/customer-center/events" + "expectedUrl": "/customer-center/events", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,18 +35,119 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "이벤트 목록 표시" + "이벤트 목록 표시", + "이벤트 카드 또는 리스트" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "이벤트 기능 확인", + "name": "이벤트 페이지 구조 확인", "action": "verify_elements", "checks": [ - "이벤트 목록 테이블" + "이벤트 목록 (카드 또는 테이블)", + "이벤트 상태 표시 (진행중/종료)", + "검색 기능" ], - "expected": "이벤트 기능 표시" + "expected": "이벤트 페이지 구조 정상" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] 이벤트 목록 데이터 확인", + "action": "verify_detail", + "checks": [ + "이벤트 항목 존재 또는 '등록된 이벤트 없음' 메시지" + ], + "expected": "이벤트 데이터 표시" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 상태별 필터", + "action": "verify_elements", + "checks": [ + "전체/진행중/종료 필터 가능" + ], + "expected": "상태 필터 표시" + }, + { + "id": 6, + "phase": "READ", + "name": "[READ] 이벤트 상세 보기", + "action": "click", + "target": "[class*='event']:first-child, table tbody tr:first-child, [class*='card']:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 7, + "name": "이벤트 상세 정보 확인", + "action": "verify_detail", + "checks": [ + "이벤트 제목", + "이벤트 기간", + "이벤트 내용", + "이벤트 이미지 (있을 경우)" + ], + "expected": "이벤트 상세 정보 표시" + }, + { + "id": 8, + "name": "이벤트 참여 버튼 확인", + "action": "verify_elements", + "checks": [ + "참여하기 버튼 존재 여부 (진행중 이벤트)" + ], + "expected": "참여 버튼 확인" + }, + { + "id": 9, + "name": "공유 기능 확인", + "action": "verify_elements", + "checks": [ + "공유 버튼 또는 링크 복사 기능" + ], + "expected": "공유 기능 표시" + }, + { + "id": 10, + "name": "목록으로 돌아가기", + "action": "click", + "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", + "expected": "목록 페이지로 복귀" + }, + { + "id": 11, + "name": "페이지네이션 확인", + "action": "verify_elements", + "checks": [ + "페이지 번호 또는 더보기 버튼" + ], + "expected": "페이지네이션 표시" + }, + { + "id": 12, + "name": "이벤트 기간 정보 확인", + "action": "verify_detail", + "checks": [ + "시작일/종료일 표시", + "D-Day 또는 남은 기간 표시" + ], + "expected": "기간 정보 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/customer/events", + "description": "이벤트 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/customer/events/:id", + "description": "이벤트 상세 조회" } ], "requiredVerifications": [ @@ -52,7 +155,10 @@ "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "이벤트 기능 확인" + "criteria": "이벤트 목록, 이벤트 카드/리스트 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/customer-faq.json b/customer-faq.json index 6a180ce..bd8e2a8 100644 --- a/customer-faq.json +++ b/customer-faq.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "고객센터 > FAQ 메뉴의 자주 묻는 질문 기능 테스트", + "description": "고객센터 > FAQ 메뉴의 자주 묻는 질문 조회/검색/카테고리 필터 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "고객센터", "level2": "FAQ", - "expectedUrl": "/customer-center/faq" + "expectedUrl": "/customer-center/faq", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,27 +35,134 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "FAQ 목록 표시" + "FAQ 목록 표시", + "카테고리 또는 검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "FAQ 기능 확인", + "name": "FAQ 페이지 구조 확인", "action": "verify_elements", "checks": [ - "FAQ 항목 목록", - "카테고리 또는 검색" + "FAQ 항목 목록 (아코디언 또는 리스트)", + "카테고리 탭/필터", + "검색 기능" ], - "expected": "FAQ 기능 표시" + "expected": "FAQ 페이지 구조 정상" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] FAQ 목록 데이터 확인", + "action": "verify_detail", + "checks": [ + "FAQ 항목 존재 또는 '등록된 FAQ 없음' 메시지" + ], + "expected": "FAQ 데이터 표시" + }, + { + "id": 5, + "phase": "READ", + "name": "[READ] FAQ 항목 펼치기", + "action": "click", + "target": "[class*='accordion']:first-child, [class*='faq']:first-child, table tbody tr:first-child", + "expected": { + "accordion_open": true + } + }, + { + "id": 6, + "name": "FAQ 답변 내용 확인", + "action": "verify_detail", + "checks": [ + "답변 내용 표시" + ], + "expected": "FAQ 답변 표시" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 카테고리 필터", + "action": "click", + "target": "[class*='category'], [class*='tab'], button:has-text('카테고리')", + "expected": "카테고리 선택 가능" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 카테고리 선택 후 결과", + "action": "verify_detail", + "checks": [ + "해당 카테고리 FAQ만 표시" + ], + "expected": "카테고리 필터 동작" + }, + { + "id": 9, + "phase": "SEARCH", + "name": "[SEARCH] FAQ 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "테스트", + "submit": true + }, + { + "id": 10, + "phase": "SEARCH", + "name": "[SEARCH] 검색 결과 확인", + "action": "verify_detail", + "checks": [ + "검색 결과 표시 또는 결과 없음 메시지" + ], + "expected": "검색 기능 동작" + }, + { + "id": 11, + "name": "FAQ 접기/펼치기 토글", + "action": "verify_elements", + "checks": [ + "접기/펼치기 아이콘 또는 버튼" + ], + "expected": "토글 기능 표시" + }, + { + "id": 12, + "name": "전체 보기/접기", + "action": "verify_elements", + "checks": [ + "전체 펼치기/접기 버튼 존재 여부" + ], + "expected": "전체 토글 기능 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/customer/faq", + "description": "FAQ 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/customer/faq/categories", + "description": "FAQ 카테고리 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [7, 8, 9, 10], + "criteria": "카테고리 필터 + 검색 기능 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "FAQ 기능 확인" + "criteria": "FAQ 목록, 카테고리/검색 기능 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/customer-inquiry.json b/customer-inquiry.json index 73bf976..4c44d13 100644 --- a/customer-inquiry.json +++ b/customer-inquiry.json @@ -5,17 +5,26 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "고객센터 > 1:1 문의 메뉴의 문의 기능 테스트", + "description": "고객센터 > 1:1 문의 메뉴의 문의 등록/조회/답변확인 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "고객센터", "level2": "1:1 문의", - "expectedUrl": "/customer-center/inquiry" + "expectedUrl": "/customer-center/inquiry", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "title": "E2E_TEST_문의_{timestamp}", + "content": "E2E 테스트용 문의입니다.", + "category": "기타" + } + }, "steps": [ { "id": 1, @@ -25,7 +34,7 @@ "level2": "1:1 문의", "expected": { "url_contains": "/customer-center", - "visible": ["문의"] + "visible": ["문의", "1:1"] } }, { @@ -33,26 +42,173 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "문의 목록 또는 문의 작성 폼 표시" + "문의 목록 표시 또는 문의 작성 폼", + "문의하기 버튼 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "문의 기능 확인", + "name": "1:1 문의 페이지 구조 확인", "action": "verify_elements", "checks": [ - "문의 작성 버튼 또는 폼" + "내 문의 목록", + "문의하기 버튼", + "상태 필터 (대기/완료)" ], - "expected": "문의 기능 표시" + "expected": "문의 페이지 구조 정상" + }, + { + "id": 4, + "phase": "CREATE", + "name": "[CREATE] 문의하기 버튼 클릭", + "action": "click", + "target": "button:has-text('문의'), button:has-text('작성'), button:has-text('등록')", + "expected": { + "modal_open": true + } + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 카테고리 선택", + "action": "click", + "target": "select[name*='category'], button:has-text('카테고리')", + "expected": "카테고리 선택 가능" + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 제목 입력", + "action": "fill", + "target": "input[name*='title'], input[placeholder*='제목']", + "value": "E2E_TEST_문의_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 내용 입력", + "action": "fill", + "target": "textarea[name*='content'], textarea[placeholder*='내용']", + "value": "E2E 테스트용 문의입니다.\n테스트 완료 후 삭제됩니다.", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 문의 등록", + "action": "click", + "target": "button:has-text('등록'), button:has-text('문의하기'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/customer/inquiries", + "toast": "등록|접수|완료|성공" + }, + "expected": "문의 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 문의 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_문의 목록에 표시", + "대기중/접수 상태" + ], + "expected": "등록된 문의 확인" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 문의 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST'), [class*='list'] [class*='item']:has-text('E2E_TEST')", + "expected": { + "detail_view": true + } + }, + { + "id": 11, + "name": "문의 상세 정보 확인", + "action": "verify_detail", + "checks": [ + "제목 표시", + "내용 표시", + "등록일 표시", + "처리 상태 표시" + ], + "expected": "문의 상세 정보 표시" + }, + { + "id": 12, + "name": "답변 영역 확인", + "action": "verify_elements", + "checks": [ + "답변 영역 존재 (답변 대기 또는 답변 내용)" + ], + "expected": "답변 영역 표시" + }, + { + "id": 13, + "name": "목록으로 돌아가기", + "action": "click", + "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", + "expected": "목록 페이지로 복귀" + }, + { + "id": 14, + "name": "상태별 필터 확인", + "action": "verify_elements", + "checks": [ + "전체/대기중/답변완료 필터" + ], + "expected": "상태 필터 표시" + }, + { + "id": 15, + "phase": "DELETE", + "name": "[DELETE] 문의 삭제 (가능 시)", + "action": "click_if_exists", + "target": "button:has-text('삭제'), button:has-text('취소')", + "expected": "삭제 기능 확인 (없을 수 있음)" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/customer/inquiries", + "description": "문의 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/customer/inquiries", + "description": "문의 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/customer/inquiries/:id", + "description": "문의 상세 조회" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8], + "criteria": "API 호출 + 성공 토스트 + 목록 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "문의 기능 확인" + "criteria": "문의 목록/작성 폼, 문의하기 버튼 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "cleanupRequired": "E2E_TEST_문의_* 패턴 데이터 삭제 (관리자 권한 필요 시 수동)" + } } diff --git a/customer-notice.json b/customer-notice.json index 64ac1d0..ac4283c 100644 --- a/customer-notice.json +++ b/customer-notice.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "고객센터 > 공지사항 메뉴의 공지사항 조회 기능 테스트", + "description": "고객센터 > 공지사항 메뉴의 공지사항 조회/검색/상세보기 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "고객센터", "level2": "공지사항", - "expectedUrl": "/support/notice" + "expectedUrl": "/support/notice", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -34,36 +36,166 @@ "action": "verify_not_mockup", "checks": [ "공지사항 목록 표시", - "검색 기능 존재" + "검색 기능 존재", + "목록 테이블 또는 카드" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "공지사항 목록 확인", + "name": "공지사항 목록 구조 확인", "action": "verify_table", "checks": [ "번호 컬럼", "제목 컬럼", "작성자 컬럼", - "작성일 컬럼" + "작성일 컬럼", + "조회수 컬럼" ], "expected": "공지사항 목록 표시" }, { "id": 4, - "name": "공지사항 상세 보기", + "phase": "READ", + "name": "[READ] 공지사항 목록 데이터 확인", + "action": "verify_detail", + "checks": [ + "공지사항 데이터 행 존재 또는 '등록된 공지 없음' 메시지" + ], + "expected": "공지사항 데이터 표시" + }, + { + "id": 5, + "phase": "SEARCH", + "name": "[SEARCH] 공지사항 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "테스트", + "submit": true + }, + { + "id": 6, + "phase": "SEARCH", + "name": "[SEARCH] 검색 결과 확인", + "action": "verify_detail", + "checks": [ + "검색 결과 표시 또는 결과 없음 메시지" + ], + "expected": "검색 기능 동작" + }, + { + "id": 7, + "phase": "SEARCH", + "name": "[SEARCH] 검색 초기화", "action": "click", - "target": "table tbody tr:first-child", - "expected": "공지사항 상세 페이지로 이동" + "target": "button:has-text('초기화'), button:has-text('전체'), button[class*='clear']", + "expected": "검색 초기화" + }, + { + "id": 8, + "phase": "READ", + "name": "[READ] 공지사항 상세 보기", + "action": "click", + "target": "table tbody tr:first-child, [class*='list'] [class*='item']:first-child", + "expected": { + "detail_view": true, + "url_change": true + } + }, + { + "id": 9, + "name": "상세 페이지 구조 확인", + "action": "verify_elements", + "checks": [ + "제목 표시", + "작성자 표시", + "작성일 표시", + "내용 표시" + ], + "expected": "상세 페이지 정상 표시" + }, + { + "id": 10, + "name": "첨부파일 확인", + "action": "verify_elements", + "checks": [ + "첨부파일 영역 존재 여부" + ], + "expected": "첨부파일 영역 확인" + }, + { + "id": 11, + "name": "이전/다음 글 네비게이션", + "action": "verify_elements", + "checks": [ + "이전 글 링크 또는 버튼", + "다음 글 링크 또는 버튼" + ], + "expected": "글 네비게이션 표시" + }, + { + "id": 12, + "name": "목록으로 돌아가기", + "action": "click", + "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", + "expected": "목록 페이지로 복귀" + }, + { + "id": 13, + "name": "페이지네이션 확인", + "action": "verify_elements", + "checks": [ + "페이지 번호 표시", + "이전/다음 페이지 버튼" + ], + "expected": "페이지네이션 표시" + }, + { + "id": 14, + "name": "정렬 기능 확인", + "action": "verify_elements", + "checks": [ + "최신순/조회순 정렬 가능" + ], + "expected": "정렬 기능 표시" + }, + { + "id": 15, + "name": "중요 공지 표시 확인", + "action": "verify_elements", + "checks": [ + "중요/고정 공지 상단 표시 여부" + ], + "expected": "중요 공지 표시 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/support/notices", + "description": "공지사항 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/support/notices/:id", + "description": "공지사항 상세 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [5, 6, 7], + "criteria": "검색 기능 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "공지사항 목록 확인" + "criteria": "공지사항 목록, 검색 기능, 목록 표시 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/sales-client.json b/sales-client.json index 5eacb0b..8e74a9d 100644 --- a/sales-client.json +++ b/sales-client.json @@ -5,17 +5,26 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "판매관리 > 거래처관리 메뉴의 판매 거래처 조회/관리 기능 테스트", + "description": "판매관리 > 거래처관리 메뉴의 판매 거래처 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "판매관리", "level2": "거래처관리", - "expectedUrl": "/sales/client-management" + "expectedUrl": "/sales/client-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "clientName": "E2E_TEST_판매처_{timestamp}", + "businessNumber": "987-65-43210", + "representative": "테스트 대표" + } + }, "steps": [ { "id": 1, @@ -34,49 +43,217 @@ "action": "verify_not_mockup", "checks": [ "거래처 목록 표시", - "거래처 등록 버튼 존재" + "거래처 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "거래처 테이블 확인", + "name": "거래처 테이블 구조 확인", "action": "verify_table", "checks": [ "거래처명 컬럼", "사업자번호 컬럼", + "대표자 컬럼", "연락처 컬럼" ], "expected": "거래처 테이블 표시" }, { "id": 4, - "name": "검색 기능 테스트", - "action": "fill", - "target": "input[placeholder*='검색']", - "value": "가우스", - "expected": "검색어 입력됨" + "phase": "CREATE", + "name": "[CREATE] 거래처 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } }, { "id": 5, - "name": "검색 초기화", - "action": "clear", - "target": "input[placeholder*='검색']", - "expected": "검색어 삭제" + "phase": "CREATE", + "name": "[CREATE] 거래처명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='거래처명']", + "value": "E2E_TEST_판매처_{timestamp}", + "clear": true + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 사업자번호 입력", + "action": "fill", + "target": "input[name*='business'], input[placeholder*='사업자']", + "value": "987-65-43210", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 대표자명 입력", + "action": "fill", + "target": "input[name*='representative'], input[placeholder*='대표']", + "value": "테스트 대표", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 거래처 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/sales/clients", + "toast": "등록|저장|완료|성공" + }, + "expected": "거래처 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 거래처 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_판매처", + "submit": true + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 거래처 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_판매처 목록에 표시" + ], + "expected": "등록된 거래처 확인" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 거래처 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST')", + "expected": { + "detail_view": true + } + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 대표자명 수정", + "action": "fill", + "target": "input[name*='representative'], input[placeholder*='대표']", + "value": "수정된 대표", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/sales/clients", + "toast": "수정|저장|완료|성공" + }, + "expected": "거래처 수정 완료" + }, + { + "id": 15, + "phase": "DELETE", + "name": "[DELETE] 거래처 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/sales/clients", + "toast": "삭제|제거|완료|성공" + }, + "expected": "거래처 삭제 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_판매처 목록에서 제거" + ], + "expected": "거래처 삭제 반영" + }, + { + "id": 18, + "name": "엑셀 다운로드 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/sales/clients", + "description": "거래처 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/sales/clients", + "description": "거래처 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/sales/clients/:id", + "description": "거래처 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/sales/clients/:id", + "description": "거래처 삭제" } ], "requiredVerifications": [ { - "id": 3, - "name": "검색/필터", - "steps": [4, 5], - "criteria": "검색 기능 확인" + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "거래처 목록, 등록 버튼 확인" + "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_판매처_* 패턴 데이터 삭제" + } } diff --git a/sales-pricing.json b/sales-pricing.json index ede9bc5..99262ba 100644 --- a/sales-pricing.json +++ b/sales-pricing.json @@ -5,17 +5,25 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "판매관리 > 단가관리 메뉴의 단가 조회/관리 기능 테스트", + "description": "판매관리 > 단가관리 메뉴의 판매 단가 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "판매관리", "level2": "단가관리", - "expectedUrl": "/sales/pricing-management" + "expectedUrl": "/sales/pricing-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "price": "50000", + "unit": "EA" + } + }, "steps": [ { "id": 1, @@ -34,16 +42,18 @@ "action": "verify_not_mockup", "checks": [ "단가 목록 표시", - "단가 등록 가능" + "단가 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "단가 테이블 확인", + "name": "단가 테이블 구조 확인", "action": "verify_table", "checks": [ "품목 컬럼", + "거래처 컬럼", "단가 컬럼", "적용일 컬럼" ], @@ -51,32 +61,194 @@ }, { "id": 4, - "name": "검색 기능 테스트", - "action": "fill", - "target": "input[placeholder*='검색']", - "value": "테스트", - "expected": "검색어 입력됨" + "phase": "CREATE", + "name": "[CREATE] 단가 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } }, { "id": 5, - "name": "검색 초기화", - "action": "clear", - "target": "input[placeholder*='검색']", - "expected": "검색어 삭제" + "phase": "CREATE", + "name": "[CREATE] 품목 선택", + "action": "click", + "target": "select[name*='item'], button:has-text('품목'), input[placeholder*='품목']", + "expected": "품목 선택 가능" + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 거래처 선택", + "action": "click", + "target": "select[name*='client'], button:has-text('거래처'), input[placeholder*='거래처']", + "expected": "거래처 선택 가능" + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 단가 입력", + "action": "fill", + "target": "input[name*='price'], input[placeholder*='단가']", + "value": "50000", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 단가 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/sales/pricing", + "toast": "등록|저장|완료|성공" + }, + "expected": "단가 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 단가 확인", + "action": "verify_detail", + "checks": [ + "등록한 단가 목록에 표시" + ], + "expected": "등록된 단가 확인" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 단가 상세 조회", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 11, + "name": "단가 상세 정보 확인", + "action": "verify_detail", + "checks": [ + "품목 정보", + "거래처 정보", + "단가", + "적용기간" + ], + "expected": "단가 상세 정보 표시" + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 단가 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 단가 수정", + "action": "fill", + "target": "input[name*='price'], input[placeholder*='단가']", + "value": "55000", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 단가 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/sales/pricing", + "toast": "수정|저장|완료|성공" + }, + "expected": "단가 수정 완료" + }, + { + "id": 15, + "name": "단가 이력 조회", + "action": "verify_elements", + "checks": [ + "단가 변동 이력 조회 가능" + ], + "expected": "단가 이력 기능 확인" + }, + { + "id": 16, + "name": "엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "verify": { + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 17, + "name": "거래처별 단가 비교", + "action": "verify_elements", + "checks": [ + "거래처별 단가 비교 기능" + ], + "expected": "단가 비교 기능 확인" + }, + { + "id": 18, + "name": "일괄 등록 기능", + "action": "verify_elements", + "checks": [ + "엑셀 일괄 등록 버튼 존재 여부" + ], + "expected": "일괄 등록 기능 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/sales/pricing", + "description": "단가 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/sales/pricing", + "description": "단가 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/sales/pricing/:id", + "description": "단가 수정" + }, + { + "method": "GET", + "endpoint": "/api/v1/sales/pricing/history", + "description": "단가 이력 조회" } ], "requiredVerifications": [ { - "id": 3, - "name": "검색/필터", - "steps": [4, 5], - "criteria": "검색 기능 확인" + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "단가 목록 확인" + "criteria": "단가 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "note": "단가 삭제는 일반적으로 비활성화 처리" + } } diff --git a/sales-site.json b/sales-site.json index b39871f..fcd6344 100644 --- a/sales-site.json +++ b/sales-site.json @@ -5,17 +5,26 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "판매관리 > 현장관리 메뉴의 현장 관리 기능 테스트", + "description": "판매관리 > 현장관리 메뉴의 현장 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "판매관리", "level2": "현장관리", - "expectedUrl": "/sales/site-management" + "expectedUrl": "/sales/site-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "siteName": "E2E_TEST_현장_{timestamp}", + "address": "테스트 주소", + "manager": "테스트 담당자" + } + }, "steps": [ { "id": 1, @@ -34,27 +43,217 @@ "action": "verify_not_mockup", "checks": [ "현장 목록 표시", - "현장 등록 버튼 존재" + "현장 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "현장 목록 확인", + "name": "현장 테이블 구조 확인", "action": "verify_table", "checks": [ "현장명 컬럼", - "주소 컬럼" + "주소 컬럼", + "담당자 컬럼", + "상태 컬럼" ], - "expected": "현장 목록 표시" + "expected": "현장 테이블 표시" + }, + { + "id": 4, + "phase": "CREATE", + "name": "[CREATE] 현장 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 현장명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='현장명']", + "value": "E2E_TEST_현장_{timestamp}", + "clear": true + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 주소 입력", + "action": "fill", + "target": "input[name*='address'], input[placeholder*='주소']", + "value": "테스트 주소", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 담당자 입력", + "action": "fill", + "target": "input[name*='manager'], input[placeholder*='담당']", + "value": "테스트 담당자", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 현장 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/sales/sites", + "toast": "등록|저장|완료|성공" + }, + "expected": "현장 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 현장 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_현장", + "submit": true + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 현장 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_현장 목록에 표시" + ], + "expected": "등록된 현장 확인" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 현장 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST')", + "expected": { + "detail_view": true + } + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 현장 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 담당자 수정", + "action": "fill", + "target": "input[name*='manager'], input[placeholder*='담당']", + "value": "수정된 담당자", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 현장 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/sales/sites", + "toast": "수정|저장|완료|성공" + }, + "expected": "현장 수정 완료" + }, + { + "id": 15, + "phase": "DELETE", + "name": "[DELETE] 현장 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/sales/sites", + "toast": "삭제|제거|완료|성공" + }, + "expected": "현장 삭제 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_현장 목록에서 제거" + ], + "expected": "현장 삭제 반영" + }, + { + "id": 18, + "name": "엑셀 다운로드 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/sales/sites", + "description": "현장 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/sales/sites", + "description": "현장 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/sales/sites/:id", + "description": "현장 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/sales/sites/:id", + "description": "현장 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "현장 관리 기능 확인" + "criteria": "현장 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_현장_* 패턴 데이터 삭제" + } } diff --git a/vehicle-management.json b/vehicle-management.json index 33e0187..fbb9cb7 100644 --- a/vehicle-management.json +++ b/vehicle-management.json @@ -5,17 +5,26 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "차량관리 > 차량관리 메뉴의 차량 조회/관리 기능 테스트", + "description": "차량관리 > 차량관리 메뉴의 차량 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "차량관리", "level2": "차량관리", - "expectedUrl": "/vehicle/management" + "expectedUrl": "/vehicle/management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "vehicleNumber": "E2E_12가3456", + "vehicleType": "승용차", + "manager": "테스트 담당자" + } + }, "steps": [ { "id": 1, @@ -34,28 +43,217 @@ "action": "verify_not_mockup", "checks": [ "차량 목록 표시", - "차량 등록 버튼 존재" + "차량 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "차량 테이블 확인", + "name": "차량 테이블 구조 확인", "action": "verify_table", "checks": [ "차량번호 컬럼", "차종 컬럼", - "담당자 컬럼" + "담당자 컬럼", + "상태 컬럼" ], "expected": "차량 테이블 표시" + }, + { + "id": 4, + "phase": "CREATE", + "name": "[CREATE] 차량 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 차량번호 입력", + "action": "fill", + "target": "input[name*='number'], input[placeholder*='차량번호']", + "value": "E2E_12가3456", + "clear": true + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 차종 선택/입력", + "action": "fill", + "target": "input[name*='type'], select[name*='type']", + "value": "승용차", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 담당자 입력", + "action": "fill", + "target": "input[name*='manager'], input[placeholder*='담당']", + "value": "테스트 담당자", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 차량 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/vehicles", + "toast": "등록|저장|완료|성공" + }, + "expected": "차량 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 차량 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_12가", + "submit": true + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 차량 확인", + "action": "verify_detail", + "checks": [ + "E2E_12가3456 목록에 표시" + ], + "expected": "등록된 차량 확인" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 차량 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_12가')", + "expected": { + "detail_view": true + } + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 차량 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 담당자 수정", + "action": "fill", + "target": "input[name*='manager'], input[placeholder*='담당']", + "value": "수정된 담당자", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 차량 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/vehicles", + "toast": "수정|저장|완료|성공" + }, + "expected": "차량 수정 완료" + }, + { + "id": 15, + "phase": "DELETE", + "name": "[DELETE] 차량 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/vehicles", + "toast": "삭제|제거|완료|성공" + }, + "expected": "차량 삭제 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_12가3456 목록에서 제거" + ], + "expected": "차량 삭제 반영" + }, + { + "id": 18, + "name": "엑셀 다운로드 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/vehicles", + "description": "차량 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/vehicles", + "description": "차량 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/vehicles/:id", + "description": "차량 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/vehicles/:id", + "description": "차량 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "차량 목록 확인" + "criteria": "차량 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_12가* 패턴 데이터 삭제" + } }