import pytest from app.pool import PoolValidationError, get_question, parse_pool_json, public_question_payload, question_time_limit def test_pool_validation_accepts_well_formed_pool(sample_pool): pool = parse_pool_json(sample_pool) assert pool["title"] == "Sample Quiz" assert pool["score_fn"] == "linear_decay" assert question_time_limit(pool, 0) == 2 assert get_question(pool, 0)["correct"] == "B" public = public_question_payload(pool, 0) assert "correct" not in public assert public["options"]["A"] == "Alpha" @pytest.mark.parametrize( "mutator, message", [ (lambda p: p.pop("title"), "title"), (lambda p: p.update({"questions": []}), "at least one"), (lambda p: p["questions"][0].pop("text"), "text"), (lambda p: p["questions"][0].update({"options": {"A": "x"}}), "options"), (lambda p: p["questions"][0].update({"correct": "E"}), "correct"), (lambda p: p.update({"score_fn": "missing"}), "Unknown"), (lambda p: p.update({"time_limit_default": 0}), "positive"), ], ) def test_pool_validation_rejects_invalid_shapes(sample_pool, mutator, message): mutator(sample_pool) with pytest.raises(PoolValidationError, match=message): parse_pool_json(sample_pool) def test_pool_validation_rejects_invalid_json(): with pytest.raises(PoolValidationError, match="Invalid JSON"): parse_pool_json("{bad")