From 7379d703213cc1a770d71aa1e89eb7922d059bd5 Mon Sep 17 00:00:00 2001 From: Laurent Bossavit Date: Sat, 15 Feb 2025 15:09:36 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B(communes)=20add=20missing=20user?= =?UTF-8?q?=20creation=20in=20domain=20provisioning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add user in Dimail for automatically provisioned domains. --- src/backend/plugins/organizations.py | 48 ++++++++++++++----- .../organizations/test_commune_creation.py | 35 +++++++++++++- .../app-desk/domain-provisioning.spec.ts | 4 +- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/backend/plugins/organizations.py b/src/backend/plugins/organizations.py index a4fae76..c3d29de 100644 --- a/src/backend/plugins/organizations.py +++ b/src/backend/plugins/organizations.py @@ -192,7 +192,7 @@ class CommuneCreation(BaseOrganizationPlugin): create_domain = ApiCall() create_domain.method = "POST" create_domain.base = settings.MAIL_PROVISIONING_API_URL - create_domain.url = "/domains" + create_domain.url = "/domains/" create_domain.params = { "name": zone_name, "delivery": "virtual", @@ -259,6 +259,36 @@ class CommuneCreation(BaseOrganizationPlugin): last_task = self.complete_zone_creation(tasks[-1]) last_task.execute() + def complete_grant_access(self, sub, zone_name): + """Specify the tasks to be completed after making a user admin""" + create_user = ApiCall() + create_user.method = "POST" + create_user.base = settings.MAIL_PROVISIONING_API_URL + create_user.url = "/users/" + create_user.params = { + "name": sub, + "password": "no", + "is_admin": False, + "perms": [], + } + create_user.headers = { + "Authorization": f"Basic {settings.MAIL_PROVISIONING_API_CREDENTIALS}" + } + + grant_access = ApiCall() + grant_access.method = "POST" + grant_access.base = settings.MAIL_PROVISIONING_API_URL + grant_access.url = "/allows/" + grant_access.params = { + "user": sub, + "domain": zone_name, + } + grant_access.headers = { + "Authorization": f"Basic {settings.MAIL_PROVISIONING_API_CREDENTIALS}" + } + + return [create_user, grant_access] + def run_after_grant_access(self, organization_access): """After granting an organization access, check for needed domain access grant.""" orga = organization_access.organization @@ -274,15 +304,7 @@ class CommuneCreation(BaseOrganizationPlugin): MailDomainAccess.objects.create( domain=domain, user=user, role=MailDomainRoleChoices.OWNER ) - grant_access = ApiCall() - grant_access.method = "POST" - grant_access.base = settings.MAIL_PROVISIONING_API_URL - grant_access.url = "/allows" - grant_access.params = { - "user": user.sub, - "domain": zone_name, - } - grant_access.headers = { - "Authorization": f"Basic {settings.MAIL_PROVISIONING_API_CREDENTIALS}" - } - grant_access.execute() + + tasks = self.complete_grant_access(user.sub, zone_name) + for task in tasks: + task.execute() diff --git a/src/backend/plugins/tests/organizations/test_commune_creation.py b/src/backend/plugins/tests/organizations/test_commune_creation.py index b326329..d272448 100644 --- a/src/backend/plugins/tests/organizations/test_commune_creation.py +++ b/src/backend/plugins/tests/organizations/test_commune_creation.py @@ -86,7 +86,7 @@ def test_tasks_on_commune_creation_include_dimail_domain_creation(): tasks = plugin.complete_commune_creation(name) assert tasks[1].base == settings.MAIL_PROVISIONING_API_URL - assert tasks[1].url == "/domains" + assert tasks[1].url == "/domains/" assert tasks[1].method == "POST" assert tasks[1].params == { "name": "merlaut.collectivite.fr", @@ -171,6 +171,39 @@ def test_tasks_on_commune_creation_include_dns_records(): ) +def test_tasks_on_grant_access(): + """Test the final tasks after making user admin of an org""" + plugin = CommuneCreation() + + tasks = plugin.complete_grant_access("some-sub", "mezos.collectivite.fr") + + assert tasks[0].base == settings.MAIL_PROVISIONING_API_URL + assert tasks[0].url == "/users/" + assert tasks[0].method == "POST" + assert tasks[0].params == { + "name": "some-sub", + "password": "no", + "is_admin": False, + "perms": [], + } + assert ( + tasks[0].headers["Authorization"] + == f"Basic {settings.MAIL_PROVISIONING_API_CREDENTIALS}" + ) + + assert tasks[1].base == settings.MAIL_PROVISIONING_API_URL + assert tasks[1].url == "/allows/" + assert tasks[1].method == "POST" + assert tasks[1].params == { + "user": "some-sub", + "domain": "mezos.collectivite.fr", + } + assert ( + tasks[1].headers["Authorization"] + == f"Basic {settings.MAIL_PROVISIONING_API_CREDENTIALS}" + ) + + def test_normalize_name(): """Test name normalization""" plugin = CommuneCreation() diff --git a/src/frontend/apps/e2e/__tests__/app-desk/domain-provisioning.spec.ts b/src/frontend/apps/e2e/__tests__/app-desk/domain-provisioning.spec.ts index 58c7f27..01f9766 100644 --- a/src/frontend/apps/e2e/__tests__/app-desk/domain-provisioning.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-desk/domain-provisioning.spec.ts @@ -8,7 +8,9 @@ test.beforeEach(async ({ page, browserName }) => { }); test.describe('When a commune, domain is created on first login via ProConnect', () => { - test('it checks the domain has been created', async ({ page }) => { + test('it checks the domain has been created and is operational', async ({ + page, + }) => { const header = page.locator('header').first(); await expect(header.getByAltText('Marianne Logo')).toBeVisible();