File size: 2,101 Bytes
62516b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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