# 테스트 시나리오

**버전** 0.1 (2026-08-12) · **상태** 개발 착수용 초안

**위험 기반으로 쓴다.** 정상 경로("휴가 하나가 캘린더에 생긴다")보다 아래가 훨씬 중요하다 —
이 연동에서 사고는 **지우는 쪽**과 **권한 경계**에서 난다.

기대값의 근거는 사이트의 **인수 기준점**(`/baseline`)에서 내려받는다. 같은 기간·같은 설정으로
뽑은 JSON과 API 응답을 대조하는 것이 판정의 기본이다.

---

## 0. 표 읽는 법

| 칸 | 뜻 |
|---|---|
| 위험 | 실패했을 때 무슨 일이 벌어지나 |
| 전제 | 시험 전에 만들어 둘 상태 |
| 기대 | 이것과 다르면 실패 |

**우선순위 P1**은 이것이 깨지면 운영에 올릴 수 없다는 뜻이다.

---

## 1. 권한 경계 — P1

### T-A-01 · 권한 밖 직원은 나오지 않는다
- **위험** 권한 밖 조직의 인사정보 유출
- **전제** 연동 계정의 조직조회권한을 일부 조직으로 제한. 권한 밖 조직에 휴가 데이터 존재
- **절차** 범위를 「전사」로 두고 조회
- **기대** 권한 밖 직원의 건이 **0건**. 화면에서 전사를 골라도 마찬가지

### T-A-02 · 요청 조직은 좁히기만 한다
- **전제** 권한이 A조직. 요청 `orgCd`에 권한 밖 B조직을 넣는다
- **기대** B조직 건이 나오지 않는다. 오류가 아니라 **빈 결과**여도 된다

### T-A-03 · 하위조직은 포함하지 않는다
- **위험** 의도보다 넓은 범위가 조용히 나감
- **전제** 상위조직 X 아래 하위조직 Y. 양쪽에 휴가 데이터
- **절차** `orgCd = X`로 조회
- **기대** X에 **직접 속한** 직원만. Y 소속은 없다

### T-A-04 · `inclOrgYn`을 보내도 무시된다
- **절차** 요청에 `inclOrgYn: "Y"`를 임의로 넣어 호출
- **기대** T-A-03과 동일한 결과. 파라미터가 존재하지 않으므로 범위가 넓어지지 않는다

---

## 2. 상태 필터 — P1

### T-B-01 · 기본은 결재완료만
- **절차** `reqStatusCds` 생략하고 호출
- **기대** 상태 30만. **20이 섞여 나오면 실패**

### T-B-02 · 결재중 포함은 켰을 때만
- **절차** `reqStatusCds = "20,30"`
- **기대** 20·30이 나오고, 20의 제목에 `[진행중]`이 붙는다

### T-B-03 · 임시저장·반려는 어떤 경우에도 안 나온다
- **절차** `reqStatusCds = "10,20,30,40"`을 억지로 넣어 호출
- **기대** 10·40 건은 나오지 않거나, 나온다면 **연동이 걸러 캘린더에 만들지 않는다**
  (어느 쪽으로 막을지는 구현 선택이나, 결과는 같아야 한다)

---

## 3. 취소 — P1

### T-C-01 · 취소승인되면 캘린더에서 사라진다
- **전제** 결재완료 휴가가 캘린더에 있다. 그 건에 대한 취소신청을 **승인**한다
- **기대** 원건 상태가 40이 되어 응답에서 빠지고, 다음 동기화에서 **이벤트가 삭제**된다

### T-C-02 · 취소신청이 결재중이면 그대로 남는다
- **전제** 취소신청을 냈으나 아직 결재중(20)
- **기대** 원건은 30 그대로이므로 **이벤트가 남아 있다.** 별도 표시를 붙이지 않는다
- **비고** 담당자 문의가 예상되는 지점이라 안내에 적어 두었다

### T-C-03 · 취소신청 자체가 새 일정이 되지 않는다
- **위험** "취소했더니 일정이 하나 더 생겼다"
- **전제** 취소신청이 결재를 도는 중
- **기대** 캘린더에 **새 이벤트가 생기지 않는다**(취소는 `EAPT_CANCL_REQ`에 따로 쌓인다)

### T-C-04 · 취소 후 재신청은 별개 이벤트
- **전제** 취소승인 후 같은 날짜로 새로 신청·승인
- **기대** 새 신청번호의 **새 이벤트**가 생긴다. 옛 이벤트는 삭제되어 있다

---

## 4. 옵션 1426 — P1

### T-D-01 · 미표시 코드는 응답에 아예 없다
- **전제** `CNFG_VAL01`에 코드 X 포함. X 종류 휴가 데이터 존재
- **기대** 응답에 X 건이 **없다**. 연동이 거를 기회조차 없어야 한다

### T-D-02 · 마스킹은 표시명으로 바뀐다
- **전제** `CNFG_VAL02`에 코드 Y, `CNFG_VAL03`에 표시명 지정
- **기대** `MASK_YN='Y'`, `MASK_NM`이 응답에 실려 오고, 이벤트 제목이 **표시명**으로 나간다.
  원래 종류 이름이 제목에 남아 있으면 실패

### T-D-03 · 나중에 미표시로 바꾸면 이미 나간 일정도 사라진다
- **전제** 코드 Z 휴가가 이미 캘린더에 있다. 이후 `CNFG_VAL01`에 Z 추가
- **기대** 다음 동기화에서 Z 이벤트가 **삭제**된다(따로 찾아 지우는 코드 없이 대조로 정리)

### T-D-04 · 표시명이 비었을 때
- **전제** `CNFG_VAL02`에 코드는 있으나 `CNFG_VAL03`이 비어 있다
- **기대** **O-01에서 정한 대체 문구**로 나간다. 빈 제목·`undefined`·원래 종류명이면 실패

---

## 5. 기간 — P1

### T-E-01 · 달을 걸친 휴가가 빠지지 않는다
- **위험** 가장 흔한 누락
- **전제** 7/29~8/3 휴가. 조회 기간 8/1~8/31
- **기대** 이 건이 **포함**된다(시작일만 보면 빠진다)

### T-E-02 · 종일 이벤트의 끝날짜
- **전제** 8/10 하루 휴가
- **기대** `start.date=2026-08-10`, `end.date=2026-08-11`. 캘린더 화면에 **8/10 하루**로 보인다

### T-E-03 · 기간 상한
- **절차** 401일 범위로 호출
- **기대** 오류로 거절(`retCode ≠ 0`)

---

## 6. 대조 안전장치 — P1

### T-F-01 · 정상 응답 0건에 전건 삭제하지 않는다
- **위험** **전 직원 일정 일괄 삭제**. 이 문서에서 가장 중요한 항목
- **전제** 캘린더에 이벤트 100건. 연동 계정의 조직조회권한을 회수해 응답이 정상 0건이 되게 한다
- **기대** **아무것도 지우지 않고 중단**하고 담당자에게 통지한다. 한 건이라도 지워지면 실패

### T-F-02 · 조회 실패 시 무동작
- **절차** API가 `retCode ≠ 0` 또는 타임아웃
- **기대** 생성·수정·삭제 **0건**. 캘린더 상태가 그대로

### T-F-03 · 표식 없는 이벤트는 건드리지 않는다
- **전제** 같은 캘린더에 사람이 손으로 만든 일정 존재
- **기대** 동기화 후에도 그 일정이 **그대로** 있다

### T-F-04 · 기간 창 밖은 건드리지 않는다
- **위험** 창이 하루 움직이며 과거 일정을 지운다
- **전제** 과거 창 경계 직전에 이벤트가 있다. 날짜를 하루 넘겨 재실행
- **기대** 창 밖으로 빠진 과거 이벤트가 **삭제되지 않는다**

### T-F-05 · 삭제 임계 초과 시 중단
- **전제** 삭제 예정이 전체의 임계(기본 30%)를 넘도록 데이터를 만든다
- **기대** 중단·통지. **부분 삭제도 하지 않는다**

---

## 7. 멱등과 갱신 — P2

### T-G-01 · 두 번 돌려도 중복이 없다
- **절차** 같은 조건으로 동기화 2회 연속
- **기대** 2회차 생성 0건. 이벤트 총수 변화 없음

### T-G-02 · 결재중 → 완료 시 제목만 바뀐다
- **전제** 20 상태로 만든 이벤트. 이후 승인되어 30
- **기대** **같은 이벤트가 수정**되어 `[진행중]`이 사라진다. 삭제 후 재생성이면 실패
  (직원이 건 알림이 사라진다)

### T-G-03 · 회차가 겹쳐 돌지 않는다
- **절차** 동기화 실행 중 같은 연동함으로 한 번 더 실행
- **기대** 두 번째는 잠금에 막혀 대기하거나 건너뛴다

---

## 8. 갈래 — P2

### T-H-01 · 조퇴/외출·경조휴가도 나간다
- **전제** 조퇴/외출(1122)·경조휴가(1123) 데이터 존재
- **기대** 둘 다 캘린더에 나간다(1426 미표시 대상이 아닌 한)

### T-H-02 · 근무일정은 나가지 않는다
- **전제** 근무일정 데이터 존재
- **기대** 응답과 캘린더 어디에도 없다

### T-H-03 · 교육 두 갈래가 모두 나온다
- **전제** `EDUT_REQ`·`EDUT_HST2` 양쪽에 데이터
- **기대** 둘 다 나오고 **과정명이 제목에 제대로** 들어간다(공통코드가 아니라 자유 문자열)

### T-H-04 · 교육계획신청은 나오지 않는다
- **전제** `EDUT_PLAN_REQ` 데이터 존재
- **기대** 나오지 않는다(날짜가 없다)

---

## 9. 온보딩 화면 — P3

### T-I-01 · 개인 지메일이면 도메인 위임을 고를 수 없다
### T-I-02 · 계정 종류를 바꾸면 불가능해진 방식이 비워진다
### T-I-03 · 공유 방법 미선택이면 「막는 것」에 뜬다
### T-I-04 · 공유 방법에 따라 4단계 안내와 공지문이 바뀐다

---

## 10. 회귀 — 인수 판정

### T-Z-01 · 기준점 대조
- **절차** 사이트 `/baseline`에서 기대값 JSON을 받고, **같은 날·같은 설정**으로 API를 호출
- **기대** 건수·`title`·`masked`·기간이 **모두 일치**
- **비고** 기간 창이 오늘 기준으로 다시 계산되므로 같은 날 뽑은 것끼리 비교한다.
  이 시험이 통과하면 1~5장 대부분이 함께 검증된다
