(mailbox) allow to activate mailbox

We send a request to dimail API and change mailbox status to enabled.
This commit is contained in:
Sabrina Demagny
2024-11-26 12:26:54 +01:00
parent a6f409f6ed
commit 02c6048d2c
4 changed files with 132 additions and 0 deletions

View File

@@ -10,6 +10,7 @@ and this project adheres to
### Added
- ✨(mailbox) allow to activate mailbox
- ✨(mailbox) allow to disable mailbox
- ✨(backend) add ServiceProvider #522
- 💄(admin) allow header color customization #552

View File

@@ -201,6 +201,9 @@ class MailBoxViewSet(
POST /api/<version>/mail-domains/<domain_slug>/mailboxes/<mailbox_id>/disable/
Send a request to dimail to disable mailbox and change status of the mailbox in our DB
POST /api/<version>/mail-domains/<domain_slug>/mailboxes/<mailbox_id>/enable/
Send a request to dimail to enable mailbox and change status of the mailbox in our DB
"""
permission_classes = [permissions.MailBoxPermission]
@@ -234,3 +237,13 @@ class MailBoxViewSet(
mailbox.status = enums.MailboxStatusChoices.DISABLED
mailbox.save()
return Response(serializers.MailboxSerializer(mailbox).data)
@action(detail=True, methods=["post"])
def enable(self, request, domain_slug, pk=None): # pylint: disable=unused-argument
"""Enable mailbox. Send a request to dimail and change status in our DB"""
mailbox = self.get_object()
client = DimailAPIClient()
client.enable_mailbox(mailbox, request.user.sub)
mailbox.status = enums.MailboxStatusChoices.ENABLED
mailbox.save()
return Response(serializers.MailboxSerializer(mailbox).data)

View File

@@ -0,0 +1,99 @@
"""
Unit tests for the mailbox API
"""
import re
import pytest
import responses
from rest_framework import status
from rest_framework.test import APIClient
from core import factories as core_factories
from mailbox_manager import enums, factories, models
pytestmark = pytest.mark.django_db
def test_api_mailboxes__enable_anonymous_forbidden():
"""Anonymous users should not be able to enable a mailbox via the API."""
mailbox = factories.MailboxFactory(status=enums.MailboxStatusChoices.DISABLED)
response = APIClient().post(
f"/api/v1.0/mail-domains/{mailbox.domain.slug}/mailboxes/{mailbox.pk}/enable/",
)
assert response.status_code == status.HTTP_401_UNAUTHORIZED
assert models.Mailbox.objects.get().status == enums.MailboxStatusChoices.DISABLED
def test_api_mailboxes__enable_authenticated_failure():
"""Authenticated users should not be able to enable mailbox
without specific role on mail domain."""
user = core_factories.UserFactory()
client = APIClient()
client.force_login(user)
mailbox = factories.MailboxFactory(status=enums.MailboxStatusChoices.DISABLED)
response = client.post(
f"/api/v1.0/mail-domains/{mailbox.domain.slug}/mailboxes/{mailbox.pk}/enable/",
)
assert response.status_code == status.HTTP_403_FORBIDDEN
assert models.Mailbox.objects.get().status == enums.MailboxStatusChoices.DISABLED
def test_api_mailboxes__enable_viewer_failure():
"""Users with viewer role should not be able to enable mailbox on the mail domain."""
mailbox = factories.MailboxFactory(status=enums.MailboxStatusChoices.DISABLED)
access = factories.MailDomainAccessFactory(
role=enums.MailDomainRoleChoices.VIEWER, domain=mailbox.domain
)
client = APIClient()
client.force_login(access.user)
response = client.post(
f"/api/v1.0/mail-domains/{mailbox.domain.slug}/mailboxes/{mailbox.pk}/enable/",
)
assert response.status_code == status.HTTP_403_FORBIDDEN
assert models.Mailbox.objects.get().status == enums.MailboxStatusChoices.DISABLED
@pytest.mark.parametrize(
"role",
[enums.MailDomainRoleChoices.OWNER, enums.MailDomainRoleChoices.ADMIN],
)
def test_api_mailboxes__enable_roles_success(role):
"""Users with owner or admin role should be able to enable mailbox on the mail domain."""
mailbox = factories.MailboxFactory(status=enums.MailboxStatusChoices.DISABLED)
access = factories.MailDomainAccessFactory(role=role, domain=mailbox.domain)
client = APIClient()
client.force_login(access.user)
with responses.RequestsMock() as rsps:
# Ensure successful response using "responses":
rsps.add(
rsps.GET,
re.compile(r".*/token/"),
body='{"access_token": "domain_owner_token"}',
status=status.HTTP_200_OK,
content_type="application/json",
)
rsps.add(
rsps.PATCH,
re.compile(
rf".*/domains/{mailbox.domain.name}/mailboxes/{mailbox.local_part}"
),
status=status.HTTP_200_OK,
content_type="application/json",
)
response = client.post(
f"/api/v1.0/mail-domains/{mailbox.domain.slug}/mailboxes/{mailbox.pk}/enable/",
)
assert response.status_code == status.HTTP_200_OK
mailbox = models.Mailbox.objects.get()
assert mailbox.status == enums.MailboxStatusChoices.ENABLED

View File

@@ -291,3 +291,22 @@ class DimailAPIClient:
)
return response
return self.raise_exception_for_unexpected_response(response)
def enable_mailbox(self, mailbox, user_sub=None):
"""Send a request to enable a mailbox to dimail API"""
response = session.patch(
f"{self.API_URL}/domains/{mailbox.domain.name}/mailboxes/{mailbox.local_part}",
json={"active": "yes"},
headers=self.get_headers(user_sub),
verify=True,
timeout=10,
)
if response.status_code == status.HTTP_200_OK:
logger.info(
"Mailbox %s successfully enabled on domain %s by user %s",
str(mailbox),
str(mailbox.domain),
user_sub,
)
return response
return self.raise_exception_for_unexpected_response(response)