94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
"""工作流状态存储测试(内存降级模式)."""
|
||
|
||
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") # 不抛异常
|