Files
sam-scenarios/expected-expenses.json

1060 lines
29 KiB
JSON
Raw Normal View History

{
"id": "expected-expenses",
"name": "예상비용 관리 테스트",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
},
"description": "회계관리 > 예상비용 메뉴의 CRUD 전체 워크플로우, 일괄 작업, 전자결재 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com",
"url": "/ko/accounting/expected-expenses",
"menuNavigation": {
"level1": "회계관리",
"level2": "지출예상내역서",
"expectedUrl": "/ko/accounting/expected-expenses"
},
"menuNavigationEnhanced": {
"strategy": "scroll-and-search",
"sidebarSelector": ".sidebar-scroll, [data-sidebar], nav[role='navigation']",
"scrollConfig": {
"scrollToTopFirst": true,
"scrollStep": 200,
"maxScrollAttempts": 10,
"scrollDelay": 300
},
"level1": {
"text": "회계관리",
"selectors": [
"button:has-text('회계관리')",
"[data-menu='accounting']",
"a:has-text('회계관리')"
],
"expandable": true,
"waitAfterClick": 500
},
"level2": {
"text": "지출예상내역서",
"selectors": [
"a:has-text('예상비용')",
"[href*='expected-expenses']",
"button:has-text('예상비용')"
],
"waitAfterClick": 1000
},
"fallback": {
"directUrl": "/ko/accounting/expected-expenses",
"useAfterAttempts": 3
}
},
"testFocus": {
"primary": "등록/수정/삭제 전체 워크플로우 및 일괄 작업 기능 검증",
"description": "2년 기간 설정, 모달 등록/수정, 일괄 작업(예상 지급일 변경, 전자결재, 일괄삭제) 테스트"
},
"prerequisites": {
"authentication": true,
"testData": {
"dateRange": {
"startDate": "2024-01-15",
"endDate": "2026-01-15"
},
"newExpense": {
"transactionType": "purchase",
"amount": 5000000,
"vendorName": "테스트거래처",
"accountSubject": "매입비용",
"note": "테스트 예상비용 등록"
},
"updateExpense": {
"amount": 7000000,
"note": "테스트 예상비용 수정"
},
"bulkOperation": {
"newExpectedDate": "2026-02-15"
}
}
},
"steps": [
{
"id": "step-0",
"name": "사이드바 초기화",
"description": "사이드바를 최상단으로 스크롤하여 메뉴 탐색 준비",
"actions": [
{
"type": "evaluate",
"script": "document.querySelector('.sidebar-scroll, [data-sidebar], nav[role=\"navigation\"]')?.scrollTo({top: 0, behavior: 'instant'})"
},
{ "type": "wait", "duration": 500 }
],
"expected": {
"sidebarReady": true,
"scrollPosition": "top"
}
},
{
"id": "step-1",
"name": "2단계 메뉴 진입: 회계관리 > 예상비용",
"description": "회계관리 > 예상비용 메뉴로 이동하여 페이지 로드 확인 (scrollAndFind 패턴 적용)",
"navigationPattern": "scrollAndFind",
"actions": [
{
"type": "scrollAndFind",
"target": "회계관리",
"container": ".sidebar-scroll, [data-sidebar], nav[role='navigation']",
"scrollStep": 200,
"maxAttempts": 10
},
{ "type": "click", "target": "회계관리" },
{ "type": "wait", "duration": 500 },
{
"type": "scrollAndFind",
"target": "예상비용",
"container": ".sidebar-scroll, [data-sidebar], nav[role='navigation']",
"scrollStep": 200,
"maxAttempts": 5
},
{ "type": "click", "target": "예상비용" },
{ "type": "wait", "target": "페이지 로드 완료", "timeout": 5000 }
],
"fallback": {
"action": "navigate",
"url": "/ko/accounting/expected-expenses"
},
"expected": {
"url": "/ko/accounting/expected-expenses",
"pageTitle": "예상비용",
"elements": ["페이지 타이틀", "기간 선택", "필터", "테이블", "등록 버튼"],
"authenticated": true
}
},
{
"id": "step-2",
"name": "페이지 구조 확인",
"description": "통계 카드, 필터, 버튼, 테이블 구조 확인",
"actions": [
{
"type": "verify",
"target": "페이지 구조"
}
],
"expected": {
"statCards": ["총 지출 예상", "미지급 건수", "지급완료 건수"],
"filters": ["기간 선택", "거래유형", "지급상태", "정렬"],
"buttons": ["등록", "예상 지급일 변경", "전자결재", "일괄삭제"],
"tableColumns": ["선택", "예상 지급일", "결제일", "거래유형", "거래처명", "지출금액", "지급상태", "전자결재", "적요", "수정", "삭제"]
}
},
{
"id": "step-3",
"name": "기간 설정 (2년)",
"description": "현재일자에서 2년 전까지 기간 설정 (2024-01-15 ~ 2026-01-15)",
"actions": [
{
"type": "click",
"target": "기간 선택 버튼"
},
{
"type": "selectDate",
"target": "시작일",
"value": "2024-01-15"
},
{
"type": "selectDate",
"target": "종료일",
"value": "2026-01-15"
},
{
"type": "click",
"target": "적용 버튼"
},
{
"type": "wait",
"target": "데이터 로드"
}
],
"expected": {
"dateRange": "2024-01-15 ~ 2026-01-15",
"dataLoaded": true,
"tableVisible": true
}
},
{
"id": "step-4",
"name": "초기 데이터 확인",
"description": "2년 기간 데이터 로드 확인 및 통계 카드 값 확인",
"actions": [
{
"type": "verify",
"target": "테이블 데이터 및 통계"
}
],
"expected": {
"tableHasData": true,
"statCardsVisible": true,
"monthGrouping": "월별 그룹핑 표시"
}
},
{
"id": "step-5",
"name": "등록 버튼 클릭",
"description": "등록 버튼 클릭하여 등록 모달 열기",
"actions": [
{
"type": "click",
"target": "등록 버튼"
},
{
"type": "wait",
"target": "모달 표시"
}
],
"expected": {
"modalTitle": "예상비용 등록",
"modalVisible": true,
"formFieldsVisible": true
}
},
{
"id": "step-6",
"name": "등록 모달 필드 확인",
"description": "등록 모달의 모든 입력 필드 존재 확인",
"actions": [
{
"type": "verify",
"target": "모달 입력 필드"
}
],
"expected": {
"fields": [
"예상 지급일 (datepicker)",
"결제일 (datepicker)",
"거래유형 (select)",
"거래처 (combobox)",
"지출금액 (input number)",
"계좌 (select)",
"계정과목 (select)",
"적요/메모 (textarea)",
"등록 버튼",
"취소 버튼"
]
}
},
{
"id": "step-7",
"name": "예상 지급일 입력",
"description": "DatePicker로 예상 지급일 선택",
"actions": [
{
"type": "click",
"target": "예상 지급일 필드"
},
{
"type": "selectDate",
"target": "캘린더",
"value": "2026-02-01"
}
],
"expected": {
"fieldValue": "2026-02-01",
"fieldFilled": true
}
},
{
"id": "step-8",
"name": "결제일 입력",
"description": "DatePicker로 결제일 선택",
"actions": [
{
"type": "click",
"target": "결제일 필드"
},
{
"type": "selectDate",
"target": "캘린더",
"value": "2026-01-20"
}
],
"expected": {
"fieldValue": "2026-01-20",
"fieldFilled": true
}
},
{
"id": "step-9",
"name": "거래유형 선택",
"description": "Select로 거래유형 선택 (매입)",
"actions": [
{
"type": "click",
"target": "거래유형 Select"
},
{
"type": "select",
"target": "옵션 목록",
"value": "매입"
}
],
"expected": {
"options": ["매입", "선급금", "가지급금", "임대료", "급여", "보험료", "세금", "공과금", "기타"],
"selectedValue": "매입"
}
},
{
"id": "step-10",
"name": "거래처 입력",
"description": "Combobox로 거래처 검색 및 선택 또는 직접 입력",
"actions": [
{
"type": "click",
"target": "거래처 Combobox"
},
{
"type": "type",
"target": "거래처 입력 필드",
"value": "테스트"
},
{
"type": "wait",
"target": "검색 결과"
},
{
"type": "select",
"target": "거래처 옵션 또는 직접 입력"
}
],
"expected": {
"searchWorking": true,
"optionsDisplayed": "거래처 목록 또는 새로 입력 가능",
"selectedVendor": "테스트거래처"
}
},
{
"id": "step-11",
"name": "지출금액 입력",
"description": "숫자 입력 필드에 금액 직접 입력",
"actions": [
{
"type": "click",
"target": "지출금액 필드"
},
{
"type": "clear",
"target": "지출금액 필드"
},
{
"type": "type",
"target": "지출금액 필드",
"value": "5000000"
}
],
"expected": {
"fieldValue": "5000000 또는 5,000,000 (포맷)",
"validInput": true
}
},
{
"id": "step-12",
"name": "계좌 선택",
"description": "Select로 계좌 선택",
"actions": [
{
"type": "click",
"target": "계좌 Select"
},
{
"type": "select",
"target": "계좌 옵션"
}
],
"expected": {
"optionsLoaded": true,
"accountSelected": true
}
},
{
"id": "step-13",
"name": "계정과목 선택",
"description": "Select로 계정과목 선택 (매입비용)",
"actions": [
{
"type": "click",
"target": "계정과목 Select"
},
{
"type": "select",
"target": "옵션 목록",
"value": "매입비용"
}
],
"expected": {
"options": ["매입비용", "급여", "임차료", "공과금", "보험료", "세금과공과", "기타비용"],
"selectedValue": "매입비용"
}
},
{
"id": "step-14",
"name": "적요 입력",
"description": "Textarea에 메모/적요 입력",
"actions": [
{
"type": "click",
"target": "적요/메모 필드"
},
{
"type": "type",
"target": "적요/메모 필드",
"value": "테스트 예상비용 등록"
}
],
"expected": {
"fieldValue": "테스트 예상비용 등록",
"textareaFilled": true
}
},
{
"id": "step-15",
"name": "등록 버튼 클릭 및 저장",
"description": "모달 내 등록 버튼 클릭하여 데이터 저장",
"actions": [
{
"type": "click",
"target": "등록 버튼 (모달 내)"
},
{
"type": "wait",
"target": "저장 처리 완료"
}
],
"expected": {
"apiCall": "POST /api/accounting/expected-expenses",
"apiResponse": "200 OK",
"successToast": "예상비용이 등록되었습니다",
"modalClosed": true
}
},
{
"id": "step-16",
"name": "등록 결과 확인",
"description": "테이블에 새로 등록된 데이터 표시 확인",
"actions": [
{
"type": "wait",
"target": "테이블 리로드"
},
{
"type": "verify",
"target": "신규 데이터 행"
}
],
"expected": {
"newRowVisible": true,
"dataMatches": {
"amount": "5,000,000원",
"vendorName": "테스트거래처",
"transactionType": "매입",
"note": "테스트 예상비용 등록"
}
}
},
{
"id": "step-17",
"name": "수정 아이콘 클릭",
"description": "방금 등록한 데이터의 수정 아이콘 클릭하여 수정 모달 열기",
"actions": [
{
"type": "click",
"target": "신규 등록 행의 수정 아이콘"
},
{
"type": "wait",
"target": "수정 모달 표시"
}
],
"expected": {
"modalTitle": "예상비용 수정",
"modalVisible": true,
"prefilledData": {
"amount": "5000000",
"vendorName": "테스트거래처",
"note": "테스트 예상비용 등록"
}
}
},
{
"id": "step-18",
"name": "지출금액 수정",
"description": "지출금액을 7,000,000원으로 변경",
"actions": [
{
"type": "click",
"target": "지출금액 필드"
},
{
"type": "clear",
"target": "지출금액 필드"
},
{
"type": "type",
"target": "지출금액 필드",
"value": "7000000"
}
],
"expected": {
"fieldValue": "7000000",
"valueChanged": true
}
},
{
"id": "step-19",
"name": "적요 수정",
"description": "적요를 '테스트 예상비용 수정'으로 변경",
"actions": [
{
"type": "click",
"target": "적요/메모 필드"
},
{
"type": "clear",
"target": "적요/메모 필드"
},
{
"type": "type",
"target": "적요/메모 필드",
"value": "테스트 예상비용 수정"
}
],
"expected": {
"fieldValue": "테스트 예상비용 수정",
"textChanged": true
}
},
{
"id": "step-20",
"name": "수정 버튼 클릭 및 저장",
"description": "모달 내 수정 버튼 클릭하여 변경사항 저장",
"actions": [
{
"type": "click",
"target": "수정 버튼 (모달 내)"
},
{
"type": "wait",
"target": "저장 처리 완료"
}
],
"expected": {
"apiCall": "PUT /api/accounting/expected-expenses/:id",
"apiResponse": "200 OK",
"successToast": "예상비용이 수정되었습니다",
"modalClosed": true
}
},
{
"id": "step-21",
"name": "수정 결과 확인",
"description": "테이블에서 수정된 데이터 반영 확인",
"actions": [
{
"type": "wait",
"target": "테이블 리로드"
},
{
"type": "verify",
"target": "수정된 데이터 행"
}
],
"expected": {
"updatedRowVisible": true,
"dataMatches": {
"amount": "7,000,000원",
"note": "테스트 예상비용 수정"
}
}
},
{
"id": "step-22",
"name": "체크박스 선택 (단일)",
"description": "방금 수정한 데이터의 체크박스 선택",
"actions": [
{
"type": "click",
"target": "수정된 행의 체크박스"
}
],
"expected": {
"checkboxChecked": true,
"selectedCount": 1,
"bulkButtonsEnabled": true
}
},
{
"id": "step-23",
"name": "예상 지급일 변경 버튼 클릭",
"description": "일괄 작업: 예상 지급일 변경 다이얼로그 열기",
"actions": [
{
"type": "click",
"target": "예상 지급일 변경 버튼"
},
{
"type": "wait",
"target": "다이얼로그 표시"
}
],
"expected": {
"dialogTitle": "예상 지급일 변경",
"dialogVisible": true,
"datepickerVisible": true,
"selectedItemsCount": "1건"
}
},
{
"id": "step-24",
"name": "새로운 예상 지급일 선택",
"description": "DatePicker로 새로운 예상 지급일 선택 (2026-02-15)",
"actions": [
{
"type": "click",
"target": "날짜 선택 필드"
},
{
"type": "selectDate",
"target": "캘린더",
"value": "2026-02-15"
}
],
"expected": {
"dateSelected": "2026-02-15",
"confirmButtonEnabled": true
}
},
{
"id": "step-25",
"name": "예상 지급일 변경 확인",
"description": "확인 버튼 클릭하여 예상 지급일 일괄 변경",
"actions": [
{
"type": "click",
"target": "확인 버튼"
},
{
"type": "wait",
"target": "처리 완료"
}
],
"expected": {
"apiCall": "PUT /api/accounting/expected-expenses/bulk-update-date",
"apiResponse": "200 OK",
"successToast": "1건의 예상 지급일이 변경되었습니다",
"dialogClosed": true
}
},
{
"id": "step-26",
"name": "예상 지급일 변경 결과 확인",
"description": "테이블에서 예상 지급일이 변경되었는지 확인",
"actions": [
{
"type": "wait",
"target": "테이블 리로드"
},
{
"type": "verify",
"target": "변경된 데이터 행"
}
],
"expected": {
"expectedPaymentDate": "2026-02-15",
"dateUpdated": true
}
},
{
"id": "step-27",
"name": "전자결재 버튼 클릭",
"description": "일괄 작업: 전자결재 신청 (체크박스 선택 유지 상태)",
"actions": [
{
"type": "verify",
"target": "체크박스 선택 상태 (여전히 선택됨)"
},
{
"type": "click",
"target": "전자결재 버튼"
},
{
"type": "wait",
"target": "처리 완료"
}
],
"expected": {
"apiCall": "POST /api/accounting/expected-expenses/approval",
"apiResponse": "200 OK 또는 404/500 (미구현 가능)",
"resultToast": "전자결재가 신청되었습니다 또는 에러 메시지"
}
},
{
"id": "step-28",
"name": "전자결재 결과 확인",
"description": "테이블에서 전자결재 상태 변경 확인",
"actions": [
{
"type": "wait",
"target": "테이블 리로드"
},
{
"type": "verify",
"target": "전자결재 상태 컬럼"
}
],
"expected": {
"approvalStatus": "결재대기 또는 미신청 (API 미구현 시)",
"badgeVisible": true
}
},
{
"id": "step-29",
"name": "추가 데이터 등록 (일괄삭제 테스트용)",
"description": "일괄삭제 테스트를 위해 추가 데이터 1건 더 등록",
"actions": [
{
"type": "click",
"target": "등록 버튼"
},
{
"type": "wait",
"target": "모달 표시"
},
{
"type": "fillForm",
"target": "등록 폼",
"data": {
"expectedPaymentDate": "2026-03-01",
"transactionType": "급여",
"amount": "3000000",
"vendorName": "삭제테스트거래처",
"note": "일괄삭제 테스트용"
}
},
{
"type": "click",
"target": "등록 버튼 (모달 내)"
},
{
"type": "wait",
"target": "저장 완료"
}
],
"expected": {
"successToast": "예상비용이 등록되었습니다",
"newRowVisible": true
}
},
{
"id": "step-30",
"name": "복수 체크박스 선택",
"description": "일괄삭제를 위해 2개 행 체크박스 선택",
"actions": [
{
"type": "click",
"target": "첫 번째 테스트 데이터 체크박스"
},
{
"type": "click",
"target": "두 번째 테스트 데이터 체크박스"
}
],
"expected": {
"selectedCount": 2,
"bulkDeleteButtonEnabled": true
}
},
{
"id": "step-31",
"name": "일괄삭제 버튼 클릭",
"description": "일괄삭제 버튼 클릭하여 확인 다이얼로그 표시",
"actions": [
{
"type": "click",
"target": "일괄삭제 버튼"
},
{
"type": "wait",
"target": "확인 다이얼로그 표시"
}
],
"expected": {
"dialogTitle": "일괄삭제 확인",
"dialogMessage": "2건의 예상비용을 삭제하시겠습니까?",
"confirmButtonVisible": true,
"cancelButtonVisible": true
}
},
{
"id": "step-32",
"name": "일괄삭제 취소",
"description": "취소 버튼 클릭하여 삭제 취소 (워크플로우 분기 테스트)",
"actions": [
{
"type": "click",
"target": "취소 버튼"
}
],
"expected": {
"dialogClosed": true,
"dataPreserved": true,
"selectedItemsStillChecked": true
}
},
{
"id": "step-33",
"name": "일괄삭제 재시도",
"description": "일괄삭제 버튼 다시 클릭",
"actions": [
{
"type": "click",
"target": "일괄삭제 버튼"
},
{
"type": "wait",
"target": "확인 다이얼로그 표시"
}
],
"expected": {
"dialogVisible": true
}
},
{
"id": "step-34",
"name": "일괄삭제 확인",
"description": "확인 버튼 클릭하여 2건 일괄 삭제 실행",
"actions": [
{
"type": "click",
"target": "확인 버튼"
},
{
"type": "wait",
"target": "삭제 처리 완료"
}
],
"expected": {
"apiCall": "DELETE /api/accounting/expected-expenses/bulk",
"apiResponse": "200 OK",
"successToast": "2건이 삭제되었습니다",
"dialogClosed": true
}
},
{
"id": "step-35",
"name": "일괄삭제 결과 확인",
"description": "테이블에서 삭제된 데이터가 사라졌는지 확인",
"actions": [
{
"type": "wait",
"target": "테이블 리로드"
},
{
"type": "verify",
"target": "삭제된 행 부재"
}
],
"expected": {
"deletedRowsGone": true,
"tableUpdated": true,
"selectedItemsCleared": true
}
},
{
"id": "step-36",
"name": "단일 삭제 테스트 준비",
"description": "단일 삭제 테스트를 위해 새 데이터 1건 등록",
"actions": [
{
"type": "click",
"target": "등록 버튼"
},
{
"type": "fillForm",
"target": "등록 폼",
"data": {
"expectedPaymentDate": "2026-04-01",
"transactionType": "기타",
"amount": "1000000",
"note": "단일삭제 테스트용"
}
},
{
"type": "click",
"target": "등록 버튼 (모달 내)"
},
{
"type": "wait",
"target": "저장 완료"
}
],
"expected": {
"newRowVisible": true
}
},
{
"id": "step-37",
"name": "단일 삭제 아이콘 클릭",
"description": "방금 등록한 데이터의 삭제 아이콘 클릭",
"actions": [
{
"type": "click",
"target": "신규 등록 행의 삭제 아이콘"
},
{
"type": "wait",
"target": "확인 다이얼로그 표시"
}
],
"expected": {
"dialogTitle": "삭제 확인",
"dialogMessage": "이 예상비용을 삭제하시겠습니까?",
"confirmButtonVisible": true
}
},
{
"id": "step-38",
"name": "단일 삭제 확인",
"description": "확인 버튼 클릭하여 단일 삭제 실행",
"actions": [
{
"type": "click",
"target": "확인 버튼"
},
{
"type": "wait",
"target": "삭제 처리 완료"
}
],
"expected": {
"apiCall": "DELETE /api/accounting/expected-expenses/:id",
"apiResponse": "200 OK",
"successToast": "삭제되었습니다",
"dialogClosed": true
}
},
{
"id": "step-39",
"name": "단일 삭제 결과 확인",
"description": "테이블에서 삭제된 데이터 확인",
"actions": [
{
"type": "wait",
"target": "테이블 리로드"
},
{
"type": "verify",
"target": "삭제된 행 부재"
}
],
"expected": {
"deletedRowGone": true,
"tableUpdated": true
}
},
{
"id": "step-40",
"name": "필터 기능 테스트 - 거래유형",
"description": "거래유형 필터 선택하여 데이터 필터링 확인",
"actions": [
{
"type": "click",
"target": "거래유형 필터"
},
{
"type": "select",
"target": "옵션",
"value": "매입"
},
{
"type": "wait",
"target": "데이터 필터링"
}
],
"expected": {
"filteredData": "매입 거래유형만 표시",
"tableUpdated": true
}
},
{
"id": "step-41",
"name": "필터 기능 테스트 - 지급상태",
"description": "지급상태 필터 선택하여 데이터 필터링 확인",
"actions": [
{
"type": "click",
"target": "지급상태 필터"
},
{
"type": "select",
"target": "옵션",
"value": "미지급"
},
{
"type": "wait",
"target": "데이터 필터링"
}
],
"expected": {
"filteredData": "미지급 상태만 표시",
"tableUpdated": true
}
},
{
"id": "step-42",
"name": "필터 초기화",
"description": "필터를 '전체'로 변경하여 초기화",
"actions": [
{
"type": "click",
"target": "거래유형 필터"
},
{
"type": "select",
"target": "전체"
},
{
"type": "click",
"target": "지급상태 필터"
},
{
"type": "select",
"target": "전체"
}
],
"expected": {
"allDataVisible": true,
"filtersCleared": true
}
}
],
"cleanup": {
"description": "테스트 후 생성된 테스트 데이터 정리 (필요시)",
"actions": []
},
"notes": [
"2년 기간 설정으로 충분한 데이터 범위 확보",
"등록 모달의 모든 입력 필드 (datepicker, select, combobox, input, textarea) 테스트 필수",
"수정 모달의 기존 데이터 프리필 확인 필수",
"일괄 작업 (예상 지급일 변경, 전자결재, 일괄삭제) 모두 테스트",
"워크플로우 분기: 삭제 취소 → 재시도 → 확인 패턴 검증",
"단일 삭제와 일괄삭제 모두 테스트",
"필터 기능 (거래유형, 지급상태) 동작 확인",
"전자결재 기능은 API 미구현 가능성 있음 (404 에러 예상)"
],
"expectedAPIs": [
"GET /api/accounting/expected-expenses - 목록 조회",
"POST /api/accounting/expected-expenses - 등록",
"PUT /api/accounting/expected-expenses/:id - 수정",
"DELETE /api/accounting/expected-expenses/:id - 단일 삭제",
"DELETE /api/accounting/expected-expenses/bulk - 일괄 삭제",
"PUT /api/accounting/expected-expenses/bulk-update-date - 예상 지급일 일괄 변경",
"POST /api/accounting/expected-expenses/approval - 전자결재 신청",
"GET /api/clients - 거래처 목록",
"GET /api/bank-accounts - 계좌 목록"
]
}