# messageCreate 이벤트 테스트 케이스 분석
## 정상 케이스
| # | 입력 | 기대 결과 | 충족 여부 | 설명 |
|---|------|-----------|:---------:|------|
| 1 | 일반 블로그 링크 (velog, medium) | 스레드 생성 + 아티클 요약 | ✅ | `fetchAndSummarize`로 HTML 파싱 후 요약 |
| 2 | `github.com/xxx/yyy` | 스레드 생성 + 오픈소스 설명 요약 | ✅ | 일반 URL로 처리됨. 단, GitHub README 렌더링이 아닌 HTML 파싱이므로 **요약 품질은 제한적**일 수 있음 |
| 3 | 유튜브 링크 (자막 있는 영상) | 스레드 생성 + 영상 내용 요약 | ✅ | `extractYouTubeVideoId` → `fetchAndSummarizeYouTube`로 자막 기반 요약 |
| 4 | 링크 + 텍스트 같이 올린 경우 | 링크만 감지해서 정상 처리 | ✅ | `URL_REGEX`가 첫 번째 URL만 매칭 (`match`는 첫 매칭만 반환) |
| 5 | `news.hada.io` 링크 | 아티클 요약 | ✅ | 일반 URL로 처리됨 |
---
## 엣지 케이스
| # | 입력 | 기대 결과 | 충족 여부 | 설명 |
|---|------|-----------|:---------:|------|
| 6 | 유튜브 (자막 없는 영상) | 제목 + 설명글만으로 요약 | ❌ | 자막 fetch 실패 시 `"자막을 찾을 수 없습니다..."` 에러 메시지만 반환 (74행). OG title/설명 fallback 없음 |
| 7 | 크롤링 차단 사이트 (미디엄 페이월 등) | OG 태그로 fallback 요약 | ❌ | `fetchAndSummarize`에서 빈 본문이 오면 빈 텍스트를 Claude에 보냄. OG 태그 fallback 로직 없음 |
| 8 | 로그인 필요한 링크 | "요약 불가" 안내 메시지 | ⚠️ | 로그인 페이지의 HTML이 파싱되어 **엉뚱한 요약**이 나올 가능성. 명시적 "요약 불가" 안내는 없음 |
| 9 | 링크 2개 이상 올린 경우 | 첫 번째만? 전부? 정책 결정 필요 | ⚠️ | 현재는 **첫 번째 링크만** 처리 (97행: `match`는 첫 매칭만 반환). 의도적 정책인지 불명확 |
| 10 | 봇 메시지에 링크 있는 경우 | 무시 | ✅ | 93행: `if (message.author.bot) return;` |
| 11 | 아예 죽은 링크 (404) | "접근 불가" 안내 | ⚠️ | 404도 HTTP 응답은 오므로 에러 페이지 HTML을 요약하려고 시도함. 명시적 "접근 불가" 안내 없음 |
| 12 | 링크 없는 일반 메시지 | 아무것도 안 함 | ✅ | 98행: `if (!match) return;` |
| 13 | `hamsurang.com` 링크 | 하위 스레드 파싱 후 첫 툴 요약 | ❌ | 특별 처리 없음. 일반 URL로 처리되어 단순 HTML 파싱만 수행 |
---
## 성능 케이스
| # | 입력 | 기대 결과 | 충족 여부 | 설명 |
|---|------|-----------|:---------:|------|
| 14 | 본문 엄청 긴 아티클 | 토큰 초과 없이 잘 잘려서 요약 | ✅ | 22행: `.slice(0, 8000)`으로 본문 잘라냄 |
| 15 | 동시에 링크 여러 개 올라올 때 | 각각 독립적으로 처리 | ✅ | 각 메시지마다 독립적으로 `onMessageCreate` 호출. 단, 동시성 제어(rate limit 등)는 없음 |
---
## 요약
- **충족: 1, 2, 3, 4, 5, 10, 12, 14, 15** (9개)
- **미충족: 6, 7, 13** (3개)
- **부분 충족(의도와 다를 수 있음): 8, 9, 11** (3개)
### 주요 개선 포인트
1. **#6** - 유튜브 자막 없을 때 `fetchOgTitle`은 이미 있으니, OG description도 가져와서 fallback 요약하면 됨
2. **#7** - `fetchAndSummarize`에서 본문이 비거나 너무 짧으면 OG 태그(`og:description`)로 fallback
3. **#8, #11** - HTTP 상태코드 체크 추가 (`response.ok` 확인, 4xx/5xx 시 안내 메시지)
4. **#13** - `hamsurang.com` 전용 파서 필요