mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-25 05:58:42 +01:00
329 lines
11 KiB
Python
329 lines
11 KiB
Python
"""API v2 tests."""
|
|
|
|
from django.urls import reverse
|
|
|
|
from rest_framework.authtoken.models import Token
|
|
|
|
from modoboa.admin import factories, models
|
|
from modoboa.core import models as core_models
|
|
from modoboa.lib.tests import ModoAPITestCase
|
|
|
|
|
|
class DomainViewSetTestCase(ModoAPITestCase):
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super().setUpTestData()
|
|
factories.populate_database()
|
|
cls.da_token = Token.objects.create(
|
|
user=core_models.User.objects.get(username="admin@test.com"))
|
|
|
|
def test_create(self):
|
|
url = reverse("v2:domain-list")
|
|
data = {
|
|
"name": "domain.tld",
|
|
"domain_admin": {
|
|
"username": "admin",
|
|
"with_mailbox": True,
|
|
"with_aliases": True
|
|
}
|
|
}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 201)
|
|
|
|
dom = models.Domain.objects.get(pk=resp.json()["pk"])
|
|
self.assertEqual(len(dom.admins), 1)
|
|
admin = dom.admins.first()
|
|
self.assertTrue(hasattr(admin, "mailbox"))
|
|
self.assertTrue(
|
|
models.Alias.objects.filter(
|
|
address="postmaster@domain.tld").exists()
|
|
)
|
|
|
|
def test_update(self):
|
|
domain = models.Domain.objects.get(name="test2.com")
|
|
data = {
|
|
"name": "test2.com",
|
|
"type": "relaydomain",
|
|
"transport": {
|
|
"service": "relay",
|
|
"settings": {
|
|
"relay_target_port": 25,
|
|
"relay_target_host": "localhost"
|
|
}
|
|
}
|
|
}
|
|
url = reverse("v2:domain-detail", args=[domain.pk])
|
|
resp = self.client.put(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
domain.refresh_from_db()
|
|
self.assertEqual(domain.transport.service, data["transport"]["service"])
|
|
self.assertEqual(
|
|
domain.transport._settings["relay_target_host"],
|
|
data["transport"]["settings"]["relay_target_host"]
|
|
)
|
|
|
|
data["transport"]["relay_verify_recipients"] = True
|
|
resp = self.client.put(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
def test_delete(self):
|
|
self.client.credentials(
|
|
HTTP_AUTHORIZATION="Token " + self.da_token.key)
|
|
|
|
domain = models.Domain.objects.get(name="test2.com")
|
|
url = reverse("v2:domain-delete", args=[domain.pk])
|
|
resp = self.client.post(url)
|
|
self.assertEqual(resp.status_code, 403)
|
|
|
|
domain = models.Domain.objects.get(name="test.com")
|
|
url = reverse("v2:domain-delete", args=[domain.pk])
|
|
resp = self.client.post(url)
|
|
self.assertEqual(resp.status_code, 403)
|
|
|
|
self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token.key)
|
|
url = reverse("v2:domain-delete", args=[domain.pk])
|
|
resp = self.client.post(url)
|
|
self.assertEqual(resp.status_code, 204)
|
|
|
|
def test_administrators(self):
|
|
domain = models.Domain.objects.get(name="test.com")
|
|
url = reverse("v2:domain-administrators", args=[domain.pk])
|
|
resp = self.client.get(url)
|
|
self.assertEqual(resp.status_code, 200)
|
|
self.assertEqual(len(resp.json()), 1)
|
|
|
|
def test_administrator(self):
|
|
domain = models.Domain.objects.get(name="test.com")
|
|
url = reverse("v2:domain-add-administrator", args=[domain.pk])
|
|
account = core_models.User.objects.get(username="user@test.com")
|
|
data = {"account": account.pk}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
def test_remove_adminstrator(self):
|
|
domain = models.Domain.objects.get(name="test.com")
|
|
url = reverse("v2:domain-remove-administrator", args=[domain.pk])
|
|
account = core_models.User.objects.get(username="user@test.com")
|
|
data = {"account": account.pk}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
|
|
class AccountViewSetTestCase(ModoAPITestCase):
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super().setUpTestData()
|
|
factories.populate_database()
|
|
|
|
def test_create(self):
|
|
url = reverse("v2:account-list")
|
|
data = {
|
|
"username": "toto@test.com",
|
|
"role": "SimpleUsers",
|
|
"mailbox": {
|
|
"use_domain_quota": True
|
|
},
|
|
"password": "Toto12345",
|
|
"language": "fr",
|
|
"aliases": ["alias3@test.com"]
|
|
}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 201)
|
|
self.assertTrue(
|
|
models.Alias.objects.filter(
|
|
address="alias3@test.com").exists()
|
|
)
|
|
|
|
def test_create_admin(self):
|
|
url = reverse("v2:account-list")
|
|
data = {
|
|
"username": "superadmin",
|
|
"role": "SuperAdmins",
|
|
"password": "Toto12345",
|
|
"language": "fr",
|
|
"aliases": ["alias3@test.com"]
|
|
}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 400)
|
|
|
|
def test_create_with_bad_password(self):
|
|
url = reverse("v2:account-list")
|
|
data = {
|
|
"username": "superadmin",
|
|
"role": "SuperAdmins",
|
|
}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 400)
|
|
self.assertIn("password", resp.json())
|
|
|
|
data["password"] = "Toto"
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 400)
|
|
self.assertIn("password", resp.json())
|
|
|
|
def test_validate(self):
|
|
data = {"username": "toto@test.com"}
|
|
url = reverse("v2:account-validate")
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 204)
|
|
|
|
def test_random_password(self):
|
|
url = reverse("v2:account-random-password")
|
|
resp = self.client.get(url)
|
|
self.assertEqual(resp.status_code, 200)
|
|
self.assertIn("password", resp.json())
|
|
|
|
def test_delete(self):
|
|
account = core_models.User.objects.get(username="user@test.com")
|
|
url = reverse("v2:account-delete", args=[account.pk])
|
|
resp = self.client.post(url)
|
|
self.assertEqual(resp.status_code, 204)
|
|
with self.assertRaises(core_models.User.DoesNotExist):
|
|
account.refresh_from_db()
|
|
|
|
def test_update(self):
|
|
account = core_models.User.objects.get(username="user@test.com")
|
|
url = reverse("v2:account-detail", args=[account.pk])
|
|
data = {
|
|
"username": "user@test.com",
|
|
"role": "SimpleUsers",
|
|
"password": "Toto12345",
|
|
"mailbox": {
|
|
"quota": 10
|
|
}
|
|
}
|
|
resp = self.client.patch(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
def test_update_admin(self):
|
|
account = core_models.User.objects.get(username="admin")
|
|
url = reverse("v2:account-detail", args=[account.pk])
|
|
data = {
|
|
"username": "superadmin@test.com",
|
|
"role": "SuperAdmins",
|
|
"password": "Toto12345",
|
|
"mailbox": {
|
|
"quota": 10
|
|
}
|
|
}
|
|
resp = self.client.patch(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
account.refresh_from_db()
|
|
self.assertEqual(account.email, data["username"])
|
|
self.assertEqual(account.mailbox.full_address, data["username"])
|
|
|
|
def test_update_resources(self):
|
|
account = core_models.User.objects.get(username="admin@test.com")
|
|
url = reverse("v2:account-detail", args=[account.pk])
|
|
data = {
|
|
"resources": [
|
|
{"name": "mailboxes", "max_value": 10},
|
|
{"name": "mailbox_aliases", "max_value": 10}
|
|
]
|
|
}
|
|
resp = self.client.patch(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
limit = account.userobjectlimit_set.get(name="mailboxes")
|
|
self.assertEqual(limit.max_value, 10)
|
|
|
|
def test_get_with_resources(self):
|
|
account = core_models.User.objects.get(username="admin@test.com")
|
|
url = reverse("v2:account-detail", args=[account.pk])
|
|
resp = self.client.get(url, format="json")
|
|
self.assertEqual(resp.status_code, 200)
|
|
self.assertEqual(len(resp.json()["resources"]), 2)
|
|
|
|
|
|
class IdentityViewSetTestCase(ModoAPITestCase):
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super().setUpTestData()
|
|
factories.populate_database()
|
|
|
|
def test_list(self):
|
|
url = reverse("v2:identities-list")
|
|
resp = self.client.get(url)
|
|
self.assertEqual(resp.status_code, 200)
|
|
self.assertEqual(len(resp.json()), 8)
|
|
|
|
|
|
class AliasViewSetTestCase(ModoAPITestCase):
|
|
|
|
@classmethod
|
|
def setUpTestData(cls): # NOQA:N802
|
|
"""Create test data."""
|
|
super().setUpTestData()
|
|
factories.populate_database()
|
|
|
|
def test_validate(self):
|
|
url = reverse("v2:alias-validate")
|
|
data = {"address": "alias@unknown.com"}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 400)
|
|
|
|
data = {"address": "alias@test.com"}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 400)
|
|
|
|
data = {"address": "alias2@test.com"}
|
|
resp = self.client.post(url, data, format="json")
|
|
self.assertEqual(resp.status_code, 204)
|
|
|
|
def test_random_address(self):
|
|
url = reverse("v2:alias-random-address")
|
|
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
|
|
)
|
|
|
|
resp = self.client.get(url)
|
|
self.assertEqual(resp.status_code, 200)
|
|
self.assertTrue(resp.json()["keepcopies"])
|
|
|
|
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
|
|
)
|