M2b:导入改造产出可审阅灵胚(启镜物化世谱)与组装管线(符文展开/火候进入 IR),Kernel 打通采样参数链路

This commit is contained in:
chenxin committed 2026-08-21 23:43:29 +08:00
1 parent e6a3b7121f
commit 5f36e3785c
86 files changed
+424 -14455

No files matched your search

@@ -1,93 +0,0 @@
"""灵核情绪状态数据访问测试(设计 §11.4)。"""
import pytest
from app.db.session import AsyncSessionLocal
from app.models.personality_emotion import CharacterEmotionState
from app.repositories import personality_emotion as emotion_repo
from app.services.characters import get_active_character_model
def _state(character_id: str, **overrides) -> CharacterEmotionState:
base = {
"character_id": character_id,
"mood": "touched",
"intensity": 0.7,
"baseline_mood": "neutral",
"baseline_intensity": 0.2,
"last_trigger_event_id": "evt_abc",
}
base.update(overrides)
return CharacterEmotionState(**base)
@pytest.mark.asyncio
async def test_get_state_returns_none_when_absent() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
assert await emotion_repo.get_state(session, character.id) is None
@pytest.mark.asyncio
async def test_upsert_state_inserts_new() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
cid = character.id
created = await emotion_repo.upsert_state(session, _state(cid))
await session.commit()
assert created.mood == "touched"
assert created.intensity == 0.7
async with AsyncSessionLocal() as session:
fetched = await emotion_repo.get_state(session, cid)
assert fetched is not None
assert fetched.mood == "touched"
assert fetched.last_trigger_event_id == "evt_abc"
@pytest.mark.asyncio
async def test_upsert_state_updates_existing() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
cid = character.id
await emotion_repo.upsert_state(session, _state(cid, mood="touched", intensity=0.7))
await emotion_repo.upsert_state(
session,
_state(
cid,
mood="concerned",
intensity=0.5,
last_trigger_event_id="evt_def",
),
)
await session.commit()
async with AsyncSessionLocal() as session:
fetched = await emotion_repo.get_state(session, cid)
assert fetched is not None
assert fetched.mood == "concerned"
assert fetched.intensity == 0.5
assert fetched.last_trigger_event_id == "evt_def"
@pytest.mark.asyncio
async def test_upsert_state_single_row_per_character() -> None:
"""单行 per character:重复 upsert 不产生重复行。"""
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
cid = character.id
await emotion_repo.upsert_state(session, _state(cid))
await emotion_repo.upsert_state(session, _state(cid))
await emotion_repo.upsert_state(session, _state(cid))
await session.commit()
async with AsyncSessionLocal() as session:
from sqlalchemy import func, select
count = int(
(
await session.execute(
select(func.count())
.select_from(CharacterEmotionState)
.where(CharacterEmotionState.character_id == cid)
)
).scalar_one()
)
assert count == 1
@@ -1,79 +0,0 @@
"""时态纪念日数据访问测试(辰正 §5.3)。"""
import pytest
from app.db.session import AsyncSessionLocal
from app.models.time_anniversary import TimeAnniversary
from app.repositories import time_anniversaries as anni_repo
from app.services.characters import get_active_character_model
def _anniversary(character_id: str, **overrides) -> TimeAnniversary:
base = {
"character_id": character_id,
"name": "我们的相遇日",
"calendar": "solar",
"date": "2025-09-19",
"recurs_yearly": True,
"kind": "anniversary",
"subject_type": "relationship",
"source": "auto",
"metadata_json": "{}",
}
base.update(overrides)
return TimeAnniversary(**base)
@pytest.mark.asyncio
async def test_create_and_get_anniversary() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
created = await anni_repo.create_anniversary(session, _anniversary(character.id))
fetched = await anni_repo.get_anniversary(session, created.id)
assert fetched is not None
assert fetched.name == "我们的相遇日"
assert fetched.id.startswith("anniv_")
@pytest.mark.asyncio
async def test_list_anniversaries_by_character() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
await anni_repo.create_anniversary(session, _anniversary(character.id, date="2025-03-01"))
await anni_repo.create_anniversary(session, _anniversary(character.id, date="2025-09-19"))
items = await anni_repo.list_anniversaries(session, character.id)
# 默认人物 seed 时已带 1 条 birthday 纪念日;此处只验证 anniversary kind 的列表行为
anniversary_items = [a for a in items if a.kind == "anniversary"]
assert len(anniversary_items) == 2
# list 默认按 date 升序
assert anniversary_items[0].date < anniversary_items[1].date
@pytest.mark.asyncio
async def test_update_anniversary() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
created = await anni_repo.create_anniversary(session, _anniversary(character.id))
updated = await anni_repo.update_anniversary(
session, created.id, name="相识纪念日", source="manual"
)
assert updated is not None
assert updated.name == "相识纪念日"
assert updated.source == "manual"
@pytest.mark.asyncio
async def test_update_anniversary_missing_returns_none() -> None:
async with AsyncSessionLocal() as session:
result = await anni_repo.update_anniversary(session, "anniv_nonexistent", name="x")
assert result is None
@pytest.mark.asyncio
async def test_delete_anniversary() -> None:
async with AsyncSessionLocal() as session:
character = await get_active_character_model(session)
created = await anni_repo.create_anniversary(session, _anniversary(character.id))
assert await anni_repo.delete_anniversary(session, created.id) is True
assert await anni_repo.get_anniversary(session, created.id) is None
assert await anni_repo.delete_anniversary(session, created.id) is False