# PRD — Test Plan
## 1. 테스트 목표
- 날짜(수정/생성) 범위 필터가 정확히 동작한다.
- 루트 경계/경로 정규화가 우회되지 않는다.
- 결과 스키마(structuredContent)가 계약에 맞는다.
- 페이지네이션이 중복/누락 없이 동작한다.
## 2. 테스트 데이터 준비
- 테스트 루트 폴더를 만들고 다음을 포함한다:
- 서로 다른 mtime을 가진 파일 N개
- 서로 다른 생성 시간을 가진 파일 N개(Windows에서 생성 시간을 제어하기 어렵다면, “생성 후 대기/복사/툴 사용” 등으로 케이스를 만든다)
- 디렉터리 포함 케이스
- 숨김 파일/시스템 파일(가능한 경우)
- 심볼릭 링크/리파스 포인트(가능한 경우)
## 3. 테스트 케이스
### 3.1 기본 동작
- TC-01: `timeField=modified`, `from/to` 없이 전체 검색이 동작
- TC-02: `timeField=modified`, `from`만 지정(inclusive)
- TC-03: `timeField=modified`, `to`만 지정(exclusive)
- TC-04: `timeField=modified`, `from < to` 범위에서 정확히 필터
- TC-05: `timeField=created` 기본 검색(Windows)
### 3.2 경계 조건
- TC-10: `from == to`일 때 **성공(`isError=false`)** 이며 결과 0개(`matches=[]`, `nextCursor=null`)
- TC-11: `from > to`일 때 `isError=true`로 유효성 에러
- TC-12: `limit=1`에서 `nextCursor`가 세팅되고 다음 페이지 호출 시 2번째 항목이 나옴
- TC-13: `sort=time_asc`와 `sort=time_desc`의 역순 관계 확인
### 3.3 필터
- TC-20: `glob=**/*.md`가 md만 반환
- TC-21: `includeDirectories=true`에서 디렉터리 포함
- TC-22: `recursive=false`에서 1레벨만
- TC-23: `recursive=true`, `maxDepth=0`에서 **시작 경로 자체만**
- 시작 경로가 디렉터리이면: 하위 항목은 반환되지 않음. `includeDirectories=true`일 때만 그 디렉터리 1개가 결과에 포함될 수 있음
- 시작 경로가 파일이면: `includeFiles=true`일 때만 그 파일 1개가 결과에 포함될 수 있음
### 3.4 보안
- TC-30: `path=..` 또는 `path`에 traversal 시도 → 반드시 거부(**tool 실행 에러: `isError=true`**, ErrorCode 권장: `PathTraversalDetected`)
- TC-31: 허용 루트 밖 `root` 지정 → 반드시 거부(**tool 실행 에러: `isError=true`**, ErrorCode 권장: `RootNotAllowed`)
- TC-32: symlink/reparse point를 통해 루트 밖으로 나가는 케이스 → 반드시 거부(**tool 실행 에러: `isError=true`**, ErrorCode 권장: `SymlinkEscapeDetected`)
### 3.5 스키마/호환
- TC-40: 성공 결과에 `structuredContent` 포함 + `content` 텍스트 포함
- TC-41: `createdAt` 미지원 항목 처리(`includeUnknownTime` 정책 확인)
## 4. 수용 기준 재확인
- PRD 본문(수용 기준 AC-01~AC-06)을 모두 만족해야 한다.