new RPG system

This commit is contained in:
2026-06-05 14:57:15 +03:00
parent 6189a5fb74
commit 01b16dbeaa
29 changed files with 2395 additions and 311 deletions
+80
View File
@@ -0,0 +1,80 @@
import asyncio
import json
import pytest
import database.db as dbmod
import services.memory as memory
@pytest.fixture
def snapshot_db(tmp_path, monkeypatch):
db_file = tmp_path / "snapshots.db"
monkeypatch.setenv("DB_PATH", str(db_file))
monkeypatch.setattr(dbmod, "DB_PATH", str(db_file))
monkeypatch.setattr(memory, "DB_PATH", str(db_file))
asyncio.run(dbmod.init_db())
return str(db_file)
def test_snapshot_save_restore_and_delete_rollback(snapshot_db):
asyncio.run(_test_snapshot_save_restore_and_delete_rollback())
async def _test_snapshot_save_restore_and_delete_rollback():
sid = "sess_snap_test"
await memory.get_or_create_session(sid, "default")
await memory.update_session_rpg(sid, True)
await memory.update_session_facts(sid, json.dumps([{"text": "Fact A", "rp_day": "день 1"}]))
await memory.update_session_plot_arc(
sid, json.dumps({"title": "Arc", "steps": [{"id": "s1", "title": "One"}], "current_step_index": 0})
)
await memory.set_session_affinity(sid, 3)
await memory.upsert_quest(sid, "Quest one", "active")
u1 = await memory.add_message(sid, "user", "hello")
await memory.save_state_snapshot(sid, u1)
await memory.update_session_facts(sid, json.dumps([{"text": "Fact B", "rp_day": "день 2"}]))
await memory.set_session_affinity(sid, 9)
a1 = await memory.add_message(sid, "assistant", "hi")
await memory.save_state_snapshot(sid, a1)
session = await memory.get_session(sid)
assert json.loads(session["facts_json"])[0]["text"] == "Fact B"
assert session["affinity"] == 9
await memory.delete_message_and_following(sid, a1)
session = await memory.get_session(sid)
assert json.loads(session["facts_json"])[0]["text"] == "Fact A"
assert session["affinity"] == 3
quests = await memory.get_quests(sid)
assert len(quests) == 1
def test_fork_uses_snapshot_not_current_state(snapshot_db):
asyncio.run(_test_fork_uses_snapshot_not_current_state())
async def _test_fork_uses_snapshot_not_current_state():
sid = "sess_fork_src"
await memory.get_or_create_session(sid, "default")
await memory.update_session_rpg(sid, True)
u1 = await memory.add_message(sid, "user", "start")
await memory.update_session_facts(sid, json.dumps([{"text": "Early", "rp_day": "1"}]))
await memory.save_state_snapshot(sid, u1)
a1 = await memory.add_message(sid, "assistant", "reply")
await memory.update_session_facts(sid, json.dumps([{"text": "Late", "rp_day": "2"}]))
await memory.save_state_snapshot(sid, a1)
new_id = await memory.fork_session(sid, u1)
assert new_id
forked = await memory.get_session(new_id)
assert json.loads(forked["facts_json"])[0]["text"] == "Early"
hist = await memory.get_history(new_id)
roles = [m["role"] for m in hist if m["role"] != "system"]
assert roles == ["user"]