mtg_python_deckbuilder/code/tests/test_random_fallback_and_constraints.py

43 lines
1.7 KiB
Python

from __future__ import annotations
import importlib
import os
from starlette.testclient import TestClient
def _mk_client(monkeypatch):
monkeypatch.setenv("RANDOM_MODES", "1")
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
app_module = importlib.import_module('code.web.app')
return TestClient(app_module.app)
def test_invalid_theme_triggers_fallback_and_echoes_original_theme(monkeypatch):
client = _mk_client(monkeypatch)
payload = {"seed": 777, "theme": "this theme does not exist"}
r = client.post('/api/random_full_build', json=payload)
assert r.status_code == 200
data = r.json()
# Fallback flag should be set with original_theme echoed
assert data.get("fallback") is True
assert data.get("original_theme") == payload["theme"]
# Theme is still the provided theme (we indicate fallback via the flag)
assert data.get("theme") == payload["theme"]
# Commander/decklist should be present
assert isinstance(data.get("commander"), str) and data["commander"]
assert isinstance(data.get("decklist"), list)
def test_constraints_impossible_returns_422_with_detail(monkeypatch):
client = _mk_client(monkeypatch)
# Set an unrealistically high requirement to force impossible constraint
payload = {"seed": 101, "constraints": {"require_min_candidates": 1000000}}
r = client.post('/api/random_full_build', json=payload)
assert r.status_code == 422
data = r.json()
# Structured error payload
assert data.get("status") == 422
detail = data.get("detail")
assert isinstance(detail, dict)
assert detail.get("error") == "constraints_impossible"
assert isinstance(detail.get("pool_size"), int)