feat: auto committed
This commit is contained in:
93
services/ai/tests/test_workflow_state_store.py
Normal file
93
services/ai/tests/test_workflow_state_store.py
Normal file
@@ -0,0 +1,93 @@
|
||||
"""工作流状态存储测试(内存降级模式)."""
|
||||
|
||||
import pytest
|
||||
|
||||
from src.ai.errors import AIWorkflowNotFoundError
|
||||
from src.ai.workflow.state_store import WorkflowState, WorkflowStateStore
|
||||
|
||||
|
||||
class TestWorkflowState:
|
||||
"""WorkflowState dataclass 测试."""
|
||||
|
||||
def test_auto_generate_id(self) -> None:
|
||||
"""自动生成 workflow_id."""
|
||||
state = WorkflowState()
|
||||
assert state.workflow_id
|
||||
assert state.created_at > 0
|
||||
assert state.updated_at > 0
|
||||
|
||||
def test_to_dict(self) -> None:
|
||||
"""to_dict 序列化."""
|
||||
state = WorkflowState(user_id="u-1", topic="数学")
|
||||
d = state.to_dict()
|
||||
assert d["user_id"] == "u-1"
|
||||
assert d["topic"] == "数学"
|
||||
assert "questions" in d
|
||||
|
||||
def test_from_dict(self) -> None:
|
||||
"""from_dict 反序列化."""
|
||||
data = {
|
||||
"workflow_id": "wf-1",
|
||||
"user_id": "u-1",
|
||||
"topic": "test",
|
||||
"status": "pending",
|
||||
"questions": [],
|
||||
}
|
||||
state = WorkflowState.from_dict(data)
|
||||
assert state.workflow_id == "wf-1"
|
||||
assert state.user_id == "u-1"
|
||||
|
||||
def test_touch_updates_timestamp(self) -> None:
|
||||
"""touch() 更新 updated_at."""
|
||||
state = WorkflowState()
|
||||
old = state.updated_at
|
||||
import time
|
||||
time.sleep(0.01)
|
||||
state.touch()
|
||||
assert state.updated_at >= old
|
||||
|
||||
|
||||
class TestWorkflowStateStore:
|
||||
"""WorkflowStateStore 测试(Redis=None 内存模式)."""
|
||||
|
||||
async def test_create_and_get(self) -> None:
|
||||
"""创建并查询."""
|
||||
store = WorkflowStateStore(redis=None)
|
||||
state = WorkflowState(user_id="u-1", topic="数学")
|
||||
created = await store.create(state)
|
||||
assert created.workflow_id == state.workflow_id
|
||||
# 查询
|
||||
fetched = await store.get(created.workflow_id)
|
||||
assert fetched.user_id == "u-1"
|
||||
assert fetched.topic == "数学"
|
||||
|
||||
async def test_get_not_found_raises(self) -> None:
|
||||
"""查询不存在的工作流抛异常."""
|
||||
store = WorkflowStateStore(redis=None)
|
||||
with pytest.raises(AIWorkflowNotFoundError):
|
||||
await store.get("nonexistent-id")
|
||||
|
||||
async def test_update(self) -> None:
|
||||
"""更新工作流状态."""
|
||||
store = WorkflowStateStore(redis=None)
|
||||
state = await store.create(WorkflowState(user_id="u-1"))
|
||||
updated = await store.update(
|
||||
state.workflow_id,
|
||||
status="analyzing",
|
||||
topic="updated topic",
|
||||
)
|
||||
assert updated.status == "analyzing"
|
||||
assert updated.topic == "updated topic"
|
||||
|
||||
async def test_delete(self) -> None:
|
||||
"""删除工作流."""
|
||||
store = WorkflowStateStore(redis=None)
|
||||
state = await store.create(WorkflowState(user_id="u-1"))
|
||||
await store.delete(state.workflow_id)
|
||||
with pytest.raises(AIWorkflowNotFoundError):
|
||||
await store.get(state.workflow_id)
|
||||
|
||||
async def test_delete_nonexistent_no_error(self) -> None:
|
||||
"""删除不存在的工作流不抛异常."""
|
||||
store = WorkflowStateStore(redis=None)
|
||||
await store.delete("nonexistent") # 不抛异常
|
||||
Reference in New Issue
Block a user