Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions mpt_api_client/resources/accounts/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
UpdateMixin,
)
from mpt_api_client.models import Model
from mpt_api_client.resources.accounts.accounts_users import (
AccountsUsersService,
AsyncAccountsUsersService,
)
from mpt_api_client.resources.accounts.mixins import (
ActivatableMixin,
AsyncActivatableMixin,
Expand Down Expand Up @@ -39,6 +43,12 @@ class AccountsService(
):
"""Accounts service."""

def users(self, account_id: str) -> AccountsUsersService:
"""Return account users service."""
return AccountsUsersService(
http_client=self.http_client, endpoint_params={"account_id": account_id}
)


class AsyncAccountsService(
AsyncCreateMixin[Account],
Expand All @@ -50,3 +60,9 @@ class AsyncAccountsService(
AccountsServiceConfig,
):
"""Async Accounts service."""

def users(self, account_id: str) -> AsyncAccountsUsersService:
"""Return account users service."""
return AsyncAccountsUsersService(
http_client=self.http_client, endpoint_params={"account_id": account_id}
)
48 changes: 48 additions & 0 deletions mpt_api_client/resources/accounts/accounts_users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from mpt_api_client.http import AsyncService, Service
from mpt_api_client.http.mixins import (
AsyncCreateMixin,
AsyncDeleteMixin,
AsyncUpdateMixin,
CreateMixin,
DeleteMixin,
UpdateMixin,
)
from mpt_api_client.models import Model
from mpt_api_client.resources.accounts.mixins import (
AsyncInvitableMixin,
InvitableMixin,
)


class AccountsUser(Model):
"""Account User Model."""


class AccountsUsersServiceConfig:
"""Account Users Service Configuration."""

_endpoint = "/public/v1/accounts/accounts/{account_id}/users"
_model_class = AccountsUser
_collection_key = "data"


class AccountsUsersService(
UpdateMixin[AccountsUser],
DeleteMixin,
CreateMixin[AccountsUser],
InvitableMixin[AccountsUser],
Service[AccountsUser],
AccountsUsersServiceConfig,
):
"""Account Users Service."""


class AsyncAccountsUsersService(
AsyncUpdateMixin[AccountsUser],
AsyncDeleteMixin,
AsyncCreateMixin[AccountsUser],
AsyncService[AccountsUser],
AsyncInvitableMixin[AccountsUser],
AccountsUsersServiceConfig,
):
"""Asynchronous Account Users Service."""
80 changes: 80 additions & 0 deletions mpt_api_client/resources/accounts/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,43 @@ def unblock(self, resource_id: str, resource_data: ResourceData | None = None) -
)


class InvitableMixin[Model]:
"""Invitable mixin for sending and managing invites for resources."""

def accept_invite(self, resource_id: str, resource_data: ResourceData | None = None) -> Model:
"""Accept an invite for a resource.

Args:
resource_id: Resource ID
resource_data: Resource data will be updated
"""
return self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "accept-invite", json=resource_data
)

def resend_invite(self, resource_id: str, resource_data: ResourceData | None = None) -> Model:
"""Resend an invite to a resource.

Args:
resource_id: Resource ID
resource_data: Resource data will be updated
"""
return self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "resend-invite", json=resource_data
)

def send_new_invite(self, resource_id: str, resource_data: ResourceData | None = None) -> Model:
"""Send a new invite to a resource.

Args:
resource_id: Resource ID
resource_data: Resource data will be updated
"""
return self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "send-new-invite", json=resource_data
)


class AsyncActivatableMixin[Model]:
"""Async activatable mixin for activating, enabling, disabling and deactivating resources."""

Expand Down Expand Up @@ -190,3 +227,46 @@ async def unblock(self, resource_id: str, resource_data: ResourceData | None = N
return await self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "unblock", json=resource_data
)


class AsyncInvitableMixin[Model]:
"""Asynchronous Invitable mixin for sending and managing invites for resources."""

async def accept_invite(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Model:
"""Accept an invite for a resource.

Args:
resource_id: Resource ID
resource_data: Resource data will be updated
"""
return await self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "accept-invite", json=resource_data
)

async def resend_invite(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Model:
"""Resend an invite to a resource.

Args:
resource_id: Resource ID
resource_data: Resource data will be updated
"""
return await self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "resend-invite", json=resource_data
)

async def send_new_invite(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Model:
"""Send a new invite to a resource.

Args:
resource_id: Resource ID
resource_data: Resource data will be updated
"""
return await self._resource_action( # type: ignore[attr-defined, no-any-return]
resource_id, "POST", "send-new-invite", json=resource_data
)
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ per-file-ignores =
tests/http/test_service.py: WPS204 WPS202
tests/http/test_mixins.py: WPS204 WPS202
tests/resources/catalog/test_products.py: WPS202 WPS210
tests/resources/*/test_mixins.py: WPS118 WPS202 WPS204
tests/resources/*/test_mixins.py: WPS118 WPS202 WPS204 WPS235
tests/test_mpt_client.py: WPS235

tests/*:
Expand Down
44 changes: 44 additions & 0 deletions tests/resources/accounts/test_account.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import pytest

from mpt_api_client.resources.accounts.account import AccountsService, AsyncAccountsService
from mpt_api_client.resources.accounts.accounts_users import (
AccountsUsersService,
AsyncAccountsUsersService,
)


@pytest.fixture
Expand All @@ -13,6 +17,20 @@ def async_account_service(async_http_client):
return AsyncAccountsService(http_client=async_http_client)


@pytest.fixture
def accounts_users_service(http_client):
return AccountsUsersService(
http_client=http_client, endpoint_params={"account_id": "ACC-0000-0001"}
)


@pytest.fixture
def async_accounts_users_service(async_http_client):
return AsyncAccountsUsersService(
http_client=async_http_client, endpoint_params={"account_id": "ACC-0000-0001"}
)


@pytest.mark.parametrize(
"method", ["get", "create", "update", "enable", "disable", "activate", "deactivate", "validate"]
)
Expand All @@ -25,3 +43,29 @@ def test_mixins_present(account_service, method):
)
def test_async_mixins_present(async_account_service, method):
assert hasattr(async_account_service, method)


@pytest.mark.parametrize(
("service_method", "expected_service_class"),
[
("users", AccountsUsersService),
],
)
def test_property_services(account_service, service_method, expected_service_class):
service = getattr(account_service, service_method)("ACC-0000-0001")

assert isinstance(service, expected_service_class)
assert service.endpoint_params == {"account_id": "ACC-0000-0001"}


@pytest.mark.parametrize(
("service_method", "expected_service_class"),
[
("users", AsyncAccountsUsersService),
],
)
def test_async_property_services(async_account_service, service_method, expected_service_class):
service = getattr(async_account_service, service_method)("ACC-0000-0001")

assert isinstance(service, expected_service_class)
assert service.endpoint_params == {"account_id": "ACC-0000-0001"}
46 changes: 46 additions & 0 deletions tests/resources/accounts/test_accounts_users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import pytest

from mpt_api_client.resources.accounts.accounts_users import (
AccountsUsersService,
AsyncAccountsUsersService,
)


@pytest.fixture
def accounts_users_service(http_client):
return AccountsUsersService(
http_client=http_client, endpoint_params={"account_id": "ACC-0000-0001"}
)


@pytest.fixture
def async_accounts_users_service(async_http_client):
return AsyncAccountsUsersService(
http_client=async_http_client, endpoint_params={"account_id": "ACC-0000-0001"}
)


def test_endpoint(accounts_users_service):
assert accounts_users_service.endpoint == "/public/v1/accounts/accounts/ACC-0000-0001/users"


def test_async_endpoint(async_accounts_users_service):
assert (
async_accounts_users_service.endpoint == "/public/v1/accounts/accounts/ACC-0000-0001/users"
)


@pytest.mark.parametrize(
"method",
["get", "create", "update", "accept_invite", "resend_invite", "send_new_invite"],
)
def test_methods_present(accounts_users_service, method):
assert hasattr(accounts_users_service, method)


@pytest.mark.parametrize(
"method",
["get", "create", "update", "accept_invite", "resend_invite", "send_new_invite"],
)
def test_async_methods_present(async_accounts_users_service, method):
assert hasattr(async_accounts_users_service, method)
Loading