From af4aab9fa6861a9808e68a932719020d4d33da6e Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 16 Sep 2011 16:33:03 +0200 Subject: [PATCH] At last, I've taken some time to create first level tests for the admin. application. --- admin/fixtures/test_content.json | 1 + admin/models.py | 6 ++ admin/permissions.py | 1 + admin/tests.py | 172 +++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 admin/fixtures/test_content.json create mode 100644 admin/tests.py diff --git a/admin/fixtures/test_content.json b/admin/fixtures/test_content.json new file mode 100644 index 000000000..16964d753 --- /dev/null +++ b/admin/fixtures/test_content.json @@ -0,0 +1 @@ +[{"pk": 1, "model": "auth.User", "fields": {"username": "admin", "is_active": "True", "is_superuser": "True", "password": "sha1$94caa$79b64705ef5551b9cff704952f0b47294310ca07"}},{"pk": 2, "model": "auth.User", "fields": {"username": "user@test.com", "is_active": "True", "is_superuser": "False", "password": "sha1$94caa$79b64705ef5551b9cff704952f0b47294310ca07"}},{"pk": 1, "model": "admin.ObjectDates", "fields": {"creation": "2011-09-07 09:27:07.579603"}}, {"pk": 1, "model": "admin.Domain", "fields": {"name" : "test.com", "quota" : "100", "dates": "1"}}, {"pk": 1, "model": "admin.Mailbox", "fields": {"name": "Test user", "address": "user", "domain": "1", "dates": "1", "uid": "1001", "gid": "1001", "path": "user", "quota": "10", "user": "2"}}] diff --git a/admin/models.py b/admin/models.py index 0f1686694..c127829d1 100644 --- a/admin/models.py +++ b/admin/models.py @@ -179,6 +179,12 @@ class Mailbox(DatesAware): return self.user.is_active enabled = property(__enabled) + def __full_path(self): + path = os.path.join(parameters.get_admin("STORAGE_PATH"), + self.domain.name, self.address) + return os.path.abspath(path) + full_path = property(__full_path) + def __alias_count(self): return len(self.alias_set.all()) alias_count = property(__alias_count) diff --git a/admin/permissions.py b/admin/permissions.py index 12dcff7aa..6065061cb 100644 --- a/admin/permissions.py +++ b/admin/permissions.py @@ -4,6 +4,7 @@ import datetime from django.utils.translation import ugettext as _, ugettext_noop from django.contrib.auth.models import User, Group from modoboa.lib.webutils import _render, getctx, _render_to_string +from modoboa.lib import events from forms import * from tables import SuperAdminsTable, DomainAdminsTable diff --git a/admin/tests.py b/admin/tests.py new file mode 100644 index 000000000..c8934b8ab --- /dev/null +++ b/admin/tests.py @@ -0,0 +1,172 @@ +from django.test import TestCase +from django.test.client import Client +from django.utils import simplejson +from models import * +from modoboa.admin.lib import * +from modoboa.lib import parameters + +import os + +class DomainTestCase(TestCase): + + def test(self): + dom = Domain.objects.create(name="test.com", quota=100) + self.assertIsNotNone(dom) + self.assertEqual(dom.name, "test.com") + self.assertEqual(dom.quota, 100) + self.assertEqual(dom.enabled, False) + + self.assertEqual(dom.create_dir(), True) + path = os.path.join(parameters.get_admin("STORAGE_PATH"), dom.name) + self.assertEqual(os.path.exists(path), True) + + dom.name = "toto.com" + dom.save() + self.assertEqual(dom.name, "toto.com") + path = os.path.join(parameters.get_admin("STORAGE_PATH"), dom.name) + self.assertEqual(os.path.exists(path), True) + + dom.delete() + self.assertEqual(os.path.exists(path), False) + +class DomainAliasTestCase(TestCase): + fixtures = ["test_content.json"] + + def test(self): + dom = Domain.objects.get(name="test.com") + domal = DomainAlias() + domal.name = "domalias.net" + domal.target = dom + domal.save() + self.assertEqual(dom.domainalias_count, 1) + + domal.name = "domalias.org" + domal.save() + + domal.delete() + + +class MailboxTestCase(TestCase): + fixtures = ["test_content.json",] + + def test(self): + dom = Domain.objects.get(name="test.com") + mb = Mailbox() + mb.name = "Tester Toto" + mb.address = "tester" + mb.domain = dom + mb.save(password="toto", enabled=True) + self.assertEqual(mb.full_address, "tester@test.com") + self.assertEqual(os.path.exists(mb.full_path), True) + self.assertEqual(mb.quota, 100) + self.assertEqual(mb.enabled, True) + self.assertIsNotNone(mb.user) + self.assertEqual(mb.user.username, mb.full_address) + self.assertEqual(dom.mailbox_count, 2) + + mb.address = "pouet" + mb.save() + self.assertEqual(mb.path, "%s/" % mb.address) + path = mb.full_path + self.assertEqual(mb.full_address, "pouet@test.com") + self.assertEqual(os.path.exists(path), True) + + mb.delete() + self.assertEqual(os.path.exists(path), False) + + def test_update_password(self): + """Password update + + Two cases: + * The default admin changes his password (no associated Mailbox) + * A normal user changes hist password + """ + clt = Client() + self.assertEqual(clt.login(username="admin", password="toto"), True) + response = clt.post("/modoboa/userprefs/changepassword/", + {"oldpassword" : "toto", + "newpassword" : "titi", "confirmation" : "titi"}) + self.assertEqual(response.status_code, 200) + obj = simplejson.loads(response.content) + self.assertEqual(obj["status"], "ok") + clt.logout() + self.assertEqual(clt.login(username="admin", password="titi"), True) + + self.assertEqual(clt.login(username="user@test.com", password="toto"), + True) + response = clt.post("/modoboa/userprefs/changepassword/", + {"oldpassword" : "toto", + "newpassword" : "tutu", "confirmation" : "tutu"}) + self.assertEqual(response.status_code, 200) + obj = simplejson.loads(response.content) + self.assertEqual(obj["status"], "ok") + clt.logout() + self.assertEqual(clt.login(username="user@test.com", password="tutu"), True) + + +class AliasTestCase(TestCase): + fixtures = ["test_content.json"] + + def test(self): + dom = Domain.objects.get(name="test.com") + mb = Mailbox.objects.get(domain=dom, address="user") + al = Alias() + al.address = "alias" + al.domain = dom + al.enabled = True + al.save([mb], ["toto@extdomain.com"]) + self.assertEqual(al.full_address, "alias@test.com") + self.assertEqual(mb.alias_count, 1) + + al.address = "global" + al.save([mb], []) + self.assertEqual(al.full_address, "global@test.com") + self.assertEqual(mb.alias_count, 1) + self.assertEqual(al.extmboxes, "") + + al.delete() + self.assertEqual(mb.alias_count, 0) + +class PermissionsTestCase(TestCase): + fixtures = ["test_content.json"] + + def setUp(self): + self.clt = Client() + self.clt.login(username="admin", password="toto") + self.mb = Mailbox.objects.get(pk=1) + + def tearDown(self): + self.clt.logout() + + def test_domain_admins(self): + response = self.clt.post("/modoboa/admin/permissions/add/", + {"role" : "domain_admins", + "domain" : "1", "user" : "1"}) + self.assertEqual(response.status_code, 200) + obj = simplejson.loads(response.content) + self.assertEqual(obj["status"], "ok") + self.assertEqual(is_domain_admin(self.mb.user), True) + + response = self.clt.get("/modoboa/admin/permissions/delete/", + {"role" : "domain_admins", "selection" : "1"}) + self.assertEqual(response.status_code, 200) + obj = simplejson.loads(response.content) + self.assertEqual(obj["status"], "ok") + self.assertEqual(is_domain_admin(self.mb.user), False) + + + def test_superusers(self): + response = self.clt.post("/modoboa/admin/permissions/add/", + {"role" : "super_admins", "user" : "2"}) + self.assertEqual(response.status_code, 200) + obj = simplejson.loads(response.content) + self.assertEqual(obj["status"], "ok") + self.assertEqual(User.objects.get(pk=2).is_superuser, True) + + response = self.clt.get("/modoboa/admin/permissions/delete/", + {"role" : "super_admins", "selection" : "2"}) + self.assertEqual(response.status_code, 200) + obj = simplejson.loads(response.content) + self.assertEqual(obj["status"], "ok") + self.assertEqual(User.objects.get(pk=2).is_superuser, False) +