From a004ad9a140a536e2a2c7ca78082e2c9225f7ae8 Mon Sep 17 00:00:00 2001 From: kimbokon Date: Sun, 8 Mar 2026 11:42:46 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EA=B1=B0=EB=9E=98=EC=B2=98=20=ED=8F=BC?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EB=9D=BC=EB=B2=A8=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(=EC=A2=85=EB=AA=A9=20=E2=86=92=20=EC=97=85=EC=A2=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - accounting-client.json: "종목" → "업종" (실제 UI 라벨과 일치) - sales-client.json: "종목" → "업종" (동일 수정) - fill_form 4/5 → 5/5 filled 개선 Co-Authored-By: Claude Opus 4.6 --- accounting-client.json | 676 ++++++++++++++++++++-------------------- sales-client.json | 688 ++++++++++++++++++++--------------------- 2 files changed, 682 insertions(+), 682 deletions(-) diff --git a/accounting-client.json b/accounting-client.json index 1b4b50d..36cd25c 100644 --- a/accounting-client.json +++ b/accounting-client.json @@ -1,338 +1,338 @@ -{ - "id": "accounting-client", - "name": "회계거래처관리 테스트", - "screenshotPolicy": { - "onErrorOnly": true, - "captureOn": [ - "error", - "fail", - "timeout", - "404", - "500", - "blocked" - ] - }, - "description": "회계관리 > 거래처관리 메뉴의 거래처 CRUD 기능 테스트", - "baseUrl": "https://dev.codebridge-x.com", - "menuNavigation": { - "level1": "회계관리", - "level2": "거래처관리", - "expectedUrl": "/accounting/vendors", - "searchWithinParent": true, - "closeOtherMenus": true - }, - "auth": { - "username": "TestUser5", - "password": "password123!" - }, - "testData": { - "create": { - "vendorName": "E2E_TEST_회계거래처_{timestamp}", - "vendorType": "매출", - "creditGrade": "A" - } - }, - "steps": [ - { - "id": 1, - "name": "메뉴 진입: 회계관리 > 거래처관리", - "action": "menu_navigate", - "level1": "회계관리", - "level2": "거래처관리", - "expected": { - "url_contains": "/accounting/vendors", - "visible": [ - "거래처관리", - "거래처" - ] - } - }, - { - "id": 2, - "name": "URL 검증", - "action": "verify_url", - "expected": { - "url_contains": "/accounting/vendors" - } - }, - { - "id": 3, - "name": "필수 검증 #5: 목업 페이지 감지", - "action": "verify_not_mockup", - "checks": [ - "거래처 목록 표시", - "거래처 등록 버튼 존재", - "검색 기능 존재" - ], - "expected": "정상 페이지 (목업 아님)" - }, - { - "id": 4, - "name": "통계 카드 확인", - "action": "verify_elements", - "checks": [ - "전체 거래처 카드", - "매출 거래처 카드", - "매입 거래처 카드" - ], - "expected": "통계 카드 표시" - }, - { - "id": 5, - "name": "거래처 테이블 구조 확인", - "action": "verify_table", - "checks": [ - "구분 컬럼", - "거래처명 컬럼", - "신용등급 컬럼", - "거래등급 컬럼", - "사업자등록번호 컬럼" - ], - "expected": "거래처 테이블 표시" - }, - { - "id": 6, - "name": "목록 필터 테스트", - "action": "evaluate", - "script": "(() => {\n const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"], button[class*=\"Select\"]');\n if (selects.length > 0) {\n return 'Filters found: ' + selects.length;\n }\n return 'No filter dropdowns (ok)';\n })()" - }, - { - "id": 7, - "phase": "CREATE", - "name": "[CREATE] 거래처 등록 버튼 클릭", - "action": "click_if_exists", - "target": "button:has-text('거래처 등록'), button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", - "expected": { - "url_contains": "mode=new" - } - }, - { - "id": 8, - "phase": "CREATE", - "name": "[CREATE] 거래처 정보 입력", - "action": "fill_form", - "fields": [ - { - "name": "사업자등록번호", - "value": "123-45-67890" - }, - { - "name": "거래처명", - "value": "E2E_TEST_회계거래처_{timestamp}" - }, - { - "name": "대표자명", - "value": "테스트 대표" - }, - { - "name": "업태", - "value": "제조업" - }, - { - "name": "종목", - "value": "철강" - } - ] - }, - { - "id": 9, - "phase": "CREATE", - "name": "[CREATE] 거래처 구분 선택", - "action": "click_if_exists", - "target": "#clientType-매출, label:has-text('매출') input[type='radio'], button:has-text('매출')", - "expected": "거래처 구분 선택" - }, - { - "id": 10, - "phase": "CREATE", - "name": "[CREATE] 필수 검증 #2: 거래처 저장", - "action": "click_if_exists", - "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "verify": { - "url_maintained": true, - "no_error_page": true, - "api_call": "POST /api/v1/accounting/vendors", - "toast": "등록|저장|완료|성공" - }, - "expected": "거래처 등록 완료" - }, - { - "id": 11, - "phase": "CREATE", - "name": "[CREATE] 저장 완료 토스트 확인", - "action": "verify_toast", - "verify": { - "contains": "등록|완료|성공|저장" - } - }, - { - "id": 12, - "phase": "READ", - "name": "[READ] 등록된 거래처 검색", - "action": "click_if_exists", - "target": "input[type='search'], input[placeholder*='검색']", - "value": "E2E_TEST_회계거래처", - "submit": true - }, - { - "id": 13, - "phase": "READ", - "name": "[READ] 등록된 거래처 목록 확인", - "action": "verify_detail", - "checks": [ - "E2E_TEST_회계거래처 목록에 표시" - ], - "expected": "등록된 거래처 확인" - }, - { - "id": 14, - "phase": "READ", - "name": "[READ] 거래처 상세 조회", - "action": "click_if_exists", - "target": "table tbody tr:first-child, table tbody tr:nth-child(1), table tr:nth-child(2)", - "expected": { - "detail_view": true, - "url_change": true - } - }, - { - "id": 15, - "name": "상세 페이지 정보 확인", - "action": "verify_elements", - "checks": [ - "거래처명 표시", - "사업자등록번호 표시", - "연락처 정보" - ], - "expected": "상세 정보 표시" - }, - { - "id": 16, - "phase": "UPDATE", - "name": "[UPDATE] 수정 모드 진입", - "action": "click_if_exists", - "target": "button:has-text('수정'), button:has-text('편집')", - "expected": { - "edit_mode": true - } - }, - { - "id": 17, - "phase": "UPDATE", - "name": "[UPDATE] 거래처 정보 수정", - "action": "click_if_exists", - "target": "input[name*='name'], input[placeholder*='거래처명']" - }, - { - "id": 18, - "phase": "UPDATE", - "name": "[UPDATE] 거래처 저장", - "action": "click_if_exists", - "target": "button:has-text('저장'), button:has-text('확인')", - "verify": { - "api_call": "PUT /api/v1/accounting/vendors", - "toast": "수정|저장|완료|성공" - }, - "expected": "거래처 수정 완료" - }, - { - "id": 19, - "phase": "UPDATE", - "name": "[UPDATE] 수정 완료 토스트 확인", - "action": "verify_toast", - "verify": { - "contains": "수정|완료|성공|저장" - } - }, - { - "id": 20, - "phase": "DELETE", - "name": "[DELETE] 거래처 삭제", - "action": "click_if_exists", - "target": "button:has-text('삭제'), button:has-text('제거')", - "expected": { - "confirm_dialog": true - } - }, - { - "id": 21, - "phase": "DELETE", - "name": "[DELETE] 삭제 확인", - "action": "click_if_exists", - "verify": { - "api_call": "DELETE /api/v1/accounting/vendors", - "toast": "삭제|제거|완료|성공" - }, - "expected": "거래처 삭제 완료", - "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('확인'), button:has-text('확인')" - }, - { - "id": 22, - "phase": "DELETE", - "name": "[DELETE] 삭제 확인", - "action": "verify_detail", - "checks": [ - "E2E_TEST_회계거래처 목록에서 제거" - ], - "expected": "거래처 삭제 반영" - }, - { - "id": 23, - "name": "콘솔 에러 확인", - "action": "verify_element", - "target": "body" - } - ], - "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": 2, - "name": "저장 버튼", - "steps": [ - 8, - 15 - ], - "criteria": "API 호출 + 성공 토스트 + 데이터 반영" - }, - { - "id": 5, - "name": "목업 페이지 감지", - "steps": [ - 2 - ], - "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" - } - ], - "rollbackPlan": { - "onCreateFail": "등록 모달 닫고 재시도", - "onUpdateFail": "페이지 새로고침 후 재시도", - "onDeleteFail": "수동 삭제 필요", - "cleanupRequired": "E2E_TEST_회계거래처* 패턴 데이터 삭제" - } -} +{ + "id": "accounting-client", + "name": "회계거래처관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": [ + "error", + "fail", + "timeout", + "404", + "500", + "blocked" + ] + }, + "description": "회계관리 > 거래처관리 메뉴의 거래처 CRUD 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "회계관리", + "level2": "거래처관리", + "expectedUrl": "/accounting/vendors", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { + "username": "TestUser5", + "password": "password123!" + }, + "testData": { + "create": { + "vendorName": "E2E_TEST_회계거래처_{timestamp}", + "vendorType": "매출", + "creditGrade": "A" + } + }, + "steps": [ + { + "id": 1, + "name": "메뉴 진입: 회계관리 > 거래처관리", + "action": "menu_navigate", + "level1": "회계관리", + "level2": "거래처관리", + "expected": { + "url_contains": "/accounting/vendors", + "visible": [ + "거래처관리", + "거래처" + ] + } + }, + { + "id": 2, + "name": "URL 검증", + "action": "verify_url", + "expected": { + "url_contains": "/accounting/vendors" + } + }, + { + "id": 3, + "name": "필수 검증 #5: 목업 페이지 감지", + "action": "verify_not_mockup", + "checks": [ + "거래처 목록 표시", + "거래처 등록 버튼 존재", + "검색 기능 존재" + ], + "expected": "정상 페이지 (목업 아님)" + }, + { + "id": 4, + "name": "통계 카드 확인", + "action": "verify_elements", + "checks": [ + "전체 거래처 카드", + "매출 거래처 카드", + "매입 거래처 카드" + ], + "expected": "통계 카드 표시" + }, + { + "id": 5, + "name": "거래처 테이블 구조 확인", + "action": "verify_table", + "checks": [ + "구분 컬럼", + "거래처명 컬럼", + "신용등급 컬럼", + "거래등급 컬럼", + "사업자등록번호 컬럼" + ], + "expected": "거래처 테이블 표시" + }, + { + "id": 6, + "name": "목록 필터 테스트", + "action": "evaluate", + "script": "(() => {\n const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"], button[class*=\"Select\"]');\n if (selects.length > 0) {\n return 'Filters found: ' + selects.length;\n }\n return 'No filter dropdowns (ok)';\n })()" + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 거래처 등록 버튼 클릭", + "action": "click_if_exists", + "target": "button:has-text('거래처 등록'), button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "url_contains": "mode=new" + } + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 거래처 정보 입력", + "action": "fill_form", + "fields": [ + { + "name": "사업자등록번호", + "value": "123-45-67890" + }, + { + "name": "거래처명", + "value": "E2E_TEST_회계거래처_{timestamp}" + }, + { + "name": "대표자명", + "value": "테스트 대표" + }, + { + "name": "업태", + "value": "제조업" + }, + { + "name": "업종", + "value": "철강" + } + ] + }, + { + "id": 9, + "phase": "CREATE", + "name": "[CREATE] 거래처 구분 선택", + "action": "click_if_exists", + "target": "#clientType-매출, label:has-text('매출') input[type='radio'], button:has-text('매출')", + "expected": "거래처 구분 선택" + }, + { + "id": 10, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 거래처 저장", + "action": "click_if_exists", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/accounting/vendors", + "toast": "등록|저장|완료|성공" + }, + "expected": "거래처 등록 완료" + }, + { + "id": 11, + "phase": "CREATE", + "name": "[CREATE] 저장 완료 토스트 확인", + "action": "verify_toast", + "verify": { + "contains": "등록|완료|성공|저장" + } + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 등록된 거래처 검색", + "action": "click_if_exists", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_회계거래처", + "submit": true + }, + { + "id": 13, + "phase": "READ", + "name": "[READ] 등록된 거래처 목록 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_회계거래처 목록에 표시" + ], + "expected": "등록된 거래처 확인" + }, + { + "id": 14, + "phase": "READ", + "name": "[READ] 거래처 상세 조회", + "action": "click_if_exists", + "target": "table tbody tr:first-child, table tbody tr:nth-child(1), table tr:nth-child(2)", + "expected": { + "detail_view": true, + "url_change": true + } + }, + { + "id": 15, + "name": "상세 페이지 정보 확인", + "action": "verify_elements", + "checks": [ + "거래처명 표시", + "사업자등록번호 표시", + "연락처 정보" + ], + "expected": "상세 정보 표시" + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 수정 모드 진입", + "action": "click_if_exists", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 17, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 정보 수정", + "action": "click_if_exists", + "target": "input[name*='name'], input[placeholder*='거래처명']" + }, + { + "id": 18, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 저장", + "action": "click_if_exists", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/accounting/vendors", + "toast": "수정|저장|완료|성공" + }, + "expected": "거래처 수정 완료" + }, + { + "id": 19, + "phase": "UPDATE", + "name": "[UPDATE] 수정 완료 토스트 확인", + "action": "verify_toast", + "verify": { + "contains": "수정|완료|성공|저장" + } + }, + { + "id": 20, + "phase": "DELETE", + "name": "[DELETE] 거래처 삭제", + "action": "click_if_exists", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 21, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click_if_exists", + "verify": { + "api_call": "DELETE /api/v1/accounting/vendors", + "toast": "삭제|제거|완료|성공" + }, + "expected": "거래처 삭제 완료", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('확인'), button:has-text('확인')" + }, + { + "id": 22, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_회계거래처 목록에서 제거" + ], + "expected": "거래처 삭제 반영" + }, + { + "id": 23, + "name": "콘솔 에러 확인", + "action": "verify_element", + "target": "body" + } + ], + "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": 2, + "name": "저장 버튼", + "steps": [ + 8, + 15 + ], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, + { + "id": 5, + "name": "목업 페이지 감지", + "steps": [ + 2 + ], + "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" + } + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_회계거래처* 패턴 데이터 삭제" + } +} diff --git a/sales-client.json b/sales-client.json index 53e99b7..228a71f 100644 --- a/sales-client.json +++ b/sales-client.json @@ -1,344 +1,344 @@ -{ - "enabled": true, - "id": "sales-client", - "name": "판매거래처관리 테스트", - "screenshotPolicy": { - "onErrorOnly": true, - "captureOn": [ - "error", - "fail", - "timeout", - "404", - "500", - "blocked" - ] - }, - "description": "판매관리 > 거래처관리 메뉴의 판매 거래처 CRUD 기능 테스트", - "baseUrl": "https://dev.codebridge-x.com", - "menuNavigation": { - "level1": "판매관리", - "level2": "거래처관리", - "expectedUrl": "/sales/client-management-sales-admin", - "searchWithinParent": true, - "closeOtherMenus": true - }, - "auth": { - "username": "TestUser5", - "password": "password123!" - }, - "testData": { - "create": { - "clientName": "E2E_TEST_판매처_{timestamp}", - "businessNumber": "987-65-43210", - "representative": "테스트 대표" - } - }, - "steps": [ - { - "id": 1, - "name": "메뉴 진입: 판매관리 > 거래처관리", - "action": "menu_navigate", - "level1": "판매관리", - "level2": "거래처관리", - "expected": { - "url_contains": "/sales/client", - "visible": [ - "거래처관리", - "거래처" - ] - } - }, - { - "id": 2, - "name": "URL 검증", - "action": "verify_url", - "expected": { - "url_contains": "/sales/client-management-sales-admin" - } - }, - { - "id": 3, - "name": "필수 검증 #5: 목업 페이지 감지", - "action": "verify_not_mockup", - "checks": [ - "거래처 목록 표시", - "거래처 등록 버튼 존재", - "검색 기능 존재" - ], - "expected": "정상 페이지 (목업 아님)" - }, - { - "id": 4, - "name": "통계 카드 확인", - "action": "evaluate", - "script": "(() => {\n const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"Stat\"], [class*=\"summary\"]');\n const texts = Array.from(cards).map(c => c.innerText?.substring(0, 30)).filter(Boolean);\n return texts.length > 0 ? 'Stats: ' + texts.length + ' cards found' : 'No stat cards (ok)';\n })()" - }, - { - "id": 5, - "name": "거래처 테이블 구조 확인", - "action": "verify_table", - "checks": [ - "거래처명 컬럼", - "사업자번호 컬럼", - "대표자 컬럼", - "연락처 컬럼" - ], - "expected": "거래처 테이블 표시" - }, - { - "id": 6, - "name": "목록 필터 테스트", - "action": "evaluate", - "script": "(() => {\n const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"], button[class*=\"Select\"]');\n if (selects.length > 0) {\n return 'Filters found: ' + selects.length;\n }\n return 'No filter dropdowns (ok)';\n })()" - }, - { - "id": 7, - "phase": "CREATE", - "name": "[CREATE] 거래처 등록 버튼 클릭", - "action": "click_if_exists", - "target": "button:has-text('거래처 등록'), button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", - "expected": { - "url_contains": "mode=new" - } - }, - { - "id": 8, - "phase": "CREATE", - "name": "[CREATE] 거래처 정보 입력", - "action": "fill_form", - "fields": [ - { - "name": "사업자등록번호", - "value": "987-65-43210" - }, - { - "name": "거래처명", - "value": "E2E_TEST_판매처_{timestamp}" - }, - { - "name": "대표자명", - "value": "테스트 대표" - }, - { - "name": "업태", - "value": "제조업" - }, - { - "name": "종목", - "value": "철강" - } - ] - }, - { - "id": 9, - "phase": "CREATE", - "name": "[CREATE] 추가 정보 입력", - "action": "fill_form", - "fields": [ - { - "name": "주소", - "value": "서울시 강남구 테스트로 123" - }, - { - "name": "전화번호", - "value": "02-1234-5678" - }, - { - "name": "이메일", - "value": "e2e-test@example.com" - }, - { - "name": "담당자명", - "value": "E2E 담당자" - }, - { - "name": "메모", - "value": "E2E 자동화 테스트 거래처" - } - ] - }, - { - "id": 10, - "phase": "CREATE", - "name": "[CREATE] 거래처 유형 선택", - "action": "click_if_exists", - "target": "#clientType-매출, label:has-text('매출')", - "expected": "매출 거래처 선택" - }, - { - "id": 11, - "phase": "CREATE", - "name": "[CREATE] 필수 검증 #2: 거래처 저장", - "action": "click_if_exists", - "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "verify": { - "url_maintained": true, - "no_error_page": true, - "api_call": "POST /api/v1/sales/clients", - "toast": "등록|저장|완료|성공" - }, - "expected": "거래처 등록 완료" - }, - { - "id": 12, - "phase": "CREATE", - "name": "[CREATE] 저장 완료 토스트 확인", - "action": "verify_toast", - "verify": { - "contains": "등록|완료|성공|저장" - } - }, - { - "id": 13, - "phase": "READ", - "name": "[READ] 등록된 거래처 검색", - "action": "click_if_exists", - "target": "input[type='search'], input[placeholder*='검색']", - "value": "E2E_TEST_판매처", - "submit": true - }, - { - "id": 14, - "phase": "READ", - "name": "[READ] 등록된 거래처 확인", - "action": "verify_detail", - "checks": [ - "E2E_TEST_판매처 목록에 표시" - ], - "expected": "등록된 거래처 확인" - }, - { - "id": 15, - "phase": "READ", - "name": "[READ] 거래처 상세 조회", - "action": "click_if_exists", - "target": "table tbody tr:first-child, table tbody tr:nth-child(1), table tr:nth-child(2)", - "expected": { - "detail_view": true - } - }, - { - "id": 16, - "phase": "UPDATE", - "name": "[UPDATE] 거래처 수정 모드 진입", - "action": "click_if_exists", - "target": "button:has-text('수정'), button:has-text('편집')", - "expected": { - "edit_mode": true - } - }, - { - "id": 17, - "phase": "UPDATE", - "name": "[UPDATE] 대표자명 수정", - "action": "click_if_exists", - "target": "input[name*='representative'], input[placeholder*='대표']" - }, - { - "id": 18, - "phase": "UPDATE", - "name": "[UPDATE] 거래처 저장", - "action": "click_if_exists", - "target": "button:has-text('저장'), button:has-text('확인')", - "verify": { - "api_call": "PUT /api/v1/sales/clients", - "toast": "수정|저장|완료|성공" - }, - "expected": "거래처 수정 완료" - }, - { - "id": 19, - "phase": "UPDATE", - "name": "[UPDATE] 수정 완료 토스트 확인", - "action": "verify_toast", - "verify": { - "contains": "수정|완료|성공|저장" - } - }, - { - "id": 20, - "phase": "DELETE", - "name": "[DELETE] 거래처 삭제", - "action": "click_if_exists", - "target": "button:has-text('삭제'), button:has-text('제거')", - "expected": { - "confirm_dialog": true - } - }, - { - "id": 21, - "phase": "DELETE", - "name": "[DELETE] 삭제 확인", - "action": "click_if_exists", - "verify": { - "api_call": "DELETE /api/v1/sales/clients", - "toast": "삭제|제거|완료|성공" - }, - "expected": "거래처 삭제 완료", - "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('확인'), button:has-text('확인')" - }, - { - "id": 22, - "phase": "DELETE", - "name": "[DELETE] 삭제 확인", - "action": "verify_detail", - "checks": [ - "E2E_TEST_판매처 목록에서 제거" - ], - "expected": "거래처 삭제 반영" - }, - { - "id": 23, - "name": "콘솔 에러 확인", - "action": "verify_element", - "target": "body" - } - ], - "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": 2, - "name": "저장 버튼", - "steps": [ - 8, - 14 - ], - "criteria": "API 호출 + 성공 토스트 + 데이터 반영" - }, - { - "id": 5, - "name": "목업 페이지 감지", - "steps": [ - 2 - ], - "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" - } - ], - "rollbackPlan": { - "onCreateFail": "등록 모달 닫고 재시도", - "onUpdateFail": "페이지 새로고침 후 재시도", - "onDeleteFail": "수동 삭제 필요", - "cleanupRequired": "E2E_TEST_판매처_* 패턴 데이터 삭제" - } -} +{ + "enabled": true, + "id": "sales-client", + "name": "판매거래처관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": [ + "error", + "fail", + "timeout", + "404", + "500", + "blocked" + ] + }, + "description": "판매관리 > 거래처관리 메뉴의 판매 거래처 CRUD 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "판매관리", + "level2": "거래처관리", + "expectedUrl": "/sales/client-management-sales-admin", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { + "username": "TestUser5", + "password": "password123!" + }, + "testData": { + "create": { + "clientName": "E2E_TEST_판매처_{timestamp}", + "businessNumber": "987-65-43210", + "representative": "테스트 대표" + } + }, + "steps": [ + { + "id": 1, + "name": "메뉴 진입: 판매관리 > 거래처관리", + "action": "menu_navigate", + "level1": "판매관리", + "level2": "거래처관리", + "expected": { + "url_contains": "/sales/client", + "visible": [ + "거래처관리", + "거래처" + ] + } + }, + { + "id": 2, + "name": "URL 검증", + "action": "verify_url", + "expected": { + "url_contains": "/sales/client-management-sales-admin" + } + }, + { + "id": 3, + "name": "필수 검증 #5: 목업 페이지 감지", + "action": "verify_not_mockup", + "checks": [ + "거래처 목록 표시", + "거래처 등록 버튼 존재", + "검색 기능 존재" + ], + "expected": "정상 페이지 (목업 아님)" + }, + { + "id": 4, + "name": "통계 카드 확인", + "action": "evaluate", + "script": "(() => {\n const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"Stat\"], [class*=\"summary\"]');\n const texts = Array.from(cards).map(c => c.innerText?.substring(0, 30)).filter(Boolean);\n return texts.length > 0 ? 'Stats: ' + texts.length + ' cards found' : 'No stat cards (ok)';\n })()" + }, + { + "id": 5, + "name": "거래처 테이블 구조 확인", + "action": "verify_table", + "checks": [ + "거래처명 컬럼", + "사업자번호 컬럼", + "대표자 컬럼", + "연락처 컬럼" + ], + "expected": "거래처 테이블 표시" + }, + { + "id": 6, + "name": "목록 필터 테스트", + "action": "evaluate", + "script": "(() => {\n const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"], button[class*=\"Select\"]');\n if (selects.length > 0) {\n return 'Filters found: ' + selects.length;\n }\n return 'No filter dropdowns (ok)';\n })()" + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 거래처 등록 버튼 클릭", + "action": "click_if_exists", + "target": "button:has-text('거래처 등록'), button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "url_contains": "mode=new" + } + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 거래처 정보 입력", + "action": "fill_form", + "fields": [ + { + "name": "사업자등록번호", + "value": "987-65-43210" + }, + { + "name": "거래처명", + "value": "E2E_TEST_판매처_{timestamp}" + }, + { + "name": "대표자명", + "value": "테스트 대표" + }, + { + "name": "업태", + "value": "제조업" + }, + { + "name": "업종", + "value": "철강" + } + ] + }, + { + "id": 9, + "phase": "CREATE", + "name": "[CREATE] 추가 정보 입력", + "action": "fill_form", + "fields": [ + { + "name": "주소", + "value": "서울시 강남구 테스트로 123" + }, + { + "name": "전화번호", + "value": "02-1234-5678" + }, + { + "name": "이메일", + "value": "e2e-test@example.com" + }, + { + "name": "담당자명", + "value": "E2E 담당자" + }, + { + "name": "메모", + "value": "E2E 자동화 테스트 거래처" + } + ] + }, + { + "id": 10, + "phase": "CREATE", + "name": "[CREATE] 거래처 유형 선택", + "action": "click_if_exists", + "target": "#clientType-매출, label:has-text('매출')", + "expected": "매출 거래처 선택" + }, + { + "id": 11, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 거래처 저장", + "action": "click_if_exists", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/sales/clients", + "toast": "등록|저장|완료|성공" + }, + "expected": "거래처 등록 완료" + }, + { + "id": 12, + "phase": "CREATE", + "name": "[CREATE] 저장 완료 토스트 확인", + "action": "verify_toast", + "verify": { + "contains": "등록|완료|성공|저장" + } + }, + { + "id": 13, + "phase": "READ", + "name": "[READ] 등록된 거래처 검색", + "action": "click_if_exists", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_판매처", + "submit": true + }, + { + "id": 14, + "phase": "READ", + "name": "[READ] 등록된 거래처 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_판매처 목록에 표시" + ], + "expected": "등록된 거래처 확인" + }, + { + "id": 15, + "phase": "READ", + "name": "[READ] 거래처 상세 조회", + "action": "click_if_exists", + "target": "table tbody tr:first-child, table tbody tr:nth-child(1), table tr:nth-child(2)", + "expected": { + "detail_view": true + } + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 수정 모드 진입", + "action": "click_if_exists", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 17, + "phase": "UPDATE", + "name": "[UPDATE] 대표자명 수정", + "action": "click_if_exists", + "target": "input[name*='representative'], input[placeholder*='대표']" + }, + { + "id": 18, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 저장", + "action": "click_if_exists", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/sales/clients", + "toast": "수정|저장|완료|성공" + }, + "expected": "거래처 수정 완료" + }, + { + "id": 19, + "phase": "UPDATE", + "name": "[UPDATE] 수정 완료 토스트 확인", + "action": "verify_toast", + "verify": { + "contains": "수정|완료|성공|저장" + } + }, + { + "id": 20, + "phase": "DELETE", + "name": "[DELETE] 거래처 삭제", + "action": "click_if_exists", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 21, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click_if_exists", + "verify": { + "api_call": "DELETE /api/v1/sales/clients", + "toast": "삭제|제거|완료|성공" + }, + "expected": "거래처 삭제 완료", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('확인'), button:has-text('확인')" + }, + { + "id": 22, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_판매처 목록에서 제거" + ], + "expected": "거래처 삭제 반영" + }, + { + "id": 23, + "name": "콘솔 에러 확인", + "action": "verify_element", + "target": "body" + } + ], + "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": 2, + "name": "저장 버튼", + "steps": [ + 8, + 14 + ], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, + { + "id": 5, + "name": "목업 페이지 감지", + "steps": [ + 2 + ], + "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" + } + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_판매처_* 패턴 데이터 삭제" + } +}