# InsuRo MediScan: PR 머지 + 서버 배포 + E2E 테스트

## 작업 레벨: Lv.2

## 배경
task-2170에서 InsuRo 서버의 mediscan_router.py 순환참조를 수정하고 DB 마이그레이션을 완료했으나, worktree 코드가 main에 아직 머지 안 됨. 머지 후 프로덕션 서버 배포 + 실제 PDF로 E2E 테스트 필요.

## 작업 순서 (반드시 순차)

### Step 1: task-2170 PR 머지
- worktree: `/home/jay/projects/InsuRo/.worktrees/task-2170-dev4`
- 확인: PR이 이미 생성되어 있는지 → 없으면 생성 후 머지
- 머지 후 worktree 정리

### Step 2: 프로덕션 서버 배포
- InsuRo 서버 재시작 (main 브랜치 최신 코드)
```bash
cd /home/jay/projects/InsuRo/server
# 기존 서버 프로세스 종료
pkill -f "uvicorn.*main:app" || true
# 최신 코드로 서버 시작
nohup python3 -m uvicorn main:app --host 0.0.0.0 --port 8001 --reload &
```
- 헬스체크: `curl http://localhost:8001/api/status` → 200
- MediScan 라우터 확인: `curl http://localhost:8001/api/mediscan/history` → 401 (인증 차단 확인)

### Step 3: E2E 통합 테스트

실제 PDF 5종으로 전체 파이프라인 테스트:

**테스트 PDF 위치**: `/home/jay/projects/MediScan/docs/samples/`
- 세부진료정보.pdf
- 처방조제정보.pdf
- 자동차사고기본진료정보.pdf
- 자동차사고세부진료정보.pdf
- 건강검진결과.pdf

**E2E 테스트 스크립트** 작성 (`/home/jay/projects/MediScan/tests/test_e2e_pipeline.py`):

```python
"""전체 파이프라인 E2E 테스트: PDF → 파싱 → 분석 → 리포트"""

def test_full_pipeline():
    # 1. PDF 5종 파싱
    from src.parsers import parse_pdf, detect_pdf_type
    results = []
    for pdf_path in PDF_FILES:
        pdf_type = detect_pdf_type(pdf_path)
        parsed = parse_pdf(pdf_path)
        results.append(parsed)
        assert len(parsed.records) > 0  # 레코드 추출 확인
    
    # 2. 분석 엔진 실행 (표준체 + 간편심사)
    from src.analysis import MediScanEngine
    engine = MediScanEngine()
    report = engine.analyze(results, mode="both")
    
    # 3. 고지의무 항목 존재 확인
    assert report is not None
    assert len(report.obligations_3month) >= 0
    assert len(report.obligations_1year) >= 0
    assert len(report.obligations_5year) >= 0
    
    # 4. 간편심사 결과 확인
    assert report.simplified_results is not None
    assert len(report.simplified_results) == 10  # 10개 보험사
    
    # 5. HTML 리포트 생성
    from src.report import HtmlReportGenerator
    gen = HtmlReportGenerator()
    html = gen.generate(report)
    assert len(html) > 100
    assert "<html" in html.lower()
    
    # 6. 고지양식 생성
    from src.report import DisclosureFormGenerator
    form_gen = DisclosureFormGenerator()
    disclosure = form_gen.generate(report)
    assert len(disclosure) > 0

def test_simplified_insurer_differences():
    """보험사별 간편심사 차이 확인"""
    # DB손보: Q2에 7일 치료 포함
    # 현대해상: 6대 질병
    # KB: 7대 질병 (만성신장)
    pass  # 구체적 케이스는 파싱 데이터에 따라
```

### Step 4: 결과 보고
- E2E 테스트 통과 여부
- HTML 리포트 샘플 저장 경로
- 발견된 이슈

## 검증 시나리오
1. 서버 재시작 후 /api/status → 200
2. /api/mediscan/history (미인증) → 401
3. PDF 5종 파싱 → 전체 레코드 추출 성공
4. 분석 엔진 mode="both" → 표준체 + 간편심사 결과 모두 반환
5. HTML 리포트 생성 → 파일 크기 > 0
6. 고지양식 텍스트 생성 → 내용 존재

## 주의사항
- ★ PDF 파일 git 커밋 금지
- 서버 재시작 시 기존 InsuRo 기능 영향 확인
- E2E 테스트 결과에 개인정보 포함 주의 (로그에 마스킹)

## 참고
- task-2170 보고서: `/home/jay/workspace/memory/reports/task-2170.md`
- MediScan 코드: `/home/jay/projects/MediScan/src/`
- InsuRo 서버: `/home/jay/projects/InsuRo/server/`
- PDF 샘플: `/home/jay/projects/MediScan/docs/samples/`

## goal_assertions (auto-generated)
- `curl http://localhost:8001/api/status`
- `curl http://localhost:8001/api/mediscan/history`
