"""角色卡导出映射单元测试。""" from __future__ import annotations from app.models.character import Character from app.models.lorebook import Lorebook, LorebookEntry from app.modules.imports.export_mapping import character_to_card, lorebook_to_st_book from app.repositories.json_utils import dumps def _character(**kw: object) -> Character: base: dict[str, object] = { "name": "狂三", "profile_json": "{}", } base.update(kw) return Character(**base) # type: ignore[arg-type] def test_character_to_card_basic() -> None: char = _character( display_name="三三", personality_summary="腹黑", profile_json=dumps({"background": "desc", "scenario": "sch", "tags": ["a"], "source_meta": {"creator": "X", "character_version": "1"}}), ) card = character_to_card(char) assert card["spec"] == "chara_card_v3" assert card["spec_version"] == "3.0" data = card["data"] assert data["name"] == "狂三" assert data["nickname"] == "三三" assert data["personality"] == "腹黑" assert data["description"] == "desc" assert data["creator"] == "X" assert data["character_version"] == "1" def test_no_nickname_when_same_as_name() -> None: char = _character(name="X", display_name="X") assert "nickname" not in character_to_card(char)["data"] def test_personality_from_daoti_snapshot() -> None: # 道体 personality_summary 是导出的 personality 来源(演化后的当前快照) char = _character(personality_summary="演化后的人格") assert character_to_card(char)["data"]["personality"] == "演化后的人格" def test_lorebook_exported_to_st_book() -> None: book = Lorebook(name="谱", scan_depth=4, recursive_scanning=True) entries = [ LorebookEntry(keys_json='["猫"]', content="喜欢猫", constant=True, position="after_char"), ] st_book = lorebook_to_st_book(book, entries) assert st_book["name"] == "谱" assert st_book["scan_depth"] == 4 assert st_book["recursive_scanning"] is True assert st_book["entries"][0]["keys"] == ["猫"] assert st_book["entries"][0]["constant"] is True def test_no_character_book_when_lorebook_none() -> None: char = _character() assert "character_book" not in character_to_card(char)["data"]