chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from opensquilla.application.approval_queue import classify_command
|
||||
|
||||
|
||||
def test_deny_only_match_returns_deny() -> None:
|
||||
assert classify_command("rm -rf /tmp/x", allow_patterns=[], deny_patterns=["rm *"]) == "deny"
|
||||
|
||||
|
||||
def test_allow_only_match_returns_allow() -> None:
|
||||
assert (
|
||||
classify_command("uv run pytest", allow_patterns=["uv *"], deny_patterns=[]) == "allow"
|
||||
)
|
||||
|
||||
|
||||
def test_deny_takes_precedence_when_both_match() -> None:
|
||||
assert (
|
||||
classify_command(
|
||||
"rm -rf /tmp/x",
|
||||
allow_patterns=["rm *"],
|
||||
deny_patterns=["rm *"],
|
||||
)
|
||||
== "deny"
|
||||
)
|
||||
|
||||
|
||||
def test_no_match_returns_none() -> None:
|
||||
assert classify_command("ls -la", allow_patterns=["uv *"], deny_patterns=["rm *"]) is None
|
||||
|
||||
|
||||
def test_empty_command_returns_none() -> None:
|
||||
assert classify_command("", allow_patterns=["*"], deny_patterns=["*"]) is None
|
||||
|
||||
|
||||
def test_glob_wildcard_matches_command() -> None:
|
||||
assert (
|
||||
classify_command("git push --force", allow_patterns=[], deny_patterns=["git push *"])
|
||||
== "deny"
|
||||
)
|
||||
|
||||
|
||||
def test_substring_fallback_matches_without_wildcard() -> None:
|
||||
# A bare token with no glob metacharacter still matches as a substring.
|
||||
assert (
|
||||
classify_command("sudo systemctl restart x", allow_patterns=[], deny_patterns=["sudo"])
|
||||
== "deny"
|
||||
)
|
||||
|
||||
|
||||
def test_matching_is_case_sensitive() -> None:
|
||||
assert classify_command("RM file", allow_patterns=[], deny_patterns=["rm *"]) is None
|
||||
|
||||
|
||||
def test_blank_pattern_never_matches() -> None:
|
||||
assert classify_command("rm file", allow_patterns=[" "], deny_patterns=[" "]) is None
|
||||
@@ -0,0 +1,122 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
from opensquilla.application.approval_queue import ApprovalQueue
|
||||
from opensquilla.application.approval_rpc import (
|
||||
approval_extend_rpc_payload,
|
||||
approval_forget_rpc_payload,
|
||||
approval_request_rpc_payload,
|
||||
approval_resolve_rpc_payload,
|
||||
approval_settings_rpc_payload,
|
||||
approval_snapshot_rpc_payload,
|
||||
approval_wait_decision_rpc_payload,
|
||||
)
|
||||
|
||||
|
||||
def test_approval_settings_rpc_payload_includes_node_inheritance() -> None:
|
||||
queue = ApprovalQueue(db_path=":memory:")
|
||||
try:
|
||||
settings = queue.set_settings(
|
||||
"prompt",
|
||||
allow_patterns=["uv *"],
|
||||
deny_patterns=["rm *"],
|
||||
node_id="node-1",
|
||||
)
|
||||
|
||||
assert approval_settings_rpc_payload(
|
||||
settings,
|
||||
node_id="node-1",
|
||||
inherited=False,
|
||||
) == {
|
||||
"mode": "prompt",
|
||||
"allowPatterns": ["uv *"],
|
||||
"denyPatterns": ["rm *"],
|
||||
"nodeId": "node-1",
|
||||
"inherited": False,
|
||||
}
|
||||
finally:
|
||||
queue.close()
|
||||
|
||||
|
||||
def test_approval_request_rpc_payload_applies_settings_mode() -> None:
|
||||
queue = ApprovalQueue(db_path=":memory:")
|
||||
try:
|
||||
queue.set_settings("auto-approve")
|
||||
|
||||
payload = approval_request_rpc_payload(
|
||||
queue,
|
||||
namespace="exec",
|
||||
params={"toolName": "exec_command", "args": {}, "sessionKey": "agent:main:demo"},
|
||||
)
|
||||
|
||||
assert payload["mode"] == "auto-approve"
|
||||
assert payload["approved"] is True
|
||||
assert payload["resolved"] is True
|
||||
assert payload["pending"] is False
|
||||
assert queue.status(payload["id"])["params"]["approvalMode"] == "auto-approve"
|
||||
finally:
|
||||
queue.close()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_wait_and_resolve_rpc_payloads_preserve_status_shape() -> None:
|
||||
queue = ApprovalQueue(db_path=":memory:", poll_interval=0.01)
|
||||
try:
|
||||
request = approval_request_rpc_payload(
|
||||
queue,
|
||||
namespace="plugin",
|
||||
params={"pluginId": "demo", "version": "1.0.0", "permissions": []},
|
||||
)
|
||||
approval_id = request["id"]
|
||||
|
||||
resolved = approval_resolve_rpc_payload(queue, approval_id, True)
|
||||
waited = await approval_wait_decision_rpc_payload(queue, approval_id)
|
||||
|
||||
assert resolved == waited
|
||||
assert isinstance(waited.pop("deadline"), float)
|
||||
assert waited == {
|
||||
"id": approval_id,
|
||||
"mode": "prompt",
|
||||
"approved": True,
|
||||
"resolved": True,
|
||||
"resolution": "approved",
|
||||
"consumed": False,
|
||||
"pending": False,
|
||||
}
|
||||
finally:
|
||||
queue.close()
|
||||
|
||||
|
||||
def test_approval_extend_rpc_payload_pushes_deadline() -> None:
|
||||
queue = ApprovalQueue(db_path=":memory:", default_timeout=10.0)
|
||||
try:
|
||||
approval_id = queue.request(
|
||||
"exec",
|
||||
{"toolName": "exec_command", "command": "rm x", "sessionKey": "agent:main:demo"},
|
||||
)
|
||||
before = queue.get(approval_id).deadline
|
||||
|
||||
payload = approval_extend_rpc_payload(queue, approval_id, 120.0)
|
||||
|
||||
assert payload["pending"] is True
|
||||
assert payload["resolution"] == ""
|
||||
assert payload["deadline"] == before + 120.0
|
||||
assert queue.get(approval_id).deadline == before + 120.0
|
||||
finally:
|
||||
queue.close()
|
||||
|
||||
|
||||
def test_approval_snapshot_and_forget_payloads_own_wire_shapes() -> None:
|
||||
queue = ApprovalQueue(db_path=":memory:")
|
||||
try:
|
||||
queue.set_settings("prompt")
|
||||
|
||||
assert approval_snapshot_rpc_payload(queue) == {"mode": "prompt"}
|
||||
assert approval_forget_rpc_payload(" /tmp/approval-demo ") == {
|
||||
"scope": "noop",
|
||||
"target": "/tmp/approval-demo",
|
||||
}
|
||||
assert approval_forget_rpc_payload() == {"scope": "noop"}
|
||||
finally:
|
||||
queue.close()
|
||||
@@ -0,0 +1,96 @@
|
||||
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"
|
||||
Reference in New Issue
Block a user