import httpx import pytest from easybill_client import AsyncEasybillClient, EasybillClient class MockSyncTransport(httpx.MockTransport): def __init__(self): super().__init__(self._handler) @staticmethod def _handler(request: httpx.Request) -> httpx.Response: if request.url.path == "/customers/1": return httpx.Response( 200, json={ "id": 1, "company_name": "ACME GmbH", "last_name": "Mustermann", "number": "K-100", }, ) if request.url.path == "/documents": return httpx.Response( 200, json={ "page": 1, "pages": 1, "limit": 100, "total": 1, "items": [ { "id": 10, "number": "RE-10", "customer_id": 1, "type": "INVOICE", "status": "DONE", "amount": 1999, "is_draft": False, } ], }, ) if request.url.path == "/webhooks" and request.method == "POST": body = request.read().decode() assert "document.completed" in body return httpx.Response( 201, json={ "id": 77, "url": "https://example.com/webhook", "description": "Connector Hub", "secret": "secret", "content_type": "json", "events": ["document.completed"], "is_active": True, }, ) return httpx.Response(404, json={"error": "not found"}) class MockAsyncTransport(httpx.MockTransport): def __init__(self): super().__init__(self._handler) @staticmethod def _handler(request: httpx.Request) -> httpx.Response: if request.url.path == "/customers": return httpx.Response( 200, json={ "page": 1, "pages": 1, "limit": 100, "total": 1, "items": [ { "id": 2, "company_name": "Example AG", "last_name": "Musterfrau", "number": "K-200", } ], }, ) return httpx.Response(404, json={"error": "not found"}) def test_sync_client_returns_customer_and_documents_as_models(): client = EasybillClient(api_key="token", transport=MockSyncTransport()) try: customer = client.get_customer(1) documents = client.list_documents() webhook = client.create_webhook( url="https://example.com/webhook", events=["document.completed"], secret="secret", description="Connector Hub", ) finally: client.close() assert customer.id == 1 assert customer.company_name == "ACME GmbH" assert documents.total == 1 assert documents.items[0].amount == 1999 assert webhook.id == 77 assert webhook.events == ["document.completed"] @pytest.mark.asyncio async def test_async_client_lists_customers_as_models(): client = AsyncEasybillClient(api_key="token", transport=MockAsyncTransport()) try: customers = await client.list_customers() finally: await client.aclose() assert customers.total == 1 assert customers.items[0].company_name == "Example AG"