import sys import pytest if sys.version_info < (3, 11): pytest.skip("Runtime tests require Python 3.11+.", allow_module_level=True) from src.agent.runtime import AgentRuntime from src.agent.types import ( McqQuestion, McqQuiz, MaterialGeneratedPayload, SummaryContent, ) def test_build_mcp_insert_plan_injects_required_metadata() -> None: payload = MaterialGeneratedPayload( mcq_quiz=McqQuiz( questions=[ McqQuestion( question="Apa itu AI?", options=["A", "B", "C", "D"], correct_answer="A", explanation="AI adalah kemampuan mesin untuk meniru kecerdasan.", ) ] ), summary=SummaryContent( title="Ringkasan AI", overview="AI membantu otomatisasi proses dan analitik.", key_points=["otomatisasi", "analitik"], ), ) plans, warnings = AgentRuntime._build_mcp_insert_plan( job_id="job-1", user_id="user-1", document_id="doc-1", payload=payload, requested_types=["mcq", "summary"], ) assert warnings == [] assert [name for name, _ in plans] == ["insert_mcq", "insert_summary"] for _, args in plans: assert args["job_id"] == "job-1" assert args["user_id"] == "user-1" assert args["document_id"] == "doc-1" def test_generation_contract_does_not_fail_on_missing_requested_type() -> None: warnings: list[str] = [] payload = MaterialGeneratedPayload( summary=SummaryContent( title="Ringkasan", overview="Satu dua tiga empat lima", key_points=["poin 1"], ) ) result = AgentRuntime._enforce_generation_contract( payload, generate_types=["mcq", "summary"], mcq_count=5, essay_count=3, summary_max_words=5, warnings=warnings, ) assert result.mcq_quiz is None assert result.summary is not None assert "model_output_validation_failed:mcq_missing" in warnings