66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
"""角色卡导出映射单元测试。"""
|
|
|
|
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"]
|