"""init_db fail-fast 회귀 가드 (problems.md #2 P0/P1 fix).

이전 패턴: ``_migrations`` 루프의 ``except Exception:`` 가 silent rollback +
다음 SQL 로 진행 → schema drift 부팅에서 은폐. 새 패턴: 첫 실패 시
``logger.error`` + ``RuntimeError`` 로 부팅 abort.

본 test 는 한 SQL 이 fail 시 init_db() 가 RuntimeError 를 raise 하는지
검증 — silent skip 회귀 차단.
"""
from __future__ import annotations

import pytest


def test_init_db_fail_fast_on_migration_error(monkeypatch):
    """가짜 engine 에서 SQL execute fail 시 init_db RuntimeError raise."""
    import app.core.database as db_mod
    from sqlalchemy.exc import ProgrammingError

    class _FakeConn:
        def __enter__(self):
            return self

        def __exit__(self, *a):
            return False

        def execute(self, sql):
            # 첫 SQL 부터 실패 — fail-fast 검증
            raise ProgrammingError("stmt", {}, Exception("schema mismatch"))

        def commit(self):
            return None

        def rollback(self):
            return None

    class _FakeEngine:
        def connect(self):
            return _FakeConn()

    monkeypatch.setattr(db_mod, "engine", _FakeEngine())
    # Base.metadata.create_all 도 no-op 으로 (실 PG 의존 차단)
    monkeypatch.setattr(db_mod.Base.metadata, "create_all", lambda *a, **k: None)

    with pytest.raises(RuntimeError, match="fail-fast"):
        db_mod.init_db()


def test_init_db_fail_fast_includes_alembic_guidance(monkeypatch):
    """RuntimeError 메시지가 운영자 액션 가이드 (alembic upgrade head) 포함."""
    import app.core.database as db_mod
    from sqlalchemy.exc import ProgrammingError

    class _FakeConn:
        def __enter__(self):
            return self

        def __exit__(self, *a):
            return False

        def execute(self, sql):
            raise ProgrammingError("stmt", {}, Exception("col missing"))

        def commit(self):
            return None

        def rollback(self):
            return None

    class _FakeEngine:
        def connect(self):
            return _FakeConn()

    monkeypatch.setattr(db_mod, "engine", _FakeEngine())
    monkeypatch.setattr(db_mod.Base.metadata, "create_all", lambda *a, **k: None)

    with pytest.raises(RuntimeError) as excinfo:
        db_mod.init_db()
    msg = str(excinfo.value)
    assert "alembic upgrade head" in msg, f"missing operator guidance: {msg!r}"
