"""角色卡字段映射单元测试。""" from __future__ import annotations from app.modules.imports.card_parser import CharacterCard from app.modules.imports.mapping import ( card_to_daoti, card_to_profile, character_book_to_entries, ) def _card(**kw: object) -> CharacterCard: base: dict[str, object] = {"spec_version": "2.0", "name": "狂三"} base.update(kw) return CharacterCard(**base) # type: ignore[arg-type] def test_profile_maps_core_fields() -> None: card = _card( description="desc", scenario="sch", first_mes="hi", tags=["a"], creator="X", character_version="1", ) profile = card_to_profile(card) assert profile["background"] == "desc" assert profile["scenario"] == "sch" assert profile["first_mes"] == "hi" assert profile["tags"] == ["a"] assert profile["source_meta"]["creator"] == "X" assert profile["source_meta"]["spec_version"] == "2.0" def test_profile_preserves_system_prompt_and_extensions() -> None: card = _card(system_prompt="SP", extensions={"foo": {"bar": 1}}) profile = card_to_profile(card) assert profile["system_prompt"] == "SP" assert profile["st_extensions"] == {"foo": {"bar": 1}} def test_daoti_personality_as_initial_summary() -> None: assert card_to_daoti(_card(personality="腹黑优雅"))["personality_summary"] == "腹黑优雅" def test_daoti_empty_personality_is_none() -> None: assert card_to_daoti(_card())["personality_summary"] is None def test_book_to_entries_maps_fields() -> None: book = { "entries": [ {"keys": ["猫"], "content": "喜欢猫", "position": "after_char", "constant": True}, {"keys": ["时间"], "content": "时间能力", "priority": 5}, ] } entries = character_book_to_entries(book) assert len(entries) == 2 assert entries[0]["keys"] == ["猫"] assert entries[0]["constant"] is True assert entries[1]["priority"] == 5 assert entries[1]["position"] == "after_char" # 默认 def test_book_none_or_empty() -> None: assert character_book_to_entries(None) == [] assert character_book_to_entries({}) == [] assert character_book_to_entries({"entries": []}) == []