(domains) allow to run all fetch domain data from dimail

Fetch domain status and expected config from dimail.
This commit is contained in:
Sabrina Demagny
2025-02-16 17:57:58 +01:00
parent 38de864d68
commit cdb766b0e0
4 changed files with 158 additions and 3 deletions

View File

@@ -35,6 +35,9 @@ class MailDomainViewSet(
- name: str - name: str
- support_email: str - support_email: str
Return newly created domain Return newly created domain
POST /api/<version>/mail-domains/<domain-slug>/fetch/
Fetch domain status and expected config from dimail.
""" """
permission_classes = [permissions.AccessPermission] permission_classes = [permissions.AccessPermission]
@@ -61,6 +64,17 @@ class MailDomainViewSet(
} }
) )
@action(detail=True, methods=["post"], url_path="fetch")
def fetch_from_dimail(self, request, *args, **kwargs):
"""Fetch domain status and expected config from dimail."""
domain = self.get_object()
client = DimailAPIClient()
client.fetch_domain_status(domain)
client.fetch_domain_expected_config(domain)
return Response(
serializers.MailDomainSerializer(domain, context={"request": request}).data
)
# pylint: disable=too-many-ancestors # pylint: disable=too-many-ancestors
class MailDomainAccessViewSet( class MailDomainAccessViewSet(

View File

@@ -0,0 +1,143 @@
"""
Tests for MailDomains API endpoint in People's mailbox manager app. Focus on "fetch" action.
"""
import json
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
from mailbox_manager.tests.fixtures import dimail as dimail_fixtures
pytestmark = pytest.mark.django_db
@responses.activate
def test_api_mail_domains__fetch_from_dimail__anonymous():
"""
Anonymous users should not be allowed to fetch a domain from dimail.
"""
client = APIClient()
domain = factories.MailDomainFactory()
response = client.post(
f"/api/v1.0/mail-domains/{domain.slug}/fetch/",
)
assert response.status_code == status.HTTP_401_UNAUTHORIZED
@responses.activate
def test_api_mail_domains__fetch_from_dimail__unrelated():
"""
Authenticated users shouldn't be allowed to fetch
a domain from dimail if they are not an owner or admin.
"""
user = core_factories.UserFactory()
client = APIClient()
client.force_login(user)
domain = factories.MailDomainFactory(
status=enums.MailDomainStatusChoices.PENDING,
)
response = client.post(
f"/api/v1.0/mail-domains/{domain.slug}/fetch/",
)
assert response.status_code == status.HTTP_404_NOT_FOUND
def test_api_mail_domains__fetch_from_dimail__viewer():
"""
Authenticated users shouldn't be allowed to fetch a domain from dimail
if they are a viewer.
"""
user = core_factories.UserFactory()
client = APIClient()
client.force_login(user)
access = factories.MailDomainAccessFactory(
user=user,
role=enums.MailDomainRoleChoices.VIEWER,
)
response = client.post(
f"/api/v1.0/mail-domains/{access.domain.slug}/fetch/",
)
assert response.status_code == status.HTTP_403_FORBIDDEN
@pytest.mark.parametrize(
"role",
[
enums.MailDomainRoleChoices.ADMIN,
enums.MailDomainRoleChoices.OWNER,
],
)
@responses.activate
def test_api_mail_domains__fetch_from_dimail(role):
"""
Authenticated users should be allowed to fetch a domain
from dimail if they are an owner or admin.
"""
user = core_factories.UserFactory()
client = APIClient()
client.force_login(user)
domain = factories.MailDomainFactory(
status=enums.MailDomainStatusChoices.PENDING,
)
factories.MailDomainAccessFactory(
domain=domain,
user=user,
role=role,
)
assert domain.expected_config is None
assert domain.last_check_details is None
responses.add(
responses.GET,
re.compile(rf".*/domains/{domain.name}/check/"),
json=dimail_fixtures.CHECK_DOMAIN_OK,
status=200,
)
responses.add(
responses.GET,
re.compile(rf".*/domains/{domain.name}/spec/"),
json=dimail_fixtures.DOMAIN_SPEC,
status=200,
)
response = client.post(
f"/api/v1.0/mail-domains/{domain.slug}/fetch/",
)
domain.refresh_from_db()
assert response.status_code == status.HTTP_200_OK
assert response.json() == {
"id": str(domain.id),
"name": domain.name,
"slug": domain.slug,
"status": str(enums.MailDomainStatusChoices.ENABLED),
"created_at": domain.created_at.isoformat().replace("+00:00", "Z"),
"updated_at": domain.updated_at.isoformat().replace("+00:00", "Z"),
"abilities": domain.get_abilities(user),
"count_mailboxes": 0,
"support_email": domain.support_email,
"last_check_details": dimail_fixtures.CHECK_DOMAIN_OK,
"action_required_details": {},
"expected_config": dimail_fixtures.DOMAIN_SPEC,
}
assert domain.expected_config == dimail_fixtures.DOMAIN_SPEC
assert domain.last_check_details == dimail_fixtures.CHECK_DOMAIN_OK
assert domain.status == enums.MailDomainStatusChoices.ENABLED

View File

@@ -2,9 +2,6 @@
Tests for MailDomains API endpoint in People's mailbox manager app. Focus on "retrieve" action. Tests for MailDomains API endpoint in People's mailbox manager app. Focus on "retrieve" action.
""" """
import json
import re
import pytest import pytest
import responses import responses
from rest_framework import status from rest_framework import status

View File

@@ -431,6 +431,7 @@ class DimailAPIClient:
self.API_URL, self.API_URL,
exc_info=error, exc_info=error,
) )
raise error
if response.status_code == status.HTTP_200_OK: if response.status_code == status.HTTP_200_OK:
return response.json() return response.json()
return self.raise_exception_for_unexpected_response(response) return self.raise_exception_for_unexpected_response(response)