import httpx import pytest from agent.firefly import FireflyClient, FireflyError def make_client(handler) -> FireflyClient: return FireflyClient( "http://firefly.test", "tok", transport=httpx.MockTransport(handler) ) def test_about_sends_bearer_token_and_returns_data(): def handler(request: httpx.Request) -> httpx.Response: assert request.headers["Authorization"] == "Bearer tok" assert request.headers["Accept"] == "application/json" assert request.url.path == "/api/v1/about" return httpx.Response(200, json={"data": {"version": "6.1.1"}}) assert make_client(handler).about() == {"version": "6.1.1"} def test_non_200_raises_firefly_error_with_status(): def handler(request: httpx.Request) -> httpx.Response: return httpx.Response(401, json={"message": "Unauthenticated"}) with pytest.raises(FireflyError, match="401"): make_client(handler).about() def test_accounts_walks_all_pages(): def handler(request: httpx.Request) -> httpx.Response: assert request.url.path == "/api/v1/accounts" assert request.url.params["type"] == "asset" page = int(request.url.params.get("page", "1")) data = { 1: [{"id": "1", "attributes": {"name": "NFCU Checking"}}], 2: [{"id": "2", "attributes": {"name": "Venmo"}}], }[page] return httpx.Response( 200, json={ "data": data, "meta": {"pagination": {"total_pages": 2, "current_page": page}}, }, ) accounts = make_client(handler).accounts() assert [a["attributes"]["name"] for a in accounts] == ["NFCU Checking", "Venmo"]