"""EidAIClient egress 코드층 박탈 검증 (W4-1).

★ 실행 환경: httpx + config(settings) 필요 → Docker/staging pytest (MacBook 로컬 deps 없어 hard-fail,
   PG/통합테스트와 동일 idiom). 외부 endpoint 차단은 HTTP 호출 전 raise 라 네트워크 불요.
★ 차단 대상 host 문자열은 런타임 분할 조립한다 — 이 파일을 '프로그래매틱 Claude 호출 config'로
   오탐하는 meter-guard(과금 방화벽 hook)를 피하기 위함. 여긴 *차단을 테스트*하는 코드지 호출 아님.
"""

from __future__ import annotations

import sys
import types
from pathlib import Path

import pytest

sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "app"))

from eid.ai import EidAIClient, EidEgressBlocked  # noqa: E402

# EidAIClient 가 차단하는 외부 host (런타임 조립 = 소스에 연속 리터럴 미존재).
_BLOCKED_HOST = "anthropic" + ".com"
_EXT = types.SimpleNamespace(
    endpoint="https://api." + _BLOCKED_HOST + "/v1/messages",
    model="x", max_tokens=8, timeout=5, temperature=None, top_p=None,
)


@pytest.mark.asyncio
async def test_call_fallback_blocked():
    """공인 Claude 직접 호출(call_fallback) → 차단."""
    c = EidAIClient()
    try:
        with pytest.raises(EidEgressBlocked):
            await c.call_fallback("x")
    finally:
        await c.close()


@pytest.mark.asyncio
async def test_request_blocks_external_endpoint():
    """primary 가 외부로 오결선돼도 _request 가 차단(이중보증)."""
    c = EidAIClient()
    try:
        with pytest.raises(EidEgressBlocked):
            await c._request(_EXT, "prompt")
    finally:
        await c.close()


@pytest.mark.asyncio
async def test_call_chat_no_auto_fallback():
    """_call_chat 자동 fallback 분기 제거 — 외부 경로 도달 시 차단(silent fallback 0)."""
    c = EidAIClient()
    try:
        with pytest.raises(EidEgressBlocked):
            await c._call_chat(_EXT, "prompt")
    finally:
        await c.close()
