Files
2026-07-13 13:12:33 +08:00

97 lines
3.2 KiB
Python

from __future__ import annotations
import pytest
from opensquilla.application.wizard import (
WizardRegistry,
get_wizard_registry,
reset_wizard_registry,
)
from opensquilla.application.wizard_rpc import (
wizard_cancel_rpc_payload,
wizard_next_rpc_payload,
wizard_start_rpc_payload,
wizard_status_rpc_payload,
)
from opensquilla.gateway import wizard as gateway_wizard
def test_wizard_registry_advances_and_applies_schema_defaults() -> None:
registry = WizardRegistry()
wizard_id, first_step = registry.start("onboard_agent")
assert len(wizard_id) == 8
assert first_step.to_dict()["stepId"] == "agent_identity"
first = registry.advance(wizard_id, {"agent_name": "cora"})
assert first.completed is False
assert first.next_step is not None
assert first.next_step.step_id == "system_prompt"
second = registry.advance(wizard_id, {"system_prompt": "Help with release work"})
assert second.completed is False
assert second.next_step is not None
assert second.next_step.step_id == "defaults"
final = registry.advance(wizard_id, {"default_model": "openai/gpt-4o-mini"})
assert final.completed is True
assert final.next_step is None
assert final.result == {
"wizardType": "onboard_agent",
"answers": {
"agent_name": "cora",
"system_prompt": "Help with release work",
"persona_tone": "professional",
"default_model": "openai/gpt-4o-mini",
"temperature": 7,
},
}
def test_wizard_registry_rejects_blank_required_answers() -> None:
registry = WizardRegistry()
wizard_id, _first_step = registry.start("onboard_agent")
with pytest.raises(ValueError, match="missing required field"):
registry.advance(wizard_id, {"agent_name": " "})
def test_wizard_rpc_payload_helpers_own_wire_shapes() -> None:
registry = WizardRegistry()
wizard_id, first_step = registry.start("onboard_agent")
started = wizard_start_rpc_payload(wizard_id, first_step)
assert started["wizardId"] == wizard_id
assert started["step"]["stepId"] == "agent_identity"
outcome = registry.advance(wizard_id, {"agent_name": "cora"})
assert outcome.next_step is not None
advanced = wizard_next_rpc_payload(outcome)
assert advanced == {
"step": outcome.next_step.to_dict(),
"completed": False,
"result": None,
}
assert wizard_status_rpc_payload(registry.status(wizard_id), total_steps=3) == {
"wizardId": wizard_id,
"wizardType": "onboard_agent",
"currentStepId": "system_prompt",
"totalSteps": 3,
"startedAt": registry.status(wizard_id).started_at,
"completed": False,
}
assert wizard_cancel_rpc_payload(wizard_id) == {
"wizardId": wizard_id,
"cancelled": True,
}
def test_gateway_wizard_imports_remain_compatible_with_application_singleton() -> None:
reset_wizard_registry()
assert gateway_wizard.get_wizard_registry() is get_wizard_registry()
wizard_id, _first_step = gateway_wizard.get_wizard_registry().start("onboard_agent")
assert get_wizard_registry().status(wizard_id).wizard_type == "onboard_agent"