Files
GibSend/packages/python-sdk/tests/test_resources.py
T
2026-03-08 00:59:40 +11:00

139 lines
4.2 KiB
Python

from typing import Any, Dict, List, Optional
from usesend import UseSend
class MockResponse:
def __init__(self, payload: Dict[str, Any], ok: bool = True, reason: str = "OK") -> None:
self._payload = payload
self.ok = ok
self.reason = reason
self.status_code = 200 if ok else 400
def json(self) -> Dict[str, Any]:
return self._payload
class MockSession:
def __init__(self, responses: List[MockResponse]) -> None:
self._responses = responses
self.calls: List[Dict[str, Any]] = []
def request(
self,
method: str,
url: str,
headers: Optional[Dict[str, str]] = None,
json: Optional[Any] = None,
) -> MockResponse:
self.calls.append(
{
"method": method,
"url": url,
"headers": headers,
"json": json,
}
)
return self._responses.pop(0)
def test_contact_books_list_uses_expected_path_and_returns_data() -> None:
session = MockSession(
[
MockResponse(
[
{
"id": "cb_123",
"name": "Newsletter Subscribers",
"teamId": 1,
"properties": {},
"variables": ["company"],
"emoji": "📙",
"doubleOptInEnabled": True,
"doubleOptInFrom": "Newsletter <hello@example.com>",
"doubleOptInSubject": "Please confirm your subscription",
"doubleOptInContent": "{}",
"createdAt": "2026-03-01T00:00:00.000Z",
"updatedAt": "2026-03-01T00:00:00.000Z",
"_count": {"contacts": 12},
}
]
)
]
)
client = UseSend("us_test", session=session)
data, err = client.contact_books.list()
assert err is None
assert data is not None
assert data[0]["variables"] == ["company"]
assert session.calls[0]["method"] == "GET"
assert session.calls[0]["url"].endswith("/api/v1/contactBooks")
def test_contact_books_alias_matches_js_style_client() -> None:
session = MockSession([MockResponse({"id": "cb_123", "name": "Book"})])
client = UseSend("us_test", session=session)
data, err = client.contactBooks.get("cb_123")
assert err is None
assert data is not None
assert data["id"] == "cb_123"
assert session.calls[0]["url"].endswith("/api/v1/contactBooks/cb_123")
def test_contacts_list_encodes_query_params() -> None:
session = MockSession([MockResponse([])])
client = UseSend("us_test", session=session)
data, err = client.contacts.list(
"cb_123",
emails="a@example.com,b@example.com",
page=2,
limit=50,
ids="ct_1,ct_2",
)
assert err is None
assert data == []
assert session.calls[0]["method"] == "GET"
assert session.calls[0]["url"].endswith(
"/api/v1/contactBooks/cb_123/contacts?emails=a%40example.com%2Cb%40example.com&page=2&limit=50&ids=ct_1%2Cct_2"
)
def test_contacts_bulk_methods_use_expected_payloads() -> None:
session = MockSession(
[
MockResponse({"message": "Contacts imported", "count": 2}),
MockResponse({"success": True, "count": 2}),
]
)
client = UseSend("us_test", session=session)
create_data, create_err = client.contacts.bulk_create(
"cb_123",
[
{"email": "a@example.com"},
{"email": "b@example.com", "firstName": "B"},
],
)
delete_data, delete_err = client.contacts.bulk_delete(
"cb_123",
{"contactIds": ["ct_1", "ct_2"]},
)
assert create_err is None
assert create_data == {"message": "Contacts imported", "count": 2}
assert delete_err is None
assert delete_data == {"success": True, "count": 2}
assert session.calls[0]["method"] == "POST"
assert session.calls[0]["json"] == [
{"email": "a@example.com"},
{"email": "b@example.com", "firstName": "B"},
]
assert session.calls[1]["method"] == "DELETE"
assert session.calls[1]["json"] == {"contactIds": ["ct_1", "ct_2"]}