From 054a48dce360ba2d4f6f4809932a47b62cf556c9 Mon Sep 17 00:00:00 2001 From: Robert Segal Date: Tue, 30 Sep 2025 13:37:24 -0600 Subject: [PATCH] Added audit records endpoints --- mpt_api_client/resources/audit/audit.py | 26 +++++++++++ mpt_api_client/resources/audit/records.py | 26 +++++++++++ setup.cfg | 1 + tests/resources/audit/test_audit.py | 56 +++++++++++++++++++++++ tests/resources/audit/test_records.py | 23 ++++++++++ 5 files changed, 132 insertions(+) create mode 100644 mpt_api_client/resources/audit/audit.py create mode 100644 mpt_api_client/resources/audit/records.py create mode 100644 tests/resources/audit/test_audit.py create mode 100644 tests/resources/audit/test_records.py diff --git a/mpt_api_client/resources/audit/audit.py b/mpt_api_client/resources/audit/audit.py new file mode 100644 index 00000000..a560ca54 --- /dev/null +++ b/mpt_api_client/resources/audit/audit.py @@ -0,0 +1,26 @@ +from mpt_api_client.http import AsyncHTTPClient, HTTPClient +from mpt_api_client.resources.audit.records import AsyncRecordsService, RecordsService + + +class Audit: + """Audit MPT API Module.""" + + def __init__(self, *, http_client: HTTPClient): + self.http_client = http_client + + @property + def records(self) -> RecordsService: + """Records service.""" + return RecordsService(http_client=self.http_client) + + +class AsyncAudit: + """Async Audit MPT API Module.""" + + def __init__(self, *, http_client: AsyncHTTPClient): + self.http_client = http_client + + @property + def records(self) -> AsyncRecordsService: + """Records service.""" + return AsyncRecordsService(http_client=self.http_client) diff --git a/mpt_api_client/resources/audit/records.py b/mpt_api_client/resources/audit/records.py new file mode 100644 index 00000000..a7afd4a6 --- /dev/null +++ b/mpt_api_client/resources/audit/records.py @@ -0,0 +1,26 @@ +from mpt_api_client.http import AsyncService, Service +from mpt_api_client.http.mixins import ( + AsyncCreateMixin, + CreateMixin, +) +from mpt_api_client.models import Model + + +class Record(Model): + """Record resource.""" + + +class RecordsServiceConfig: + """Records service configuration.""" + + _endpoint = "/public/v1/audit/records" + _model_class = Record + _collection_key = "data" + + +class RecordsService(CreateMixin[Record], Service[Record], RecordsServiceConfig): + """Records service.""" + + +class AsyncRecordsService(AsyncCreateMixin[Record], AsyncService[Record], RecordsServiceConfig): + """Async records service.""" diff --git a/setup.cfg b/setup.cfg index 8fecc790..d2737428 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,6 +32,7 @@ extend-ignore = per-file-ignores = + mpt_api_client/resources/audit/*.py: WPS215 mpt_api_client/resources/billing/*.py: WPS215 WPS202 WPS214 WPS204 mpt_api_client/resources/catalog/*.py: WPS110 WPS215 WPS214 mpt_api_client/resources/commerce/*.py: WPS215 diff --git a/tests/resources/audit/test_audit.py b/tests/resources/audit/test_audit.py new file mode 100644 index 00000000..06c24fde --- /dev/null +++ b/tests/resources/audit/test_audit.py @@ -0,0 +1,56 @@ +import pytest + +from mpt_api_client.resources.audit.audit import AsyncAudit, Audit +from mpt_api_client.resources.audit.records import AsyncRecordsService, RecordsService + + +@pytest.fixture +def audit(http_client): + return Audit(http_client=http_client) + + +@pytest.fixture +def async_audit(async_http_client): + return AsyncAudit(http_client=async_http_client) + + +@pytest.mark.parametrize( + ("property_name", "expected_service_class"), + [ + ("records", RecordsService), + ], +) +def test_audit_properties(audit, property_name, expected_service_class): + """Test that Audit properties return correct instances.""" + service = getattr(audit, property_name) + + assert isinstance(service, expected_service_class) + assert service.http_client is audit.http_client + + +@pytest.mark.parametrize( + ("property_name", "expected_service_class"), + [ + ("records", AsyncRecordsService), + ], +) +def test_async_audit_properties(async_audit, property_name, expected_service_class): + """Test that AsyncAudit properties return correct instances.""" + service = getattr(async_audit, property_name) + + assert isinstance(service, expected_service_class) + assert service.http_client is async_audit.http_client + + +def test_audit_initialization(http_client): + audit = Audit(http_client=http_client) + + assert audit.http_client is http_client + assert isinstance(audit, Audit) + + +def test_async_audit_initialization(async_http_client): + async_audit = AsyncAudit(http_client=async_http_client) + + assert async_audit.http_client is async_http_client + assert isinstance(async_audit, AsyncAudit) diff --git a/tests/resources/audit/test_records.py b/tests/resources/audit/test_records.py new file mode 100644 index 00000000..f820a26f --- /dev/null +++ b/tests/resources/audit/test_records.py @@ -0,0 +1,23 @@ +import pytest + +from mpt_api_client.resources.audit.records import AsyncRecordsService, RecordsService + + +@pytest.fixture +def records_service(http_client): + return RecordsService(http_client=http_client) + + +@pytest.fixture +def async_records_service(async_http_client): + return AsyncRecordsService(http_client=async_http_client) + + +@pytest.mark.parametrize("method", ["get", "create"]) +def test_mixins_present(records_service, method): + assert hasattr(records_service, method) + + +@pytest.mark.parametrize("method", ["get", "create"]) +def test_async_mixins_present(async_records_service, method): + assert hasattr(async_records_service, method)