67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
"""角色卡导入服务测试(DB 集成)。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from app.db.session import AsyncSessionLocal
|
|
from app.repositories import lorebook as lorebook_repo
|
|
from app.services.card_import import import_character_card
|
|
|
|
|
|
async def test_import_creates_character_and_lorebook() -> None:
|
|
card = {
|
|
"spec": "chara_card_v2",
|
|
"spec_version": "2.0",
|
|
"data": {
|
|
"name": "狂三",
|
|
"nickname": "三三",
|
|
"personality": "腹黑优雅",
|
|
"character_book": {
|
|
"name": "狂三世谱",
|
|
"entries": [
|
|
{"keys": ["猫"], "content": "喜欢猫。"},
|
|
{"keys": ["时间"], "content": "时间能力。", "constant": True},
|
|
],
|
|
},
|
|
},
|
|
}
|
|
raw = json.dumps(card).encode("utf-8")
|
|
|
|
async with AsyncSessionLocal() as session:
|
|
character = await import_character_card(session, raw, "local-user")
|
|
books = await lorebook_repo.list_books(session, character.id, "local-user")
|
|
entries = await lorebook_repo.list_book_entries(session, books[0].id)
|
|
|
|
assert character.name == "狂三"
|
|
assert character.display_name == "三三"
|
|
assert character.personality_summary == "腹黑优雅"
|
|
assert len(books) == 1
|
|
assert books[0].name == "狂三世谱"
|
|
assert len(entries) == 2
|
|
assert any(e.constant for e in entries)
|
|
|
|
|
|
async def test_import_without_book_creates_only_character() -> None:
|
|
card = {"spec_version": "2.0", "data": {"name": "无书角色", "personality": "温和"}}
|
|
raw = json.dumps(card).encode("utf-8")
|
|
|
|
async with AsyncSessionLocal() as session:
|
|
character = await import_character_card(session, raw, "local-user")
|
|
books = await lorebook_repo.list_books(session, character.id, "local-user")
|
|
|
|
assert character.name == "无书角色"
|
|
assert character.personality_summary == "温和"
|
|
assert books == []
|
|
|
|
|
|
async def test_import_v1_flat_card() -> None:
|
|
# V1 扁平结构,无 data 包裹
|
|
card = {"name": "V1角色", "personality": "p"}
|
|
raw = json.dumps(card).encode("utf-8")
|
|
|
|
async with AsyncSessionLocal() as session:
|
|
character = await import_character_card(session, raw, "local-user")
|
|
assert character.name == "V1角色"
|
|
assert character.personality_summary == "p"
|