Enhance EasybillClient and AsyncEasybillClient with new methods for customer and document management, and add unit tests for client functionality.

This commit is contained in:
claudi 2026-04-17 10:31:28 +02:00
parent caacb339dd
commit b324671286
4 changed files with 295 additions and 10 deletions

123
tests/test_client_facade.py Normal file
View file

@ -0,0 +1,123 @@
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"