"""Provider-Layer: Fake-Umschaltung, harter Stopp ohne Rollen-Config, kein Fallback.""" import re from pathlib import Path import pytest import agents async def test_fake_umschaltung(fake_welt): fake_welt.antwort_auf(r"-schneiden-", lambda prompt: "ANTWORT") rc, out, err = await agents.run_agent("scan-x-schneiden-1", "egal", 5, role="schneiden") assert (rc, out) == (0, "ANTWORT") assert fake_welt.calls == ["scan-x-schneiden-1"] async def test_stoerung_dann_fehler(fake_welt): fake_welt.antwort_auf(r".", lambda prompt: "ok") fake_welt.stoerungen.append({"muster": r"-schneiden-", "modus": "fehler", "mal": 1}) rc1, _, err1 = await agents.run_agent("scan-x-schneiden-1", "egal", 5, role="schneiden") rc2, out2, _ = await agents.run_agent("scan-x-schneiden-1", "egal", 5, role="schneiden") assert (rc1, err1) == (1, "fake-stoerung") assert (rc2, out2) == (0, "ok") async def test_infra_stoerung_wirft(fake_welt): fake_welt.stoerungen.append({"muster": r".", "modus": "infra", "mal": 1}) with pytest.raises(agents.AgentInfraError): await agents.run_agent("scan-x-schneiden-1", "egal", 5, role="schneiden") async def test_unkonfigurierte_rolle_pausiert(monkeypatch): """Ohne Fake-Modus und ohne ROLLE_-Env: AgentInfraError (Lauf pausiert), kein Default.""" monkeypatch.delenv("PLANER_FAKE_AGENTS", raising=False) monkeypatch.delenv("ROLLE_JUDGE", raising=False) with pytest.raises(agents.AgentInfraError, match="kein Modell konfiguriert"): await agents.run_agent("scan-x-judge-1", "egal", 5, role="judge") def test_kein_fallback_codepfad(): """Der Creator-Fallback (_available_cached / 'routed provider unavailable') darf nicht mitportiert worden sein.""" quelle = Path(agents.__file__).read_text(encoding="utf-8") assert "_available_cached" not in quelle assert not re.search(r"run_provider", quelle) def test_prioritaet_der_stufen(): assert agents._agent_priority("scan-p-sichten-1") < agents._agent_priority("scan-p-schneiden-9") assert agents._agent_priority("irgendwas") == len(agents._STAGE_PRIORITY)