(admin) send pending mailboxes from admin

Provides an admin action to send all pending mailboxes for an active domain.
This allows quick fixes when mailboxes fell out of sync.
This commit is contained in:
Marie PUPO JEAMMET
2025-05-07 11:42:13 +02:00
committed by Marie
parent fe9fb67fed
commit 6e792986be
4 changed files with 141 additions and 22 deletions

View File

@@ -204,3 +204,83 @@ def test_fetch_domain_expected_config__should_not_fetch_for_disabled_domain(clie
assert "Domains disabled are excluded from fetch" in response.content.decode(
"utf-8"
)
@responses.activate
@pytest.mark.django_db
def test_send_pending_mailboxes(client):
"""Test admin action to send pending mailboxes to dimail."""
admin = core_factories.UserFactory(is_staff=True, is_superuser=True)
client.force_login(admin)
domain = factories.MailDomainFactory(status=enums.MailDomainStatusChoices.ENABLED)
mailboxes = factories.MailboxFactory.create_batch(
3, status=enums.MailboxStatusChoices.PENDING, domain=domain
)
data = {
"action": "send_pending_mailboxes",
"_selected_action": [domain.id],
}
url = reverse("admin:mailbox_manager_maildomain_changelist")
for mailbox in mailboxes:
responses.add(
responses.GET,
re.compile(r".*/token/"),
body=TOKEN_OK,
status=status.HTTP_200_OK,
content_type="application/json",
)
responses.add(
responses.POST,
re.compile(rf".*/domains/{domain.name}/mailboxes/"),
body=response_mailbox_created(f"{mailbox.local_part}@{domain.name}"),
status=status.HTTP_201_CREATED,
content_type="application/json",
)
response = client.post(url, data, follow=True)
assert response.status_code == status.HTTP_200_OK
for mailbox in mailboxes:
mailbox.refresh_from_db()
assert mailbox.status == enums.MailboxStatusChoices.ENABLED
@responses.activate
@pytest.mark.django_db
def test_send_pending_mailboxes__listing_failed_mailboxes(client):
"""Test admin action to send pending mailboxes to dimail."""
admin = core_factories.UserFactory(is_staff=True, is_superuser=True)
client.force_login(admin)
domain = factories.MailDomainFactory(status=enums.MailDomainStatusChoices.ENABLED)
mailbox = factories.MailboxFactory(
status=enums.MailboxStatusChoices.PENDING, domain=domain
)
data = {
"action": "send_pending_mailboxes",
"_selected_action": [domain.id],
}
url = reverse("admin:mailbox_manager_maildomain_changelist")
responses.add(
responses.GET,
re.compile(r".*/token/"),
body=TOKEN_OK,
status=status.HTTP_200_OK,
content_type="application/json",
)
responses.add(
responses.POST,
re.compile(rf".*/domains/{domain.name}/mailboxes/"),
body=response_mailbox_created(f"{mailbox.local_part}@{domain.name}"),
status=status.HTTP_409_CONFLICT,
content_type="application/json",
)
response = client.post(url, data, follow=True)
assert response.status_code == status.HTTP_200_OK
assert (
f"Failed to send the following mailboxes : {str(mailbox)}"
in response.content.decode("utf-8")
)
mailbox.refresh_from_db()
assert mailbox.status == enums.MailboxStatusChoices.PENDING

View File

@@ -348,9 +348,9 @@ def test_dimail__fetch_domain_status__full_fix_scenario(domain_status):
assert domain.last_check_details == body_domain_ok
def test_dimail__enable_pending_mailboxes(caplog):
def test_dimail__send_pending_mailboxes(caplog):
"""Status of pending mailboxes should switch to "enabled"
when calling enable_pending_mailboxes."""
when calling send_pending_mailboxes."""
caplog.set_level(logging.INFO)
domain = factories.MailDomainFactory()
@@ -380,7 +380,7 @@ def test_dimail__enable_pending_mailboxes(caplog):
status=status.HTTP_201_CREATED,
content_type="application/json",
)
dimail_client.enable_pending_mailboxes(domain=domain)
dimail_client.send_pending_mailboxes(domain=domain)
mailbox1.refresh_from_db()
mailbox2.refresh_from_db()