Files
sam-scenarios/deposit-management.json

696 lines
20 KiB
JSON
Raw Normal View History

{
"id": "deposit-management",
"name": "입금관리 테스트",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": [
"error",
"fail",
"timeout",
"404",
"500",
"blocked"
]
},
"description": "입금관리 목록 조회, 계정과목명 일괄변경, 상세 수정 기능 E2E 테스트",
"baseUrl": "https://dev.codebridge-x.com",
"url": "/ko/accounting/deposits",
"navigation": {
"targetUrl": "/accounting/deposits",
"urlPattern": "/accounting/deposits|/ko/accounting/deposits",
"menuHints": [
"입금관리",
"입금 관리",
"회계관리"
]
},
"menuNavigation": {
"level1": "회계관리",
"level2": "입금관리",
"expectedUrl": "/ko/accounting/deposits",
"searchWithinParent": true,
"closeOtherMenus": true
},
"menuNavigationEnhanced": {
"strategy": "scroll-and-search",
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
"level1": "회계관리",
"level2": "입금관리",
"alternativeLevel1Names": [
"회계관리",
"회계 관리",
"Accounting"
],
"alternativeLevel2Names": [
"입금관리",
"입금 관리",
"Deposits"
],
"scrollConfig": {
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
"scrollStep": 200,
"maxScrollAttempts": 10,
"scrollDelay": 300
}
},
"timeout": 60000,
"tags": [
"accounting",
"deposit",
"crud"
],
"auth": {
"username": "TestUser5",
"password": "password123!"
},
"steps": [
{
"id": 1,
"name": "사이드바 메뉴 전체 펼치기",
"description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비",
"action": "evaluate",
"script": "(async()=>{document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'});await new Promise(r=>setTimeout(r,300));Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.includes('모두 펼치기'))?.click();await new Promise(r=>setTimeout(r,2000));return 'sidebar expanded';})()"
},
{
"id": 2,
"name": "2단계 메뉴 진입: 회계관리 > 입금관리",
"description": "사이드바를 스크롤하며 회계관리 > 입금관리 메뉴를 찾아 클릭",
"action": "menu_navigate",
"level1": "회계관리",
"level2": "입금관리",
"expect": {
"url": "/accounting/deposits",
"visible": [
"입금관리",
"총 입금"
]
},
"verification": [
"회계관리 메뉴가 펼쳐졌는지 확인",
"입금관리 서브메뉴 클릭 성공",
"404 에러 없이 페이지 로드 완료"
]
},
{
"id": 3,
"name": "목록 페이지 구조 확인",
"description": "테이블 및 필터 요소 확인",
"action": "verify_element",
"target": "body",
"expect": {
"visible": [
"입금일",
"입금계좌",
"입금자명",
"입금금액",
"거래처",
"적요",
"입금유형"
],
"elements": {
"statisticsCards": [
"총 입금",
"당월 입금",
"거래처 미설정",
"입금유형 미설정"
],
"filters": [
"계정과목명",
"저장",
"새로고침"
],
"pagination": true
}
}
},
{
"id": 4,
"name": "계정과목명 드롭다운 옵션 확인",
"description": "계정과목명 일괄변경 드롭다운 옵션 검증",
"action": "click_if_exists",
"target": "계정과목명 드롭다운",
"expect": {
"options": [
"미설정",
"매출대금",
"선수금",
"가수금",
"임대수익",
"이자수익",
"보증금 반환",
"차입금",
"자본금",
"부가세 환급",
"기타"
]
}
},
{
"id": 5,
"name": "체크박스 선택 후 계정과목명 일괄변경",
"description": "테이블 행 선택 후 계정과목명 일괄변경 저장",
"action": "evaluate",
"script": "(async()=>{const cb=document.querySelector('table tbody tr input[type=\"checkbox\"]');if(cb){cb.click();await new Promise(r=>setTimeout(r,500));}const dd=Array.from(document.querySelectorAll('button,select,[role=\"combobox\"]')).find(el=>el.innerText?.includes('계정과목명')||el.getAttribute('aria-label')?.includes('계정과목명'));if(dd){dd.click();await new Promise(r=>setTimeout(r,500));}const opt=Array.from(document.querySelectorAll('[role=\"option\"],li,button')).find(el=>el.innerText?.trim()==='매출대금');if(opt){opt.click();await new Promise(r=>setTimeout(r,500));}const saveBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='저장');if(saveBtn){saveBtn.click();await new Promise(r=>setTimeout(r,1000));}return 'batch update attempted';})()",
"expect": {
"dialog": "확인 다이얼로그 표시",
"toast": "변경 완료 메시지"
}
},
{
"id": 6,
"name": "필수 검증: 계정과목명 변경 데이터 반영 확인",
"note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!",
"description": "저장 후 테이블에서 변경된 입금유형 값 확인",
"action": "verify_element",
"target": "body",
"expect": {
"tableCell": {
"row": 1,
"column": "입금유형",
"value": "매출대금"
}
},
"knownBugReference": "BUG-SALES-20260115-001 (매출관리 동일 버그 확인 필요)"
},
{
"id": 7,
"name": "입금 상세 페이지 이동",
"description": "테이블 행 클릭하여 상세 페이지로 이동",
"action": "click_first_row",
"expect": {
"url": "/accounting/deposits/{id}",
"visible": [
"입금 상세",
"기본 정보",
"목록",
"삭제",
"수정"
]
}
},
{
"id": 8,
"name": "상세 페이지 읽기 모드 필드 확인",
"description": "수정 전 필드들이 비활성화 상태인지 확인",
"action": "verify_element",
"target": "body",
"expect": {
"fields": [
{
"name": "입금일",
"disabled": true
},
{
"name": "입금계좌",
"disabled": true
},
{
"name": "입금자명",
"disabled": true
},
{
"name": "입금금액",
"disabled": true
},
{
"name": "적요",
"disabled": true
},
{
"name": "거래처",
"disabled": true
},
{
"name": "입금 유형",
"disabled": true
}
]
}
},
{
"id": 9,
"name": "수정 모드 전환",
"description": "수정 버튼 클릭하여 편집 모드로 전환",
"action": "click_if_exists",
"target": "수정",
"expect": {
"url": "/accounting/deposits/{id}?mode=edit",
"visible": [
"입금 수정",
"취소",
"저장"
],
"notVisible": [
"목록",
"삭제",
"수정"
]
}
},
{
"id": 10,
"name": "수정 모드 필드 활성화 검증",
"description": "수정 가능한 필드와 불가능한 필드 확인",
"action": "verify_element",
"target": "body",
"expect": {
"fields": [
{
"name": "입금일",
"disabled": true,
"note": "은행데이터 - 수정 불가"
},
{
"name": "입금계좌",
"disabled": true,
"note": "은행데이터 - 수정 불가"
},
{
"name": "입금자명",
"disabled": true,
"note": "은행데이터 - 수정 불가"
},
{
"name": "입금금액",
"disabled": true,
"note": "은행데이터 - 수정 불가"
},
{
"name": "적요",
"disabled": false,
"editable": true
},
{
"name": "거래처",
"disabled": false,
"type": "combobox",
"editable": true
},
{
"name": "입금 유형",
"disabled": false,
"type": "combobox",
"editable": true
}
]
}
},
{
"id": 11,
"name": "거래처 드롭다운 옵션 확인",
"description": "거래처 선택 드롭다운 옵션 검증",
"action": "click_if_exists",
"target": "거래처 드롭다운",
"expect": {
"options": [
"거래처테스트",
"아크더레드",
"코브라브릿지",
"가우스전자",
"아크아크"
]
}
},
{
"id": 12,
"name": "입금 유형 드롭다운 옵션 확인",
"description": "입금 유형 선택 드롭다운 옵션 검증",
"action": "click_if_exists",
"target": "입금 유형 드롭다운",
"expect": {
"options": [
"미설정",
"매출대금",
"선수금",
"가수금",
"임대수익",
"이자수익",
"보증금 반환",
"차입금",
"자본금",
"부가세 환급",
"기타"
]
}
},
{
"id": 13,
"name": "수정 데이터 입력",
"description": "수정 가능한 필드에 테스트 데이터 입력",
"action": "evaluate",
"script": "(async()=>{const inputs=document.querySelectorAll('input,textarea');const memo=Array.from(inputs).find(el=>el.getAttribute('name')?.includes('적요')||el.getAttribute('placeholder')?.includes('적요')||el.closest('[class*=\"memo\"],label')?.innerText?.includes('적요'));if(memo){memo.focus();memo.value='';memo.dispatchEvent(new Event('input',{bubbles:true}));memo.value='테스트 적요 수정';memo.dispatchEvent(new Event('input',{bubbles:true}));memo.dispatchEvent(new Event('change',{bubbles:true}));await new Promise(r=>setTimeout(r,500));}const vendorDD=Array.from(document.querySelectorAll('button,[role=\"combobox\"]')).find(el=>el.innerText?.includes('거래처')||el.getAttribute('aria-label')?.includes('거래처'));if(vendorDD){vendorDD.click();await new Promise(r=>setTimeout(r,500));const vendorOpt=Array.from(document.querySelectorAll('[role=\"option\"],li')).find(el=>el.innerText?.trim()==='거래처테스트');if(vendorOpt){vendorOpt.click();await new Promise(r=>setTimeout(r,500));}}const typeDD=Array.from(document.querySelectorAll('button,[role=\"combobox\"]')).find(el=>el.innerText?.includes('입금 유형')||el.getAttribute('aria-label')?.includes('입금'));if(typeDD){typeDD.click();await new Promise(r=>setTimeout(r,500));const typeOpt=Array.from(document.querySelectorAll('[role=\"option\"],li')).find(el=>el.innerText?.trim()==='매출대금');if(typeOpt){typeOpt.click();await new Promise(r=>setTimeout(r,500));}}return 'form filled';})()"
},
{
"id": 14,
"name": "저장 및 결과 확인",
"description": "저장 버튼 클릭 후 데이터 반영 확인",
"action": "click_if_exists",
"target": "저장",
"expect": {
"toast": "저장 완료 메시지",
"url": "/accounting/deposits/{id}",
"mode": "view"
}
},
{
"id": 15,
"name": "필수 검증: 수정 데이터 반영 확인",
"note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!",
"description": "저장 후 상세 페이지에서 변경된 값 확인",
"action": "verify_detail",
"checks": [
"적요: 테스트 적요 수정",
"거래처: 거래처테스트",
"입금 유형: 매출대금"
],
"expect": {
"fields": [
{
"name": "적요",
"value": "테스트 적요 수정"
},
{
"name": "거래처",
"value": "거래처테스트"
},
{
"name": "입금 유형",
"value": "매출대금"
}
]
}
},
{
"id": 16,
"name": "취소 버튼 동작 확인",
"description": "수정 모드에서 취소 버튼 동작 검증",
"action": "evaluate",
"script": "(async()=>{const editBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='수정');if(editBtn){editBtn.click();await new Promise(r=>setTimeout(r,1000));}const cancelBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='취소');if(cancelBtn){cancelBtn.click();await new Promise(r=>setTimeout(r,1000));}return 'cancel tested';})()",
"expect": {
"url": "/accounting/deposits/{id}",
"mode": "view",
"visible": [
"입금 상세",
"목록",
"삭제",
"수정"
]
}
},
{
"id": 17,
"name": "목록 버튼 동작 확인",
"description": "목록 버튼 클릭하여 목록 페이지로 이동",
"action": "click_if_exists",
"target": "목록",
"expect": {
"url": "/accounting/deposits",
"visible": [
"입금관리",
"총 입금"
]
}
},
{
"id": 18,
"name": "필터 드롭다운 검증",
"description": "목록 페이지 필터 드롭다운 옵션 확인",
"note": "3개의 필터 드롭다운 존재 (거래처, 입금유형, 정렬)",
"action": "verify_element",
"target": "body",
"expect": {
"filters": [
{
"name": "거래처 필터",
"default": "전체"
},
{
"name": "입금유형 필터",
"default": "전체"
},
{
"name": "정렬",
"default": "최신순",
"options": [
"최신순",
"등록순",
"금액 높은순",
"금액 낮은순"
]
}
]
}
},
{
"id": 19,
"name": "날짜 필터 검증",
"description": "날짜 필터 버튼 동작 확인",
"action": "click_if_exists",
"target": "당해년도",
"expect": {
"dateRange": {
"start": "2026-01-01",
"end": "2026-12-31"
}
}
},
{
"id": 20,
"name": "페이지네이션 동작 확인",
"description": "페이지네이션 버튼 동작 검증",
"action": "click_if_exists",
"target": "다음",
"expect": {
"pagination": {
"totalItems": 60,
"itemsPerPage": 20,
"currentPage": 1,
"totalPages": 3
}
},
"expectAfterAction": {
"currentPage": 2,
"displayText": "전체 60개 중 21-40개 표시"
}
},
{
"id": 21,
"name": "콘솔 에러 확인",
"action": "verify_element",
"target": "body"
}
],
"deleteTest": {
"note": "삭제 테스트 - 이전에 스킵되었으나 CRUD 완전성을 위해 추가",
"steps": [
{
"id": "step-delete-1",
"name": "삭제 버튼 클릭",
"description": "상세 페이지에서 삭제 버튼 클릭",
"action": "click_if_exists",
"target": "삭제",
"expect": {
"confirmDialog": true,
"dialogText": [
"삭제",
"하시겠습니까"
]
}
},
{
"id": "step-delete-2",
"name": "삭제 확인",
"description": "삭제 확인 다이얼로그에서 확인 클릭",
"action": "click_dialog_confirm",
"target": "확인",
"waitFor": {
"type": "navigation",
"url": "/accounting/deposits",
"timeout": 5000
},
"expect": {
"toast": [
"삭제",
"완료",
"성공"
],
"url": "/accounting/deposits"
}
},
{
"id": "step-delete-3",
"name": "필수 검증: 삭제 데이터 반영 확인",
"note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 삭제 확인 필수!",
"description": "목록에서 삭제된 입금 내역이 없어졌는지 확인",
"action": "verify_element",
"target": "body",
"expect": {
"tableNotContains": "테스트 적요 수정"
}
}
]
},
"knownBugs": [
{
"id": "BUG-SALES-20260115-001",
"description": "계정과목명 일괄변경 시 토스트 성공 표시되나 실제 데이터 미변경 (매출관리)",
"relatedSteps": [
"step-4-1"
],
"note": "입금관리에서도 동일한 버그가 존재할 수 있으므로 step-4-1에서 검증 필수"
}
],
"testData": {
"sampleDeposit": {
"date": "2025-12-28",
"account": "운영계좌",
"depositor": "CJ대한통운",
"amount": "8,209,677",
"vendor": "CJ대한통운",
"description": "CJ대한통운 입금",
"depositType": "미설정"
},
"modifiedData": {
"description": "테스트 적요 수정",
"vendor": "거래처테스트",
"depositType": "매출대금"
}
},
"pageStructure": {
"listPage": {
"url": "/accounting/deposits",
"title": "입금관리",
"statistics": [
"총 입금",
"당월 입금",
"거래처 미설정",
"입금유형 미설정"
],
"tableColumns": [
"checkbox",
"입금일",
"입금계좌",
"입금자명",
"입금금액",
"거래처",
"적요",
"입금유형",
"action"
],
"batchUpdate": {
"label": "계정과목명",
"saveButton": "저장"
},
"filters": [
"거래처",
"입금유형",
"정렬"
],
"dateFilters": [
"당해년도",
"전전월",
"전월",
"당월",
"어제",
"오늘"
]
},
"detailPage": {
"url": "/accounting/deposits/{id}",
"title": "입금 상세",
"buttons": [
"목록",
"삭제",
"수정"
],
"fields": {
"readOnly": [
"입금일",
"입금계좌",
"입금자명",
"입금금액"
],
"editable": [
"적요",
"거래처",
"입금 유형"
]
}
},
"editPage": {
"url": "/accounting/deposits/{id}?mode=edit",
"title": "입금 수정",
"buttons": [
"취소",
"저장"
]
}
},
"dropdownOptions": {
"accountSubject": {
"label": "계정과목명",
"options": [
"미설정",
"매출대금",
"선수금",
"가수금",
"임대수익",
"이자수익",
"보증금 반환",
"차입금",
"자본금",
"부가세 환급",
"기타"
]
},
"depositType": {
"label": "입금 유형",
"options": [
"미설정",
"매출대금",
"선수금",
"가수금",
"임대수익",
"이자수익",
"보증금 반환",
"차입금",
"자본금",
"부가세 환급",
"기타"
]
},
"vendor": {
"label": "거래처",
"options": [
"거래처테스트",
"아크더레드",
"코브라브릿지",
"가우스전자",
"아크아크"
]
},
"sortOrder": {
"label": "정렬",
"options": [
"최신순",
"등록순",
"금액 높은순",
"금액 낮은순"
]
}
},
"assertions": [
{
"type": "url",
"expected": "/accounting/deposits",
"message": "목록 페이지 URL 확인"
},
{
"type": "text",
"target": "body",
"expected": "입금관리",
"message": "페이지 타이틀 확인"
}
]
}