generated from coulomb/repo-seed
118 lines
3.5 KiB
Python
118 lines
3.5 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
import httpx
|
|
|
|
from activity_core.context_resolvers.state_hub import StateHubContextResolver
|
|
|
|
|
|
class DummyResponse:
|
|
def __init__(self, payload: Any, status_error: Exception | None = None) -> None:
|
|
self.payload = payload
|
|
self.status_error = status_error
|
|
|
|
def raise_for_status(self) -> None:
|
|
if self.status_error is not None:
|
|
raise self.status_error
|
|
|
|
def json(self) -> Any:
|
|
return self.payload
|
|
|
|
|
|
def test_state_summary_query(monkeypatch) -> None:
|
|
calls: list[dict[str, Any]] = []
|
|
|
|
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
|
calls.append({"url": url, **kwargs})
|
|
return DummyResponse({"tasks": {"todo": 3}})
|
|
|
|
monkeypatch.setenv("STATE_HUB_URL", "http://state-hub.test")
|
|
monkeypatch.setattr(httpx, "get", fake_get)
|
|
|
|
result = StateHubContextResolver().resolve("state_summary", None, {})
|
|
|
|
assert result == {"tasks": {"todo": 3}}
|
|
assert calls == [
|
|
{
|
|
"url": "http://state-hub.test/state/summary",
|
|
"params": None,
|
|
"timeout": 10.0,
|
|
}
|
|
]
|
|
|
|
|
|
def test_daily_triage_queries(monkeypatch) -> None:
|
|
calls: list[dict[str, Any]] = []
|
|
|
|
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
|
calls.append({"url": url, **kwargs})
|
|
return DummyResponse({"url": url, "params": kwargs.get("params")})
|
|
|
|
monkeypatch.setenv("STATE_HUB_URL", "http://state-hub.test/")
|
|
monkeypatch.setattr(httpx, "get", fake_get)
|
|
resolver = StateHubContextResolver()
|
|
|
|
resolver.resolve("next_steps", None, {})
|
|
resolver.resolve("workplan_index", None, {"refresh": False})
|
|
resolver.resolve("hub_inbox", None, {"to_agent": "hub", "unread_only": True})
|
|
|
|
assert calls == [
|
|
{
|
|
"url": "http://state-hub.test/state/next_steps",
|
|
"params": None,
|
|
"timeout": 10.0,
|
|
},
|
|
{
|
|
"url": "http://state-hub.test/workstreams/workplan-index",
|
|
"params": {"refresh": False},
|
|
"timeout": 10.0,
|
|
},
|
|
{
|
|
"url": "http://state-hub.test/messages/",
|
|
"params": {"to_agent": "hub", "unread_only": True},
|
|
"timeout": 10.0,
|
|
},
|
|
]
|
|
|
|
|
|
def test_existing_queries_still_resolve(monkeypatch) -> None:
|
|
calls: list[dict[str, Any]] = []
|
|
|
|
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
|
calls.append({"url": url, **kwargs})
|
|
return DummyResponse({"ok": True})
|
|
|
|
monkeypatch.setenv("STATE_HUB_URL", "http://state-hub.test")
|
|
monkeypatch.setattr(httpx, "get", fake_get)
|
|
resolver = StateHubContextResolver()
|
|
|
|
assert resolver.resolve("domain_summary", None, {"domain": "custodian"}) == {"ok": True}
|
|
assert resolver.resolve("repo_sbom_status", None, {"repo_slug": "activity-core"}) == {"ok": True}
|
|
|
|
assert calls == [
|
|
{
|
|
"url": "http://state-hub.test/state/domain/custodian",
|
|
"params": None,
|
|
"timeout": 10.0,
|
|
},
|
|
{
|
|
"url": "http://state-hub.test/sbom/status",
|
|
"params": {"repo": "activity-core"},
|
|
"timeout": 10.0,
|
|
},
|
|
]
|
|
|
|
|
|
def test_resolver_failure_returns_empty(monkeypatch) -> None:
|
|
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
|
raise httpx.ConnectError("offline")
|
|
|
|
monkeypatch.setattr(httpx, "get", fake_get)
|
|
|
|
assert StateHubContextResolver().resolve("state_summary", None, {}) == {}
|
|
|
|
|
|
def test_unknown_query_returns_empty() -> None:
|
|
assert StateHubContextResolver().resolve("unknown", None, {}) == {}
|