AgentEvalTool/tests/unit/test_config_snapshot.py
sinohqb e6f98aaa6d feat(intelligent-eval): implement config snapshot management (ticket 05)
- Add config_snapshot.py with save/list/get/compare functions
- Auto-save snapshots on eval creation and plan submission
- Implement snapshot query APIs (list, get single)
- Implement snapshot comparison API (diff two snapshots)
- Add 8 unit tests and 7 integration tests

Snapshots track config changes over time (created/plan_submitted/config_updated).
All 813 tests passing.
2026-08-12 10:19:07 +08:00

180 lines
5.5 KiB
Python

"""Unit tests for config snapshot management."""
from sqlmodel import Session, select
from agenteval.intelligent_eval import config_snapshot
from agenteval.storage.db import IntelligentEvalConfigSnapshotDB, IntelligentEvalDB
def test_save_snapshot_created(db_session: Session):
"""Test saving a snapshot when eval is created."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
goal="test goal",
intent="test intent",
role_description="test role",
time_window_hours=24,
)
eval_db.set_seeds({"personas": ["user1"]})
db_session.add(eval_db)
db_session.commit()
snapshot = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
assert snapshot.eval_id == eval_db.id
assert snapshot.snapshot_type == "created"
assert snapshot.goal == "test goal"
assert snapshot.intent == "test intent"
assert snapshot.role_description == "test role"
assert snapshot.time_window_hours == 24
assert snapshot.get_seeds() == {"personas": ["user1"]}
assert snapshot.created_by == "user"
def test_save_snapshot_plan_submitted(db_session: Session):
"""Test saving a snapshot when plan is submitted."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
goal="test goal",
)
plan = {"dimensions": ["dim1"], "estimated_sessions": 5}
eval_db.set_plan(plan)
db_session.add(eval_db)
db_session.commit()
snapshot = config_snapshot.save_snapshot(eval_db, "plan_submitted", "openclaw", db_session)
assert snapshot.snapshot_type == "plan_submitted"
assert snapshot.get_plan() == plan
assert snapshot.created_by == "openclaw"
def test_list_snapshots(db_session: Session):
"""Test listing snapshots for an eval."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
goal="goal1",
)
db_session.add(eval_db)
db_session.commit()
# Create 3 snapshots
snapshot1 = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
eval_db.goal = "goal2"
db_session.commit()
snapshot2 = config_snapshot.save_snapshot(eval_db, "config_updated", "user", db_session)
eval_db.goal = "goal3"
db_session.commit()
snapshot3 = config_snapshot.save_snapshot(eval_db, "config_updated", "user", db_session)
snapshots = config_snapshot.list_snapshots(eval_db.id, db_session)
assert len(snapshots) == 3
# Should be ordered by created_at descending (newest first)
assert snapshots[0].id == snapshot3.id
assert snapshots[1].id == snapshot2.id
assert snapshots[2].id == snapshot1.id
def test_get_snapshot(db_session: Session):
"""Test getting a single snapshot."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
goal="test goal",
)
db_session.add(eval_db)
db_session.commit()
snapshot = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
retrieved = config_snapshot.get_snapshot(snapshot.id, db_session)
assert retrieved is not None
assert retrieved.id == snapshot.id
assert retrieved.goal == "test goal"
def test_get_snapshot_not_found(db_session: Session):
"""Test getting a non-existent snapshot."""
snapshot = config_snapshot.get_snapshot("nonexistent", db_session)
assert snapshot is None
def test_compare_snapshots_simple_fields(db_session: Session):
"""Test comparing snapshots with different simple fields."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
goal="goal1",
intent="intent1",
)
db_session.add(eval_db)
db_session.commit()
snapshot1 = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
# Update fields
eval_db.goal = "goal2"
eval_db.intent = "intent2"
db_session.commit()
snapshot2 = config_snapshot.save_snapshot(eval_db, "config_updated", "user", db_session)
diffs = config_snapshot.compare_snapshots(snapshot1, snapshot2)
assert "goal" in diffs
assert diffs["goal"]["old"] == "goal1"
assert diffs["goal"]["new"] == "goal2"
assert "intent" in diffs
assert diffs["intent"]["old"] == "intent1"
assert diffs["intent"]["new"] == "intent2"
def test_compare_snapshots_json_fields(db_session: Session):
"""Test comparing snapshots with different JSON fields."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
)
eval_db.set_seeds({"personas": ["user1"]})
db_session.add(eval_db)
db_session.commit()
snapshot1 = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
# Update seeds
eval_db.set_seeds({"personas": ["user1", "user2"]})
db_session.commit()
snapshot2 = config_snapshot.save_snapshot(eval_db, "config_updated", "user", db_session)
diffs = config_snapshot.compare_snapshots(snapshot1, snapshot2)
assert "seeds" in diffs
assert diffs["seeds"]["old"] == {"personas": ["user1"]}
assert diffs["seeds"]["new"] == {"personas": ["user1", "user2"]}
def test_compare_snapshots_no_differences(db_session: Session):
"""Test comparing identical snapshots."""
eval_db = IntelligentEvalDB(
name="test",
target_id="target1",
goal="goal1",
)
db_session.add(eval_db)
db_session.commit()
snapshot1 = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
snapshot2 = config_snapshot.save_snapshot(eval_db, "created", "user", db_session)
diffs = config_snapshot.compare_snapshots(snapshot1, snapshot2)
assert diffs == {}