"""services 테스트 공용 기준선.

★여기 테스트들은 dispatch 를 `MagicMock` DB + mock 된 `submit_background_job`
 으로 부른다. 그 둘이 프로덕션 계약을 절반만 흉내 내기 때문에, 아무것도 안
 하면 테스트끼리 서로를 막는다. 아래 둘은 그 절반을 메운다.
"""
from __future__ import annotations

import pytest


@pytest.fixture(autouse=True)
def _clear_episode_claims():
    """에피소드 자리를 테스트마다 비운다.

    자리는 모듈 수준 dict 라 테스트 사이에 남는다. 프로덕션에서는 배치
    target 의 finally 가 놓지만(`submit_background_job` 은 `thread.start()`
    성공 시 target 실행을 보장한다), 여기서는 그 target 이 mock 이라 아예
    안 돈다. 그래서 자리가 남고 다음 테스트가 `step.already_running` 을 받는다.
    """
    from app.core import task_registry

    task_registry._episode_claims.clear()
    yield
    task_registry._episode_claims.clear()


@pytest.fixture(autouse=True)
def _no_run_cancel(monkeypatch):
    """정지 표가 안 걸린 상태를 기준선으로 못박는다.

    `MagicMock` DB 는 무엇을 물어도 truthy 한 객체를 돌려주므로,
    `read_cancel_state` 가 「정지 요청이 걸려 있다」로 읽는다. 그러면 배치가
    첫 스텝 앞에서 서고, 배치 흐름을 재는 테스트가 아무것도 안 돈 채 끝난다.
    정지를 재는 테스트는 **자기 안에서 다시 켠다.**
    """
    from app.core import run_control

    monkeypatch.setattr(
        run_control, "read_cancel_state",
        lambda *a, **k: run_control.CancelState(requested=False))
