"""tests/regression/test_browser_verify_hardening.py — task-2485 회귀.

browser_verify가 task-N+M 형식을 잘못된 task_id로 거부하지 않는지 검증.
shared + dev1 두 모듈 모두 검증.
"""
from __future__ import annotations

import importlib.util
import sys
from pathlib import Path

import pytest

WORKSPACE = Path(__file__).resolve().parents[2]

# 워크트리/메인 어느 환경이든 자신의 워크스페이스 루트가 utils 검색 시 우선되도록 처리.
if str(WORKSPACE) in sys.path:
    sys.path.remove(str(WORKSPACE))
sys.path.insert(0, str(WORKSPACE))


def _load_module(modname: str, file_path: Path):
    if not file_path.exists():
        pytest.skip(f"{file_path} 없음")
    spec = importlib.util.spec_from_file_location(modname, str(file_path))
    assert spec is not None and spec.loader is not None
    mod = importlib.util.module_from_spec(spec)
    sys.modules[spec.name] = mod
    spec.loader.exec_module(mod)
    return mod


@pytest.fixture(scope="module")
def shared_browser_verify():
    return _load_module(
        "bv_shared_t2485",
        WORKSPACE / "teams" / "shared" / "verifiers" / "browser_verify.py",
    )


@pytest.fixture(scope="module")
def dev1_browser_verify():
    return _load_module(
        "bv_dev1_t2485",
        WORKSPACE / "teams" / "dev1" / "qc" / "verifiers" / "browser_verify.py",
    )


@pytest.mark.parametrize("tid", ["task-2472+2", "task-2472+1", "task-2467+3"])
def test_shared_browser_verify_accepts_retry_suffix(shared_browser_verify, tid, tmp_path):
    """task-N+M 형식이 '잘못된 task_id 형식'으로 거부되지 않음."""
    result = shared_browser_verify.verify(tid, str(tmp_path))
    # task 파일이 없는 환경이므로 SKIP 또는 FAIL 가능
    # 단, '잘못된 task_id 형식' 사유로 FAIL이면 안 됨
    if result["status"] == "FAIL":
        for d in result["details"]:
            assert "잘못된 task_id 형식" not in d, f"{tid} 거부됨: {d}"


@pytest.mark.parametrize("tid", ["task-2472+2", "task-2472+1", "task-2467+3"])
def test_dev1_browser_verify_accepts_retry_suffix(dev1_browser_verify, tid, tmp_path):
    result = dev1_browser_verify.verify(tid, str(tmp_path))
    if result["status"] == "FAIL":
        for d in result["details"]:
            assert "잘못된 task_id 형식" not in d, f"{tid} 거부됨: {d}"


@pytest.mark.parametrize("tid", ["task-abc", "task-2472+", "task-2472++1", "../etc"])
def test_shared_browser_verify_rejects_invalid(shared_browser_verify, tid, tmp_path):
    result = shared_browser_verify.verify(tid, str(tmp_path))
    assert result["status"] == "FAIL"
    assert any("잘못된 task_id 형식" in d for d in result["details"])


@pytest.mark.parametrize("tid", ["task-abc", "task-2472+", "task-2472++1", "../etc"])
def test_dev1_browser_verify_rejects_invalid(dev1_browser_verify, tid, tmp_path):
    result = dev1_browser_verify.verify(tid, str(tmp_path))
    assert result["status"] == "FAIL"
    assert any("잘못된 task_id 형식" in d for d in result["details"])
