ankigen / tests /test_card_generator.py
brickfrog's picture
Upload folder using huggingface_hub
7505a0b verified
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"