"""
test_dispatch_insuro_reload.py

_is_insuro_server_change 헬퍼 단위 테스트 (task-2339).

dispatch.py가 affected_files 중 InsuRo FastAPI 서버 코드 변경을 감지하면
PR 머지 후 systemd reload 안내를 task 프롬프트에 자동 삽입한다.
"""

import sys
from pathlib import Path

_WORKSPACE = Path(__file__).parent.parent
sys.path.insert(0, str(_WORKSPACE))

from dispatch import _is_insuro_server_change


def test_empty_list_returns_false():
    assert _is_insuro_server_change([]) is False


def test_none_or_falsy_returns_false():
    assert _is_insuro_server_change(None) is False  # type: ignore[arg-type]


def test_server_main_py_substring_match():
    assert _is_insuro_server_change(["server/main.py"]) is True


def test_server_subpath_prefix_match():
    assert _is_insuro_server_change(["server/routes/composite.py"]) is True


def test_absolute_insuro_server_path_match():
    assert _is_insuro_server_change(
        ["/home/jay/projects/InsuRo/server/main.py"]
    ) is True


def test_absolute_insuro_server_subpath_match():
    assert _is_insuro_server_change(
        ["/home/jay/projects/InsuRo/server/routes/auth.py"]
    ) is True


def test_frontend_only_returns_false():
    assert _is_insuro_server_change(
        [
            "src/components/ExtensionVersionToast.tsx",
            "src/pages/CompositeDesign.tsx",
        ]
    ) is False


def test_workspace_dispatch_only_returns_false():
    assert _is_insuro_server_change(["dispatch.py", "utils/logger.py"]) is False


def test_mixed_with_server_returns_true():
    assert _is_insuro_server_change(
        [
            "src/components/ExtensionVersionToast.tsx",
            "server/main.py",
        ]
    ) is True


def test_other_project_server_dir_returns_true():
    """server/로 시작하는 모든 항목은 True (현재 정책: InsuRo 외 server/ 디렉토리도 매치).

    이는 의도적이다 — InsuRo가 현재 유일한 ``server/`` 디렉토리 사용자이며,
    잘못된 false negative를 줄이기 위해 prefix 매칭을 채택했다.
    다른 프로젝트가 server/를 도입하면 매칭 규칙을 좁혀야 한다.
    """
    assert _is_insuro_server_change(["server/foo.py"]) is True


def test_server_substring_in_middle_does_not_match():
    """단순히 'server' 단어가 들어있다고 매치되지 않아야 함."""
    assert _is_insuro_server_change(["src/lib/server-utils.ts"]) is False
    assert _is_insuro_server_change(["docs/server-deployment.md"]) is False
