### 테스트 함수
| 함수 | API 엔드포인트 | 테스트 항목 |
|------|---------------|------------|
| [`histLoad()`](src/Web/wwwroot/js/app.js:717) | GET `/api/history/tagnames` | 1. 태그 이름 목록 로드<br>2. 8개 선택란 드롭다운 채움<br>3. 기존 선택값 보존 |
| [`histQuery()`](src/Web/wwwroot/js/app.js:757) | GET `/api/history/query` 또는 POST `/api/text-to-sql/query-history-interval` | 1. 단일 태그 조회<br>2. 다중 태그 조회<br>3. 기본 간격(5분) 처리<br>4. 1분 강제 처리<br>5. 사용자 간격(1시간, 1일 등) 처리<br>6. 시간 범위 필터<br>7. limit 파라미터<br>8. 테이블 렌더링 |
| [`histReset()`](src/Web/wwwroot/js/app.js:902) | - | 1. 모든 태그 선택 초기화<br>2. 시간 필드 초기화<br>3. 간격 및 limit 기본값 복구<br>4. 결과 숨김 |
| [`htLoadStatus()`](src/Web/wwwroot/js/app.js:922) | GET `/api/experion/hypertable/status` | 1. 하이퍼테이블 존재 여부 확인<br>2. 레코드 개수 표시<br>3. 보관 정책 확인<br>4. 압축 상태 확인<br>5. 연속 집계 상태 확인 |
| [`htCreate()`](src/Web/wwwroot/js/app.js:973) | POST `/api/experion/hypertable/create` | 1. 기본값으로 생성<br>2. 보관 정책 활성화<br>3. 압축 활성화<br>4. 연속 집계 생성<br>5. 데이터 마이그레이션<br>6. 기존 테이블이 있을 때 처리 |
| [`htToggleRetention()`](src/Web/wwwroot/js/app.js:1055) | - | 1. 체크박스 상태 확인<br>2. 상태 메시지 변경 |
| [`htToggleCompression()`](src/Web/wwwroot/js/app.js:1064) | - | 1. 체크박스 상태 확인<br>2. 상태 메시지 변경 |

### 테스트 시나리오
1. **태그 불러오기**: 태그 선택 버튼 → 8개 드롭다운 채움
2. **기본 조회**: 1개 태그, 간격=5분 → 기본 API 호출 확인
3. **다중 태그 조회**: 2개 태그 → OR 쿼리 확인
4. **1분 간격**: `#hf-interval` = 1 minute → HistoryIntervalRowDto 처리
5. **사용자 간격**: `#hf-interval` = 1 hour → Text-to-SQL API 호출 확인
6. **테이블 렌더링**: 결과 데이터 → timeBucket 또는 recordedAt 열 사용
7. **하이퍼테이블 상태**: 상태 버튼 → 현재 테이블 구조 표시
8. **하이퍼테이블 생성**: 하이퍼테이블이 없을 때 생성 확인
9. **보관 정책 설정**: 체크박스 → RetentionPolicy 확인
10. **압축 설정**: 체크박스 → Compression 확인
11. **초기화**: 초기화 버튼 → 모든 필드 초기화 확인

### 하이퍼테이블 하위 테스트
#### htLoadStatus() 테스트
| 항목 | 확인 포인트 |
|------|-------------|
| 테이블 존재 | `isHypertable: true/false, tableName: string` |
| 레코드 수 | `recordCount: number` |
| 보관 정책 | `hasRetentionPolicy: true/false` |
| 압축 | `hasCompression: true/false` |
| 연속 집계 | `hasContinuousAggregate: true/false` |

#### htCreate() 테스트
| 항목 | 리턴값 |
|------|--------|
| 성공 | `{ success, message, tableName }` |
| 충돌(409) | `{ tableName }` → 테이블 이미 있음 |
| 오류(500) | `{ success, message }` → 생성 실패 |

---

## 📝 전체 테스트 목록 요약

### Phase 1 완료 항목 (1-7)
- [x] 01 인증서 관리 (cert) - 4개 함수, 4개 시나리오
- [x] 02 서버 접속 테스트 (conn) - 4개 함수, 4개 시나리오
- [x] 03 데이터 크롤링 (crawl) - 2개 함수, 5개 시나리오
- [x] 04 DB 저장 (db) - 4개 함수, 5개 시나리오
- [x] 05 노드맵 대시보드 (nm-dash) - 5개 함수, 5개 시나리오
- [x] 06 포인트빌더 (pb) - 9개 함수, 6개 시나리오

---

## 🗺️ 전체 테스트 플로우

```mermaid
flowchart TD
    A[인증서 관리 cert] --> B[서버 접속 conn]
    B --> C[데이터 크롤링 crawl]
    C --> D[DB 저장 db]
    D --> E[노드맵 대시보드 nm-dash]
    E --> F[포인트빌더 pb]
    F --> G[이력 조회 hist]
    
    subgraph Phase1 [Phase 1: UI 테스트 계획]
        A
        B
        C
        D
        E
        F
        G
    end