"""角色卡导入服务测试(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"