diff --git a/tests/test_companion_pairing.py b/tests/test_companion_pairing.py index d7ec04d..f604d01 100644 --- a/tests/test_companion_pairing.py +++ b/tests/test_companion_pairing.py @@ -62,7 +62,7 @@ for _name, _attrs in { from fastapi import HTTPException # noqa: E402 import companion.pairing as P # noqa: E402 -import companion.routes as companion_routes # noqa: E402 +import companion.routes as R # noqa: E402 from companion.routes import mint_pairing_token, setup_companion_routes # noqa: E402 from core.middleware import require_admin # noqa: E402 @@ -159,14 +159,32 @@ def _pair_methods(): return methods -def _pair_endpoint(method): - router = setup_companion_routes() - for r in router.routes: - if getattr(r, "path", "").endswith("/pair") and method in getattr(r, "methods", set()): - return r.endpoint +def _pair_route(method): + for route in setup_companion_routes().routes: + path = getattr(route, "path", "") + if path.endswith("/pair") and method in getattr(route, "methods", set()): + return route.endpoint raise AssertionError(f"{method} /api/companion/pair route not found") +def _fake_pair_request(format=None, port=7000): + query_params = {} + if format is not None: + query_params["format"] = format + return SimpleNamespace( + state=SimpleNamespace(current_user="alice", api_token=False), + headers={}, + app=SimpleNamespace( + state=SimpleNamespace( + auth_manager=_admin_mgr(True), + invalidate_token_cache=MagicMock(), + ) + ), + query_params=query_params, + url=SimpleNamespace(port=port), + ) + + def test_pair_is_minted_via_post_not_get(): methods = _pair_methods() assert "POST" in methods, "pairing must accept POST (the mint)" @@ -176,7 +194,87 @@ def test_pair_is_minted_via_post_not_get(): def test_pair_page_uses_imported_admin_gate(monkeypatch): - monkeypatch.setattr(companion_routes, "require_admin", lambda request: None) - response = _pair_endpoint("GET")(SimpleNamespace()) + monkeypatch.setattr(R, "require_admin", lambda request: None) + response = _pair_route("GET")(SimpleNamespace()) assert "Pair a device" in str(getattr(response, "body", response)) + + +def test_pair_get_renders_form_without_minting(monkeypatch): + mint = MagicMock(side_effect=AssertionError("GET must not mint a token")) + monkeypatch.setattr(R, "require_admin", lambda request: None, raising=False) + monkeypatch.setattr(R, "mint_pairing_token", mint) + + response = _pair_route("GET")(_fake_pair_request()) + body = response.body.decode() + + assert response.media_type == "text/html" + assert '