From d4b3366ff3d6ead9e38d88e08196a27ce5417712 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 4 Feb 2022 12:03:35 +0100 Subject: [PATCH] Added unit tests --- modoboa/admin/api/v2/tests.py | 41 +++++++++++++++++++++ modoboa/admin/api/v2/viewsets.py | 2 +- modoboa/core/api/v2/tests.py | 52 +++++++++++++++++++++++++++ modoboa/core/tests/test_viewsets.py | 1 + test_project/test_project/settings.py | 3 +- 5 files changed, 97 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/api/v2/tests.py b/modoboa/admin/api/v2/tests.py index c273c1cc9..4705f117d 100644 --- a/modoboa/admin/api/v2/tests.py +++ b/modoboa/admin/api/v2/tests.py @@ -201,3 +201,44 @@ class AliasViewSetTestCase(ModoAPITestCase): resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertIn("address", resp.json()) + + +class UserAccountViewSetTestCase(ModoAPITestCase): + + @classmethod + def setUpTestData(cls): # NOQA:N802 + """Create test data.""" + super().setUpTestData() + factories.populate_database() + cls.da = core_models.User.objects.get(username="admin@test.com") + cls.da_token = Token.objects.create(user=cls.da) + + def test_forward(self): + self.client.credentials( + HTTP_AUTHORIZATION="Token " + self.da_token.key) + url = reverse("v2:account-forward") + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + self.assertNotIn("recipients", resp.json()) + + data = {"recipients": "user@domain.ext"} + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 200) + self.assertEqual(self.da.mailbox.aliasrecipient_set.count(), 1) + + data = {"recipients": "user@domain.ext", "keepcopies": True} + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 200) + + self.assertEqual( + models.Alias.objects.filter(address=self.da.username).count(), + 2 + ) + + data = {"keepcopies": False} + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 200) + self.assertEqual( + models.Alias.objects.filter(address=self.da.username).count(), + 1 + ) diff --git a/modoboa/admin/api/v2/viewsets.py b/modoboa/admin/api/v2/viewsets.py index 1815e853e..bacdcf5b5 100644 --- a/modoboa/admin/api/v2/viewsets.py +++ b/modoboa/admin/api/v2/viewsets.py @@ -260,7 +260,7 @@ class UserAccountViewSet(viewsets.ViewSet): else: # Deactivate internal self-alias to avoid storing # local copies... - models.AliasAlias.objects.filter( + models.Alias.objects.filter( address=mb.full_address, internal=True ).update(enabled=False) alias.set_recipients(recipients) diff --git a/modoboa/core/api/v2/tests.py b/modoboa/core/api/v2/tests.py index 44cbbf388..df66e3e13 100644 --- a/modoboa/core/api/v2/tests.py +++ b/modoboa/core/api/v2/tests.py @@ -119,6 +119,13 @@ class AccountViewSetTestCase(ModoAPITestCase): me = resp.json() self.assertEqual(me["username"], "admin") + def test_me_password(self): + url = reverse("v2:account-check-me-password") + resp = self.client.post(url, {"password": "Toto1234"}, format="json") + self.assertEqual(resp.status_code, 400) + resp = self.client.post(url, {"password": "password"}, format="json") + self.assertEqual(resp.status_code, 200) + @mock.patch("django_otp.match_token") def test_tfa_verify_code(self, match_mock): user = models.User.objects.get(username="admin") @@ -133,6 +140,43 @@ class AccountViewSetTestCase(ModoAPITestCase): self.assertEqual(resp.status_code, 200) self.assertIn("access", resp.json()) + def test_tfa_setup_get_qr_code(self): + url = reverse("v2:account-tfa-setup-get-qr-code") + + resp = self.client.get(url) + self.assertEqual(resp.status_code, 404) + + user = models.User.objects.get(username="admin") + user.totpdevice_set.create(name="Device") + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + self.assertEqual(resp.content_type, "application/xml") + + user.tfa_enabled = True + user.save() + resp = self.client.get(url) + self.assertEqual(resp.status_code, 404) + + @mock.patch("django_otp.plugins.otp_totp.models.TOTPDevice.verify_token") + def test_tfa_setup_check(self, verify_mock): + user = models.User.objects.get(username="admin") + user.totpdevice_set.create(name="Device") + + url = reverse("v2:account-tfa-setup-check") + data = {"pin_code": 1234} + verify_mock.side_effect = [False] + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 400) + + verify_mock.side_effect = [True] + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 200) + self.assertIn("tokens", resp.json()) + + verify_mock.side_effect = [True] + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 400) + class AuthenticationTestCase(ModoAPITestCase): @@ -171,3 +215,11 @@ class AuthenticationTestCase(ModoAPITestCase): HTTP_AUTHORIZATION="Bearer {}".format(resp.json()["access"])) resp = self.client.get(me_url) self.assertEqual(resp.status_code, 200) + + +class LanguageViewSetTestCase(ModoAPITestCase): + + def test_list(self): + url = reverse("v2:language-list") + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) diff --git a/modoboa/core/tests/test_viewsets.py b/modoboa/core/tests/test_viewsets.py index e050887bd..1f04ef026 100644 --- a/modoboa/core/tests/test_viewsets.py +++ b/modoboa/core/tests/test_viewsets.py @@ -48,6 +48,7 @@ class AccountViewSetTestCase(ModoAPITestCase): # Display recovery tokens security_url = reverse("core:user_security") response = self.client.get(security_url) + self.assertIn("recovery codes", response.json()["content"]) admin.refresh_from_db() self.assertTrue(admin.tfa_enabled) diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index 4cf94a086..e51843b87 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -189,10 +189,11 @@ REST_FRAMEWORK = { 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', + 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning', } SPECTACULAR_SETTINGS = { - 'SCHEMA_PATH_PREFIX': r'/api/v1', + 'SCHEMA_PATH_PREFIX': r'/api/v[0-9]', 'TITLE': 'Modoboa API', 'VERSION': None, 'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAuthenticated'],