#!/usr/bin/env python3
"""
test_l1_smoketest_check.py — l1_smoketest_check.py의 verify 함수 단위 테스트.

6개 시나리오:
1. 보고서 파일 없음 → SKIP
2. 보고서에 L1 섹션 없음 → FAIL
3. L1 섹션 있고 "해당없음" 3줄 이상 → PASS (CLI/스크립트 작업)
4. L1 섹션 있고 "성공" 키워드 → PASS
5. L1 섹션 있고 "실패" 키워드 → PASS (실패도 결과 보고임)
6. L1 섹션 있으나 결과 키워드 없음 → FAIL
"""

import importlib.util
from pathlib import Path

# l1_smoketest_check.py를 직접 로드 (패키지 __init__ 부작용 회피)
_MODULE_PATH = Path(__file__).parent.parent / "l1_smoketest_check.py"
_spec = importlib.util.spec_from_file_location("l1_smoketest_check", _MODULE_PATH)
assert _spec is not None and _spec.loader is not None
_module = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(_module)  # type: ignore[union-attr]

verify = _module.verify

TASK_ID = "task-test-9999"


def _write_report(tmp_path: Path, content: str) -> None:
    """tmp_path/memory/reports/{TASK_ID}.md 에 content를 기록."""
    report_dir = tmp_path / "memory" / "reports"
    report_dir.mkdir(parents=True, exist_ok=True)
    (report_dir / f"{TASK_ID}.md").write_text(content, encoding="utf-8")


# ---------------------------------------------------------------------------
# 시나리오 1: 보고서 파일 없음 → SKIP
# ---------------------------------------------------------------------------


def test_no_report_file_returns_skip(tmp_path):
    """보고서 파일 자체가 없으면 SKIP을 반환해야 한다."""
    result = verify(TASK_ID, workspace_root=str(tmp_path))
    assert result["status"] == "SKIP"
    assert result["details"]  # 최소 1개 이상의 안내 메시지


# ---------------------------------------------------------------------------
# 시나리오 2: 보고서에 L1 섹션 없음 → FAIL
# ---------------------------------------------------------------------------


def test_no_l1_section_returns_warn(tmp_path):
    """보고서 파일은 있으나 L1 스모크테스트 섹션이 없으면 FAIL을 반환해야 한다."""
    content = """\
## 작업 개요

이 작업은 간단한 리팩토링입니다.

## 변경 내역

- 일부 코드 정리
"""
    _write_report(tmp_path, content)
    result = verify(TASK_ID, workspace_root=str(tmp_path))
    assert result["status"] == "FAIL"


# ---------------------------------------------------------------------------
# 시나리오 3: L1 섹션 있고 "해당없음" 3줄 이상 → PASS (CLI/스크립트 작업)
# ---------------------------------------------------------------------------


def test_l1_section_three_naexclusions_returns_pass(tmp_path):
    """L1 섹션에 '해당없음'이 3줄 이상이면 CLI/스크립트 작업으로 PASS."""
    content = """\
## 작업 개요

쉘 스크립트 수정 작업입니다.

## L1 스모크테스트 결과

- 서버 재시작: 해당없음 (shell 스크립트 수정, 서버 코드 아님)
- API 응답 확인: 해당없음
- 스크린샷: 해당없음
"""
    _write_report(tmp_path, content)
    result = verify(TASK_ID, workspace_root=str(tmp_path))
    assert result["status"] == "PASS"


# ---------------------------------------------------------------------------
# 시나리오 4: L1 섹션 있고 "성공" 키워드 → PASS
# ---------------------------------------------------------------------------


def test_l1_section_with_success_keyword_returns_pass(tmp_path):
    """L1 섹션에 '성공' 키워드가 있으면 PASS."""
    content = """\
## 기능 구현

새 API 엔드포인트를 추가했습니다.

## L1 스모크테스트 결과

- 서버 재시작 후 API 호출 성공
- 응답 코드 200 반환 확인
"""
    _write_report(tmp_path, content)
    result = verify(TASK_ID, workspace_root=str(tmp_path))
    assert result["status"] == "PASS"


# ---------------------------------------------------------------------------
# 시나리오 5: L1 섹션 있고 "실패" 키워드 → PASS (실패도 결과 보고임)
# ---------------------------------------------------------------------------


def test_l1_section_with_failure_keyword_returns_pass(tmp_path):
    """L1 섹션에 '실패' 키워드가 있어도 PASS (결과를 보고했으므로)."""
    content = """\
## 버그 수정

인증 로직을 수정했습니다.

## L1 스모크테스트 결과

- 서버 재시작 후 로그인 실패 케이스 테스트
- 잘못된 토큰에 대해 401 반환 확인
"""
    _write_report(tmp_path, content)
    result = verify(TASK_ID, workspace_root=str(tmp_path))
    assert result["status"] == "PASS"


# ---------------------------------------------------------------------------
# 시나리오 6: L1 섹션 있으나 결과 키워드 없음 → FAIL
# ---------------------------------------------------------------------------


def test_l1_section_without_result_keywords_returns_warn(tmp_path):
    """L1 섹션이 있으나 결과 키워드('성공','실패','확인','PASS','OK')가 없으면 FAIL."""
    content = """\
## 리팩토링

코드 구조를 개선했습니다.

## L1 스모크테스트 결과

- 테스트 예정
- 추후 진행
"""
    _write_report(tmp_path, content)
    result = verify(TASK_ID, workspace_root=str(tmp_path))
    assert result["status"] == "FAIL"
