From 9080b357db92dc5294a6e47e785d9cd14db197d0 Mon Sep 17 00:00:00 2001 From: Robert Segal Date: Mon, 29 Sep 2025 08:29:31 -0600 Subject: [PATCH] Added billing statement charges endpoints --- .../resources/billing/statement_charges.py | 28 +++++++++++++ .../resources/billing/statements.py | 18 ++++++++ .../billing/test_statement_charges.py | 42 +++++++++++++++++++ tests/resources/billing/test_statements.py | 30 +++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 mpt_api_client/resources/billing/statement_charges.py create mode 100644 tests/resources/billing/test_statement_charges.py diff --git a/mpt_api_client/resources/billing/statement_charges.py b/mpt_api_client/resources/billing/statement_charges.py new file mode 100644 index 00000000..4c7cd5eb --- /dev/null +++ b/mpt_api_client/resources/billing/statement_charges.py @@ -0,0 +1,28 @@ +from mpt_api_client.http import AsyncService, Service +from mpt_api_client.models import Model + + +class StatementCharge(Model): + """Statement Charge resource.""" + + +class StatementChargesServiceConfig: + """Statement Charges service configuration.""" + + _endpoint = "/public/v1/billing/statements/{statement_id}/charges" + _model_class = StatementCharge + _collection_key = "data" + + +class StatementChargesService( + Service[StatementCharge], + StatementChargesServiceConfig, +): + """Statement Charges service.""" + + +class AsyncStatementChargesService( + AsyncService[StatementCharge], + StatementChargesServiceConfig, +): + """Async Statement Charges service.""" diff --git a/mpt_api_client/resources/billing/statements.py b/mpt_api_client/resources/billing/statements.py index 66e152cc..55465ec7 100644 --- a/mpt_api_client/resources/billing/statements.py +++ b/mpt_api_client/resources/billing/statements.py @@ -2,6 +2,10 @@ from mpt_api_client.http.mixins import AsyncUpdateMixin, UpdateMixin from mpt_api_client.models import Model from mpt_api_client.resources.billing.mixins import AsyncIssuableMixin, IssuableMixin +from mpt_api_client.resources.billing.statement_charges import ( + AsyncStatementChargesService, + StatementChargesService, +) class Statement(Model): @@ -24,6 +28,13 @@ class StatementsService( ): """Statements service.""" + def charges(self, statement_id: str) -> StatementChargesService: + """Return statement charges service.""" + return StatementChargesService( + http_client=self.http_client, + endpoint_params={"statement_id": statement_id}, + ) + class AsyncStatementsService( AsyncUpdateMixin[Statement], @@ -32,3 +43,10 @@ class AsyncStatementsService( StatementsServiceConfig, ): """Async Statements service.""" + + def charges(self, statement_id: str) -> AsyncStatementChargesService: + """Return statement charges service.""" + return AsyncStatementChargesService( + http_client=self.http_client, + endpoint_params={"statement_id": statement_id}, + ) diff --git a/tests/resources/billing/test_statement_charges.py b/tests/resources/billing/test_statement_charges.py new file mode 100644 index 00000000..b52c7576 --- /dev/null +++ b/tests/resources/billing/test_statement_charges.py @@ -0,0 +1,42 @@ +import pytest + +from mpt_api_client.resources.billing.statement_charges import ( + AsyncStatementChargesService, + StatementChargesService, +) + + +@pytest.fixture +def statement_charges_service(http_client): + return StatementChargesService( + http_client=http_client, endpoint_params={"statement_id": "STM-0000-0001"} + ) + + +@pytest.fixture +def async_statement_charges_service(async_http_client): + return AsyncStatementChargesService( + http_client=async_http_client, endpoint_params={"statement_id": "STM-0000-0001"} + ) + + +def test_endpoint(statement_charges_service): + assert statement_charges_service.endpoint == ( + "/public/v1/billing/statements/STM-0000-0001/charges" + ) + + +def test_async_endpoint(async_statement_charges_service): + assert async_statement_charges_service.endpoint == ( + "/public/v1/billing/statements/STM-0000-0001/charges" + ) + + +@pytest.mark.parametrize("method", ["get"]) +def test_methods_present(statement_charges_service, method): + assert hasattr(statement_charges_service, method) + + +@pytest.mark.parametrize("method", ["get"]) +def test_async_methods_present(async_statement_charges_service, method): + assert hasattr(async_statement_charges_service, method) diff --git a/tests/resources/billing/test_statements.py b/tests/resources/billing/test_statements.py index 629838ce..569d2b4e 100644 --- a/tests/resources/billing/test_statements.py +++ b/tests/resources/billing/test_statements.py @@ -1,5 +1,9 @@ import pytest +from mpt_api_client.resources.billing.statement_charges import ( + AsyncStatementChargesService, + StatementChargesService, +) from mpt_api_client.resources.billing.statements import AsyncStatementsService, StatementsService @@ -27,3 +31,29 @@ def test_mixins_present(statements_service, method): ) def test_async_mixins_present(async_statements_service, method): assert hasattr(async_statements_service, method) + + +@pytest.mark.parametrize( + ("service_method", "expected_service_class"), + [ + ("charges", StatementChargesService), + ], +) +def test_property_services(statements_service, service_method, expected_service_class): + service = getattr(statements_service, service_method)("STM-0000-0001") + + assert isinstance(service, expected_service_class) + assert service.endpoint_params == {"statement_id": "STM-0000-0001"} + + +@pytest.mark.parametrize( + ("service_method", "expected_service_class"), + [ + ("charges", AsyncStatementChargesService), + ], +) +def test_async_property_services(async_statements_service, service_method, expected_service_class): + service = getattr(async_statements_service, service_method)("STM-0000-0001") + + assert isinstance(service, expected_service_class) + assert service.endpoint_params == {"statement_id": "STM-0000-0001"}