File size: 4,487 Bytes
7505a0b
1f40585
 
 
 
 
 
 
7505a0b
1f40585
 
 
 
 
 
 
 
 
7505a0b
1f40585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7505a0b
1f40585
 
 
 
 
 
7505a0b
1f40585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
from ankigen.card_generator import (
    _parse_model_selection,
    _map_generation_mode_to_subject,
    _build_generation_context,
    format_cards_for_dataframe,
    get_dataframe_columns,
    generate_token_usage_html,
)
from ankigen.models import Card, CardFront, CardBack

# --- _parse_model_selection Tests ---


def test_parse_model_selection():
    assert _parse_model_selection("gpt-5.2-auto") == ("gpt-5.2", None)
    assert _parse_model_selection("gpt-5.2-instant") == ("gpt-5.2", "none")
    assert _parse_model_selection("gpt-5.2-thinking") == ("gpt-5.2", "high")
    assert _parse_model_selection("custom-model") == ("custom-model", None)
    assert _parse_model_selection("") == ("gpt-5.4", None)


# --- _map_generation_mode_to_subject Tests ---


def test_map_generation_mode_to_subject():
    assert _map_generation_mode_to_subject("subject", "Math") == "Math"
    assert _map_generation_mode_to_subject("subject", "") == "general"
    assert _map_generation_mode_to_subject("path", "") == "curriculum_design"
    assert _map_generation_mode_to_subject("text", "") == "content_analysis"
    assert _map_generation_mode_to_subject("unknown", "") == "general"


# --- _build_generation_context Tests ---


def test_build_generation_context():
    assert _build_generation_context("text", "some text") == {
        "source_text": "some text"
    }
    assert _build_generation_context("subject", "ignored") == {}
    assert _build_generation_context("text", "") == {}


# --- format_cards_for_dataframe Tests ---


def test_format_cards_for_dataframe():
    card = Card(
        front=CardFront(question="Q"),
        back=CardBack(answer="A", explanation="E", example="Ex"),
        metadata={
            "prerequisites": ["P1", "P2"],
            "learning_outcomes": ["L1"],
            "difficulty": "beginner",
            "source_url": "http://example.com",
        },
        card_type="cloze",
    )

    formatted = format_cards_for_dataframe([card], "Test Topic")
    assert len(formatted) == 1
    f_card = formatted[0]
    assert f_card["Index"] == "1"
    assert f_card["Topic"] == "Test Topic"
    assert f_card["Card_Type"] == "cloze"
    assert f_card["Question"] == "Q"
    assert f_card["Prerequisites"] == "P1, P2"
    assert f_card["Learning_Outcomes"] == "L1"
    assert f_card["Difficulty"] == "beginner"
    assert f_card["Source_URL"] == "http://example.com"


def test_format_cards_for_dataframe_missing_metadata():
    card = Card(
        front=CardFront(question="Q"),
        back=CardBack(answer="A", explanation="E", example="Ex"),
        card_type="basic",
    )
    formatted = format_cards_for_dataframe([card], "No Metadata")
    f_card = formatted[0]
    assert f_card["Prerequisites"] == ""
    assert f_card["Difficulty"] == "N/A"


# --- get_dataframe_columns Tests ---


def test_get_dataframe_columns():
    cols = get_dataframe_columns()
    assert isinstance(cols, list)
    assert "Question" in cols
    assert "Answer" in cols
    assert "Topic" in cols


# --- generate_token_usage_html Tests ---


def test_generate_token_usage_html():
    usage = {"total_tokens": 100}
    html = generate_token_usage_html(usage)
    assert "100 tokens" in html

    html_none = generate_token_usage_html(None)
    assert "No usage data" in html_none

    html_invalid = generate_token_usage_html("invalid")
    assert "No usage data" in html_invalid


# --- Additional Tests to meet 10+ requirement ---


def test_available_models_constant():
    from ankigen.card_generator import AVAILABLE_MODELS

    assert len(AVAILABLE_MODELS) >= 3
    assert AVAILABLE_MODELS[0]["value"] == "gpt-5.2-auto"


def test_generation_modes_constant():
    from ankigen.card_generator import GENERATION_MODES

    assert len(GENERATION_MODES) >= 1
    assert GENERATION_MODES[0]["value"] == "subject"


def test_format_cards_for_dataframe_empty():
    assert format_cards_for_dataframe([], "Empty") == []


def test_format_cards_for_dataframe_multiple_cards():
    cards = [
        Card(
            front=CardFront(question="Q1"),
            back=CardBack(answer="A1", explanation="E1", example="X1"),
        ),
        Card(
            front=CardFront(question="Q2"),
            back=CardBack(answer="A2", explanation="E2", example="X2"),
        ),
    ]
    formatted = format_cards_for_dataframe(cards, "Multiple", start_index=10)
    assert len(formatted) == 2
    assert formatted[0]["Index"] == "10"
    assert formatted[1]["Index"] == "11"