diff --git a/accounting-bad-debt.json b/accounting-bad-debt.json index 70420ad..6aca327 100644 --- a/accounting-bad-debt.json +++ b/accounting-bad-debt.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": "/accounting/bad-debt-collection" + "expectedUrl": "/accounting/bad-debt-collection", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "vendorName": "E2E_TEST_채권거래처_{timestamp}", + "debtAmount": "1000000", + "status": "추심중" + } + }, "steps": [ { "id": 1, @@ -33,27 +42,225 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "악성채권 목록 표시" + "악성채권 목록 표시", + "채권 등록 버튼 존재", + "상태 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "악성채권 목록 확인", + "name": "악성채권 테이블 구조 확인", "action": "verify_table", "checks": [ "거래처 컬럼", - "채권금액 컬럼" + "채권금액 컬럼", + "발생일 컬럼", + "상태 컬럼", + "담당자 컬럼" ], - "expected": "악성채권 목록 표시" + "expected": "악성채권 테이블 표시" + }, + { + "id": 4, + "name": "통계 카드 확인", + "action": "verify_elements", + "checks": [ + "총 채권금액 표시", + "추심중 건수", + "회수완료 건수" + ], + "expected": "통계 정보 표시" + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 채권 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 거래처 선택", + "action": "click", + "target": "select[name*='vendor'], input[placeholder*='거래처']", + "expected": "거래처 선택 가능" + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 채권금액 입력", + "action": "fill", + "target": "input[name*='amount'], input[placeholder*='금액']", + "value": "1000000", + "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/accounting/bad-debts", + "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, + "name": "상세 정보 확인", + "action": "verify_elements", + "checks": [ + "거래처 정보 표시", + "채권금액 표시", + "추심 이력 표시" + ], + "expected": "상세 정보 표시" + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 상태 변경", + "action": "click", + "target": "button:has-text('상태변경'), select[name*='status']", + "expected": "상태 변경 가능" + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 추심 메모 추가", + "action": "fill", + "target": "textarea[name*='memo'], textarea[placeholder*='메모']", + "value": "E2E 테스트 추심 메모", + "clear": true + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 변경 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/accounting/bad-debts", + "toast": "수정|저장|완료|성공" + }, + "expected": "채권 정보 수정 완료" + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 채권 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/accounting/bad-debts", + "toast": "삭제|제거|완료|성공" + }, + "expected": "채권 삭제 완료" + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_채권거래처 목록에서 제거" + ], + "expected": "채권 삭제 반영" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/accounting/bad-debts", + "description": "악성채권 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/accounting/bad-debts", + "description": "악성채권 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/bad-debts/:id", + "description": "악성채권 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/accounting/bad-debts/:id", + "description": "악성채권 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/accounting/bad-debts/:id", + "description": "악성채권 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8, 15], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "악성채권 관리 기능 확인" + "criteria": "악성채권 목록, 등록 버튼, 상태 필터 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_채권거래처* 패턴 데이터 삭제" + } } diff --git a/accounting-bank-transaction.json b/accounting-bank-transaction.json index 1e5d53e..6af59ee 100644 --- a/accounting-bank-transaction.json +++ b/accounting-bank-transaction.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": "/accounting/bank-transactions" + "expectedUrl": "/accounting/bank-transactions", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,28 +35,161 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "거래내역 목록 표시" + "거래내역 목록 표시", + "계좌 선택 가능", + "기간 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "거래내역 확인", + "name": "거래내역 테이블 구조 확인", "action": "verify_table", "checks": [ "거래일 컬럼", - "입금/출금 컬럼", - "잔액 컬럼" + "입금 컬럼", + "출금 컬럼", + "잔액 컬럼", + "적요 컬럼" ], - "expected": "거래내역 표시" + "expected": "거래내역 테이블 표시" + }, + { + "id": 4, + "name": "계좌 선택 드롭다운 확인", + "action": "verify_elements", + "checks": [ + "계좌 선택 가능" + ], + "expected": "계좌 선택 가능" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "click", + "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", + "expected": "날짜 선택 열림" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", + "expected": "필터 적용됨" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "필터된 데이터 표시 또는 결과 없음" + ], + "expected": "필터 동작 확인" + }, + { + "id": 8, + "phase": "READ", + "name": "[READ] 거래 상세 보기", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 9, + "name": "상세 정보 확인", + "action": "verify_detail", + "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_elements", + "checks": [ + "출금 합계 표시" + ], + "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/accounting/bank-transactions", + "description": "입출금 내역 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/bank-accounts", + "description": "계좌 목록 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [5, 6, 7], + "criteria": "기간 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "입출금 조회 기능 확인" + "criteria": "거래내역 목록, 계좌 선택, 기간 필터 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-card-history.json b/accounting-card-history.json index 4d96f21..274cc92 100644 --- a/accounting-card-history.json +++ b/accounting-card-history.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": "/accounting/card-transactions" + "expectedUrl": "/accounting/card-transactions", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,28 +35,162 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "카드 사용내역 목록 표시" + "카드 사용내역 목록 표시", + "카드 선택 가능", + "기간 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "카드내역 확인", + "name": "카드내역 테이블 구조 확인", "action": "verify_table", "checks": [ "사용일 컬럼", + "카드명 컬럼", "가맹점 컬럼", - "금액 컬럼" + "금액 컬럼", + "승인번호 컬럼" ], - "expected": "카드내역 표시" + "expected": "카드내역 테이블 표시" + }, + { + "id": 4, + "name": "카드 선택 드롭다운 확인", + "action": "verify_elements", + "checks": [ + "카드 선택 가능" + ], + "expected": "카드 선택 가능" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "click", + "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", + "expected": "날짜 선택 열림" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", + "expected": "필터 적용됨" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "필터된 데이터 표시 또는 결과 없음" + ], + "expected": "필터 동작 확인" + }, + { + "id": 8, + "phase": "READ", + "name": "[READ] 카드 사용내역 상세 보기", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 9, + "name": "상세 정보 확인", + "action": "verify_detail", + "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_elements", + "checks": [ + "카드별 사용 현황 또는 통계" + ], + "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/accounting/card-transactions", + "description": "카드 사용내역 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/cards", + "description": "카드 목록 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [5, 6, 7], + "criteria": "기간 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "카드내역 조회 기능 확인" + "criteria": "카드내역 목록, 카드 선택, 기간 필터 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-client.json b/accounting-client.json index 545792d..a59a1a0 100644 --- a/accounting-client.json +++ b/accounting-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": "/accounting/vendors" + "expectedUrl": "/accounting/vendors", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "vendorName": "E2E_TEST_회계거래처_{timestamp}", + "vendorType": "매출", + "creditGrade": "A" + } + }, "steps": [ { "id": 1, @@ -34,7 +43,8 @@ "action": "verify_not_mockup", "checks": [ "거래처 목록 표시", - "거래처 등록 버튼 존재" + "거래처 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, @@ -51,66 +61,209 @@ }, { "id": 4, - "name": "거래처 테이블 확인", + "name": "거래처 테이블 구조 확인", "action": "verify_table", "checks": [ "구분 컬럼", "거래처명 컬럼", "신용등급 컬럼", - "거래등급 컬럼" + "거래등급 컬럼", + "사업자등록번호 컬럼" ], "expected": "거래처 테이블 표시" }, { "id": 5, - "name": "검색 기능 테스트", - "action": "fill", - "target": "input[placeholder*='검색']", - "value": "가우스", - "expected": "검색어 입력됨" - }, - { - "id": 6, - "name": "검색 초기화", - "action": "clear", - "target": "input[placeholder*='검색']", - "expected": "검색어 삭제" - }, - { - "id": 7, - "name": "테이블 행 클릭 - 상세 페이지", + "phase": "CREATE", + "name": "[CREATE] 거래처 등록 버튼 클릭", "action": "click", - "target": "table tbody tr:first-child", - "expected": "상세 페이지로 이동" - }, - { - "id": 8, - "name": "상세 페이지 확인", - "action": "verify_url", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", "expected": { - "url_contains": "/accounting/vendors/" + "modal_open": true } }, { - "id": 9, - "name": "목록으로 돌아가기", + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 거래처명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='거래처명']", + "value": "E2E_TEST_회계거래처_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 거래처 구분 선택", "action": "click", - "target": "목록", - "expected": "목록 페이지로 복귀" + "target": "select[name*='type'], button:has-text('매출')", + "expected": "거래처 구분 선택" + }, + { + "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/accounting/vendors", + "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, + "url_change": true + } + }, + { + "id": 12, + "name": "상세 페이지 정보 확인", + "action": "verify_elements", + "checks": [ + "거래처명 표시", + "사업자등록번호 표시", + "연락처 정보" + ], + "expected": "상세 정보 표시" + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 정보 수정", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='거래처명']", + "value": "E2E_TEST_회계거래처_수정", + "clear": true + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/accounting/vendors", + "toast": "수정|저장|완료|성공" + }, + "expected": "거래처 수정 완료" + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 거래처 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/accounting/vendors", + "toast": "삭제|제거|완료|성공" + }, + "expected": "거래처 삭제 완료" + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_회계거래처 목록에서 제거" + ], + "expected": "거래처 삭제 반영" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/accounting/vendors", + "description": "거래처 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/accounting/vendors", + "description": "거래처 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/vendors/:id", + "description": "거래처 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/accounting/vendors/:id", + "description": "거래처 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/accounting/vendors/:id", + "description": "거래처 삭제" } ], "requiredVerifications": [ { - "id": 3, - "name": "검색/필터", - "steps": [5, 6], - "criteria": "검색 기능 확인" + "id": 2, + "name": "저장 버튼", + "steps": [8, 15], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "거래처 목록, 통계 카드 확인" + "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_회계거래처* 패턴 데이터 삭제" + } } diff --git a/accounting-expense-forecast.json b/accounting-expense-forecast.json index a3920b8..0b4a927 100644 --- a/accounting-expense-forecast.json +++ b/accounting-expense-forecast.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": "/accounting/expected-expenses" + "expectedUrl": "/accounting/expected-expenses", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,26 +35,159 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "지출 예상 내역 표시" + "지출 예상 내역 표시", + "기간 선택 가능", + "합계 금액 표시" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "지출예상 확인", + "name": "지출예상 테이블 구조 확인", + "action": "verify_table", + "checks": [ + "지출 항목 컬럼", + "예상일 컬럼", + "금액 컬럼", + "비고 컬럼" + ], + "expected": "지출예상 테이블 표시" + }, + { + "id": 4, + "name": "기간 선택 확인", "action": "verify_elements", "checks": [ - "지출 예상 테이블" + "기간 선택 가능 (월/주/일)" ], - "expected": "지출예상 기능 표시" + "expected": "기간 선택 가능" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 월 선택", + "action": "click", + "target": "input[type='month'], select[name*='month'], [class*='month-picker']", + "expected": "월 선택 열림" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 조회 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", + "expected": "필터 적용됨" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "선택한 기간의 지출 예상 표시" + ], + "expected": "필터 동작 확인" + }, + { + "id": 8, + "name": "지출 카테고리별 확인", + "action": "verify_elements", + "checks": [ + "카테고리별 지출 예상 표시" + ], + "expected": "카테고리별 지출 표시" + }, + { + "id": 9, + "name": "합계 금액 확인", + "action": "verify_detail", + "checks": [ + "총 지출 예상 금액 표시" + ], + "expected": "합계 금액 표시" + }, + { + "id": 10, + "name": "일별 지출 예상 확인", + "action": "verify_elements", + "checks": [ + "일별 지출 예상 캘린더 또는 리스트" + ], + "expected": "일별 지출 표시" + }, + { + "id": 11, + "name": "주요 지출 항목 확인", + "action": "verify_elements", + "checks": [ + "주요 지출 항목 하이라이트" + ], + "expected": "주요 항목 표시" + }, + { + "id": 12, + "name": "인쇄 버튼 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + }, + { + "id": 13, + "name": "엑셀 다운로드 버튼 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + }, + { + "id": 14, + "name": "PDF 내보내기 확인", + "action": "verify_elements", + "checks": [ + "PDF 내보내기 버튼 존재" + ], + "expected": "PDF 내보내기 기능 표시" + }, + { + "id": 15, + "name": "이전/다음 기간 네비게이션", + "action": "verify_elements", + "checks": [ + "이전/다음 기간 이동 가능" + ], + "expected": "기간 네비게이션 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/accounting/expected-expenses", + "description": "지출예상 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/expected-expenses/summary", + "description": "지출예상 요약 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [5, 6, 7], + "criteria": "기간 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "지출예상 조회 기능 확인" + "criteria": "지출예상 목록, 기간 선택, 합계 표시 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-purchase.json b/accounting-purchase.json index a0da203..bfa7dd6 100644 --- a/accounting-purchase.json +++ b/accounting-purchase.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": "/accounting/purchase-accounting" + "expectedUrl": "/accounting/purchase-accounting", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,27 +35,162 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "매입 목록 표시" + "매입 목록 표시", + "기간 필터 존재", + "합계 금액 표시" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "매입 목록 확인", + "name": "매입 테이블 구조 확인", "action": "verify_table", "checks": [ "거래일 컬럼", - "금액 컬럼" + "거래처 컬럼", + "품목 컬럼", + "금액 컬럼", + "부가세 컬럼" ], - "expected": "매입 목록 표시" + "expected": "매입 테이블 표시" + }, + { + "id": 4, + "name": "매입 통계 카드 확인", + "action": "verify_elements", + "checks": [ + "총 매입액 표시", + "당월 매입 표시", + "전월 대비 표시" + ], + "expected": "통계 카드 표시" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "click", + "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", + "expected": "날짜 선택 열림" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", + "expected": "필터 적용됨" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "필터된 매입 데이터 표시 또는 결과 없음" + ], + "expected": "필터 동작 확인" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 거래처별 필터", + "action": "click", + "target": "select[name*='vendor'], button:has-text('거래처')", + "expected": "거래처 필터 가능" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 매입 상세 보기", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 10, + "name": "상세 정보 확인", + "action": "verify_detail", + "checks": [ + "거래 상세 정보 표시", + "품목 정보 표시", + "금액 상세 표시" + ], + "expected": "매입 상세 정보 표시" + }, + { + "id": 11, + "name": "목록으로 돌아가기", + "action": "click", + "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", + "expected": "목록 페이지로 복귀" + }, + { + "id": 12, + "name": "매입 합계 확인", + "action": "verify_elements", + "checks": [ + "매입 합계 금액 표시" + ], + "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/accounting/purchases", + "description": "매입 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/purchases/summary", + "description": "매입 요약 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [5, 6, 7, 8], + "criteria": "기간 필터 + 거래처 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "매입 관리 기능 확인" + "criteria": "매입 목록, 기간 필터, 합계 표시 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-sales.json b/accounting-sales.json index 1be99d2..f7906cc 100644 --- a/accounting-sales.json +++ b/accounting-sales.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": "/accounting/sales-accounting" + "expectedUrl": "/accounting/sales-accounting", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,27 +35,162 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "매출 목록 표시" + "매출 목록 표시", + "기간 필터 존재", + "합계 금액 표시" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "매출 목록 확인", + "name": "매출 테이블 구조 확인", "action": "verify_table", "checks": [ "거래일 컬럼", - "금액 컬럼" + "거래처 컬럼", + "품목 컬럼", + "금액 컬럼", + "부가세 컬럼" ], - "expected": "매출 목록 표시" + "expected": "매출 테이블 표시" + }, + { + "id": 4, + "name": "매출 통계 카드 확인", + "action": "verify_elements", + "checks": [ + "총 매출액 표시", + "당월 매출 표시", + "전월 대비 표시" + ], + "expected": "통계 카드 표시" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "click", + "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", + "expected": "날짜 선택 열림" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", + "expected": "필터 적용됨" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "필터된 매출 데이터 표시 또는 결과 없음" + ], + "expected": "필터 동작 확인" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 거래처별 필터", + "action": "click", + "target": "select[name*='vendor'], button:has-text('거래처')", + "expected": "거래처 필터 가능" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 매출 상세 보기", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 10, + "name": "상세 정보 확인", + "action": "verify_detail", + "checks": [ + "거래 상세 정보 표시", + "품목 정보 표시", + "금액 상세 표시" + ], + "expected": "매출 상세 정보 표시" + }, + { + "id": 11, + "name": "목록으로 돌아가기", + "action": "click", + "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", + "expected": "목록 페이지로 복귀" + }, + { + "id": 12, + "name": "매출 합계 확인", + "action": "verify_elements", + "checks": [ + "매출 합계 금액 표시" + ], + "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/accounting/sales", + "description": "매출 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/sales/summary", + "description": "매출 요약 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [5, 6, 7, 8], + "criteria": "기간 필터 + 거래처 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "매출 관리 기능 확인" + "criteria": "매출 목록, 기간 필터, 합계 표시 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/board-management.json b/board-management.json index 8ec351a..2d1a945 100644 --- a/board-management.json +++ b/board-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": "/board/board-management" + "expectedUrl": "/board/board-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "boardName": "E2E_TEST_게시판_{timestamp}", + "boardType": "일반", + "useComment": true + } + }, "steps": [ { "id": 1, @@ -24,7 +33,7 @@ "level1": "게시판", "level2": "게시판 관리", "expected": { - "url_contains": "/boards", + "url_contains": "/board", "visible": ["게시판 관리"] } }, @@ -34,27 +43,222 @@ "action": "verify_not_mockup", "checks": [ "게시판 목록 표시", + "게시판 추가 버튼 존재", "게시판 설정 가능" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "게시판 목록 확인", + "name": "게시판 목록 테이블 확인", + "action": "verify_table", + "checks": [ + "게시판명 컬럼", + "게시판 유형 컬럼", + "사용여부 컬럼", + "관리 컬럼" + ], + "expected": "게시판 목록 표시" + }, + { + "id": 4, + "name": "기존 게시판 확인", "action": "verify_elements", "checks": [ - "게시판 목록 테이블", - "게시판 추가 버튼" + "자유게시판 존재", + "공지사항 존재" ], - "expected": "게시판 관리 기능 표시" + "expected": "기본 게시판 표시" + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 게시판 추가 버튼 클릭", + "action": "click", + "target": "button:has-text('추가'), button:has-text('등록'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 게시판명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='게시판명']", + "value": "E2E_TEST_게시판_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 게시판 유형 선택", + "action": "click", + "target": "select[name*='type'], button:has-text('일반')", + "expected": "유형 선택" + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 댓글 사용 설정", + "action": "click", + "target": "input[name*='comment'], [class*='switch']", + "expected": "댓글 설정" + }, + { + "id": 9, + "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/boards", + "toast": "등록|저장|완료|성공" + }, + "expected": "게시판 등록 완료" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 게시판 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_게시판", + "submit": true + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 등록된 게시판 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_게시판 목록에 표시" + ], + "expected": "등록된 게시판 확인" + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 게시판 설정 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST_게시판') button:has-text('설정'), table tbody tr:has-text('E2E_TEST_게시판') [class*='setting']", + "expected": { + "detail_view": true + } + }, + { + "id": 13, + "name": "설정 정보 확인", + "action": "verify_elements", + "checks": [ + "게시판명 표시", + "권한 설정 표시", + "기능 설정 표시" + ], + "expected": "설정 정보 표시" + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 게시판 설정 변경", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='게시판명']", + "value": "E2E_TEST_게시판_수정", + "clear": true + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 변경 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/boards", + "toast": "수정|저장|완료|성공" + }, + "expected": "게시판 수정 완료" + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 게시판 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/boards", + "toast": "삭제|제거|완료|성공" + }, + "expected": "게시판 삭제 완료" + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_게시판 목록에서 제거" + ], + "expected": "게시판 삭제 반영" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/boards", + "description": "게시판 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/boards", + "description": "게시판 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/boards/:id", + "description": "게시판 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/boards/:id", + "description": "게시판 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/boards/:id", + "description": "게시판 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [9, 15], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "게시판 관리 기능 확인" + "criteria": "게시판 목록, 추가 버튼, 설정 가능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_게시판* 패턴 데이터 삭제" + } } diff --git a/hr-attendance-status.json b/hr-attendance-status.json index 84b2adf..f73a8fe 100644 --- a/hr-attendance-status.json +++ b/hr-attendance-status.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": "/hr/attendance" + "expectedUrl": "/hr/attendance", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -34,39 +36,176 @@ "action": "verify_not_mockup", "checks": [ "출퇴근 현황 표시", - "날짜 선택 가능" + "날짜 선택 가능", + "출근/퇴근 버튼 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "출퇴근 버튼 확인", - "action": "verify_elements", - "checks": [ - "출근 버튼 존재", - "퇴근 버튼 존재" - ], - "expected": "출퇴근 버튼 표시" - }, - { - "id": 4, - "name": "근태 현황 테이블 확인", + "name": "근태 현황 테이블 구조 확인", "action": "verify_table", "checks": [ "날짜 컬럼", "출근시간 컬럼", "퇴근시간 컬럼", - "근무시간 컬럼" + "근무시간 컬럼", + "상태 컬럼" ], "expected": "근태 현황 테이블 표시" + }, + { + "id": 4, + "name": "오늘 근태 상태 확인", + "action": "verify_elements", + "checks": [ + "오늘 날짜 표시", + "현재 근무 상태 표시" + ], + "expected": "오늘 근태 상태 표시" + }, + { + "id": 5, + "name": "출근 버튼 확인", + "action": "verify_elements", + "checks": [ + "출근 버튼 존재" + ], + "expected": "출근 버튼 표시" + }, + { + "id": 6, + "name": "퇴근 버튼 확인", + "action": "verify_elements", + "checks": [ + "퇴근 버튼 존재" + ], + "expected": "퇴근 버튼 표시" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 월 선택", + "action": "click", + "target": "input[type='month'], select[name*='month'], [class*='month-picker']", + "expected": "월 선택 열림" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 조회 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", + "expected": "필터 적용됨" + }, + { + "id": 9, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "선택한 월의 근태 데이터 표시" + ], + "expected": "필터 동작 확인" + }, + { + "id": 10, + "name": "근무 시간 통계 확인", + "action": "verify_elements", + "checks": [ + "총 근무시간 표시", + "정상 출근 일수 표시" + ], + "expected": "근무 통계 표시" + }, + { + "id": 11, + "name": "지각/조퇴/결근 통계 확인", + "action": "verify_elements", + "checks": [ + "지각 횟수 표시", + "조퇴 횟수 표시", + "결근 횟수 표시" + ], + "expected": "근태 이상 통계 표시" + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 특정 일자 상세 보기", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 13, + "name": "상세 근태 정보 확인", + "action": "verify_detail", + "checks": [ + "출근 시간 표시", + "퇴근 시간 표시", + "근무 시간 표시" + ], + "expected": "상세 근태 정보 표시" + }, + { + "id": 14, + "name": "엑셀 다운로드 버튼 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + }, + { + "id": 15, + "name": "인쇄 버튼 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/hr/attendance", + "description": "근태 현황 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/hr/attendance/check-in", + "description": "출근 체크" + }, + { + "method": "POST", + "endpoint": "/api/v1/hr/attendance/check-out", + "description": "퇴근 체크" + }, + { + "method": "GET", + "endpoint": "/api/v1/hr/attendance/summary", + "description": "근태 통계 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [7, 8, 9], + "criteria": "기간 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "출퇴근 현황, 동작 버튼 확인" + "criteria": "근태 현황, 날짜 선택, 출퇴근 버튼 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음 (출퇴근 체크는 별도 테스트)" + } } diff --git a/hr-card.json b/hr-card.json index d39beae..df78f14 100644 --- a/hr-card.json +++ b/hr-card.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": "/hr/card-management" + "expectedUrl": "/hr/card-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "cardName": "E2E_TEST_카드_{timestamp}", + "cardNumber": "1234-5678-9012-3456", + "cardType": "법인카드" + } + }, "steps": [ { "id": 1, @@ -34,37 +43,223 @@ "action": "verify_not_mockup", "checks": [ "카드 목록 표시", - "카드 등록 버튼 존재" + "카드 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "카드 목록 확인", + "name": "카드 테이블 구조 확인", "action": "verify_table", "checks": [ "카드명 컬럼", "카드번호 컬럼", - "사용자 컬럼" + "카드종류 컬럼", + "사용자 컬럼", + "상태 컬럼" ], - "expected": "카드 목록 표시" + "expected": "카드 테이블 표시" }, { "id": 4, - "name": "카드 등록 버튼 확인", + "name": "기존 카드 확인", "action": "verify_elements", "checks": [ - "카드 등록 버튼 존재" + "등록된 카드 존재 또는 등록된 카드 없음" ], - "expected": "등록 버튼 표시" + "expected": "카드 목록 상태 확인" + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 카드 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 카드명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='카드명']", + "value": "E2E_TEST_카드_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 카드번호 입력", + "action": "fill", + "target": "input[name*='number'], input[placeholder*='카드번호']", + "value": "1234-5678-9012-3456", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 카드종류 선택", + "action": "click", + "target": "select[name*='type'], button:has-text('법인카드')", + "expected": "카드종류 선택" + }, + { + "id": 9, + "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/hr/cards", + "toast": "등록|저장|완료|성공" + }, + "expected": "카드 등록 완료" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 카드 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_카드", + "submit": true + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 등록된 카드 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_카드 목록에 표시" + ], + "expected": "등록된 카드 확인" + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 카드 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST_카드')", + "expected": { + "detail_view": true + } + }, + { + "id": 13, + "name": "상세 정보 확인", + "action": "verify_elements", + "checks": [ + "카드명 표시", + "카드번호 표시", + "유효기간 표시" + ], + "expected": "상세 정보 표시" + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 카드 수정 모드", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 카드명 변경", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='카드명']", + "value": "E2E_TEST_카드_수정", + "clear": true + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 변경 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/hr/cards", + "toast": "수정|저장|완료|성공" + }, + "expected": "카드 수정 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 카드 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/hr/cards", + "toast": "삭제|제거|완료|성공" + }, + "expected": "카드 삭제 완료" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/hr/cards", + "description": "카드 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/hr/cards", + "description": "카드 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/hr/cards/:id", + "description": "카드 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/hr/cards/:id", + "description": "카드 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/hr/cards/:id", + "description": "카드 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [9, 16], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "카드 목록, 동작 버튼 확인" + "criteria": "카드 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_카드* 패턴 데이터 삭제" + } } diff --git a/hr-department.json b/hr-department.json index 33d9e90..63a98a7 100644 --- a/hr-department.json +++ b/hr-department.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": "/hr/department-management" + "expectedUrl": "/hr/department-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "departmentName": "E2E_TEST_부서_{timestamp}", + "parentDept": "없음", + "sortOrder": "999" + } + }, "steps": [ { "id": 1, @@ -34,52 +43,222 @@ "action": "verify_not_mockup", "checks": [ "부서 목록 또는 트리 표시", - "부서 추가 버튼 존재" + "부서 추가 버튼 존재", + "부서 편집 가능" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "부서 목록 확인", + "name": "부서 트리/목록 구조 확인", "action": "verify_elements", "checks": [ "부서 트리 또는 테이블 표시", - "부서명 표시" + "부서명 표시", + "소속 인원 표시" ], - "expected": "부서 목록 정상 표시" + "expected": "부서 구조 표시" }, { "id": 4, - "name": "부서 추가 버튼 클릭", - "action": "click", - "target": "부서 추가", - "expected": "부서 추가 모달 열림" + "name": "기존 부서 확인", + "action": "verify_elements", + "checks": [ + "최상위 부서 존재", + "하위 부서 존재" + ], + "expected": "기존 부서 표시" }, { "id": 5, - "name": "부서 추가 모달 확인", - "action": "verify_elements", - "checks": [ - "부서명 입력 필드", - "상위 부서 선택", - "저장/취소 버튼" - ], - "expected": "부서 추가 모달 표시" + "phase": "CREATE", + "name": "[CREATE] 부서 추가 버튼 클릭", + "action": "click", + "target": "button:has-text('추가'), button:has-text('등록'), button:has-text('부서 추가')", + "expected": { + "modal_open": true + } }, { "id": 6, - "name": "모달 닫기", + "phase": "CREATE", + "name": "[CREATE] 부서명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='부서명']", + "value": "E2E_TEST_부서_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 상위 부서 선택", "action": "click", - "target": "취소", - "expected": "모달 닫힘" + "target": "select[name*='parent'], input[placeholder*='상위']", + "expected": "상위 부서 선택 가능" + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 정렬순서 입력", + "action": "fill", + "target": "input[name*='order'], input[name*='sort']", + "value": "999", + "clear": true + }, + { + "id": 9, + "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/hr/departments", + "toast": "등록|저장|완료|성공" + }, + "expected": "부서 등록 완료" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 부서 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_부서", + "submit": true + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 등록된 부서 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_부서 목록에 표시" + ], + "expected": "등록된 부서 확인" + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 부서 상세/편집 클릭", + "action": "click", + "target": "[class*='tree'] [class*='item']:has-text('E2E_TEST_부서'), table tbody tr:has-text('E2E_TEST_부서')", + "expected": { + "detail_view": true + } + }, + { + "id": 13, + "name": "상세 정보 확인", + "action": "verify_elements", + "checks": [ + "부서명 표시", + "상위 부서 표시", + "소속 인원 표시" + ], + "expected": "상세 정보 표시" + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 부서 수정 모드", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 부서명 변경", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='부서명']", + "value": "E2E_TEST_부서_수정", + "clear": true + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 변경 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/hr/departments", + "toast": "수정|저장|완료|성공" + }, + "expected": "부서 수정 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 부서 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/hr/departments", + "toast": "삭제|제거|완료|성공" + }, + "expected": "부서 삭제 완료" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/hr/departments", + "description": "부서 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/hr/departments", + "description": "부서 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/hr/departments/:id", + "description": "부서 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/hr/departments/:id", + "description": "부서 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/hr/departments/:id", + "description": "부서 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [9, 16], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "부서 목록, 동작 버튼 확인" + "criteria": "부서 목록, 추가 버튼, 편집 가능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요 (하위 부서 없어야 삭제 가능)", + "cleanupRequired": "E2E_TEST_부서* 패턴 데이터 삭제" + } } diff --git a/shipment-dispatch.json b/shipment-dispatch.json index 34f4024..6fac712 100644 --- a/shipment-dispatch.json +++ b/shipment-dispatch.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": "/outbound/vehicle-dispatches" + "expectedUrl": "/outbound/vehicle-dispatches", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "vehicleNumber": "E2E_99가9999", + "dispatchDate": "{today}", + "driver": "E2E_TEST_기사" + } + }, "steps": [ { "id": 1, @@ -33,27 +42,224 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "배차 목록 표시" + "배차 목록 표시", + "배차 등록 버튼 존재", + "날짜 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "배차 목록 확인", + "name": "배차 테이블 구조 확인", "action": "verify_table", "checks": [ "차량번호 컬럼", - "배차일 컬럼" + "배차일 컬럼", + "기사명 컬럼", + "상태 컬럼", + "출고지/도착지 컬럼" ], - "expected": "배차 목록 표시" + "expected": "배차 테이블 표시" + }, + { + "id": 4, + "name": "배차 통계 확인", + "action": "verify_elements", + "checks": [ + "금일 배차 현황", + "출고 대기 건수", + "배차 완료 건수" + ], + "expected": "배차 통계 표시" + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 배차 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('배차')", + "expected": { + "modal_open": true + } + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 차량 선택", + "action": "click", + "target": "select[name*='vehicle'], input[placeholder*='차량']", + "expected": "차량 선택 가능" + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 배차일 입력", + "action": "click", + "target": "input[type='date'], input[name*='date']", + "expected": "배차일 선택" + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 기사 선택", + "action": "click", + "target": "select[name*='driver'], input[placeholder*='기사']", + "expected": "기사 선택 가능" + }, + { + "id": 9, + "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/outbound/dispatches", + "toast": "등록|저장|완료|성공" + }, + "expected": "배차 등록 완료" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 배차 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_99가", + "submit": true + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 등록된 배차 확인", + "action": "verify_detail", + "checks": [ + "E2E_99가 목록에 표시" + ], + "expected": "등록된 배차 확인" + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 배차 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_99가')", + "expected": { + "detail_view": true + } + }, + { + "id": 13, + "name": "상세 정보 확인", + "action": "verify_elements", + "checks": [ + "차량 정보 표시", + "기사 정보 표시", + "출고 품목 정보" + ], + "expected": "상세 정보 표시" + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 배차 수정", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 정보 변경", + "action": "fill", + "target": "textarea[name*='memo'], textarea[placeholder*='비고']", + "value": "E2E 테스트 배차 메모", + "clear": true + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 변경 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/outbound/dispatches", + "toast": "수정|저장|완료|성공" + }, + "expected": "배차 수정 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 배차 취소/삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('취소'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/outbound/dispatches", + "toast": "삭제|취소|완료|성공" + }, + "expected": "배차 삭제 완료" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/outbound/dispatches", + "description": "배차 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/outbound/dispatches", + "description": "배차 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/outbound/dispatches/:id", + "description": "배차 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/outbound/dispatches/:id", + "description": "배차 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/outbound/dispatches/:id", + "description": "배차 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [9, 16], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "배차 관리 기능 확인" + "criteria": "배차 목록, 등록 버튼, 날짜 필터 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_99가* 패턴 배차 데이터 삭제" + } }