diff --git a/modoboa/admin/factories.py b/modoboa/admin/factories.py new file mode 100644 index 000000000..78d1eb4d0 --- /dev/null +++ b/modoboa/admin/factories.py @@ -0,0 +1,48 @@ +import factory +from django.contrib.auth.models import Group +from . import models + + +class GroupFactory(factory.DjangoModelFactory): + FACTORY_FOR = Group + + name = 'DefaultGroup' + + +class MailboxFactory(factory.DjangoModelFactory): + FACTORY_FOR = models.Mailbox + + quota = 0 + use_domain_quota = True + + +class UserFactory(factory.DjangoModelFactory): + FACTORY_FOR = models.User + + email = factory.LazyAttribute(lambda a: a.username) + password = '{PLAIN}toto' + + mailbox = factory.RelatedFactory( + MailboxFactory, 'user', + address=factory.LazyAttribute( + lambda m: m.user.email.replace('@%s' % m.domain.name, '') + ) + ) + + @factory.post_generation + def groups(self, create, extracted, **kwargs): + if not create: + # Simple build, do nothing. + return + + if extracted: + # A list of groups were passed in, use them + for group in extracted: + self.groups.add(Group.objects.get(name=group)) + + +class DomainFactory(factory.DjangoModelFactory): + FACTORY_FOR = models.Domain + + quota = 10 + enabled = True diff --git a/modoboa/admin/tests.py b/modoboa/admin/tests.py index 18e5a7f4e..d1e516bae 100644 --- a/modoboa/admin/tests.py +++ b/modoboa/admin/tests.py @@ -19,10 +19,15 @@ from models import * from modoboa.admin.lib import * from modoboa.lib import parameters from modoboa.lib.tests import ModoTestCase +from . import factories class DomainTestCase(ModoTestCase): - fixtures = ["initial_users.json", "test_content.json"] + fixtures = ["initial_users.json"] + + def setUp(self): + super(DomainTestCase, self).setUp() + self.dom = factories.DomainFactory(name='test.com') def test_create(self): """Test the creation of a domain @@ -78,7 +83,10 @@ class DomainTestCase(ModoTestCase): values = { "name": "pouet.com", "quota": 100, "enabled": True } - self.check_ajax_post(reverse("modoboa.admin.views.editdomain", args=[1]), values) + self.check_ajax_post( + reverse("modoboa.admin.views.editdomain", args=[self.dom.id]), + values + ) dom = Domain.objects.get(name="pouet.com") self.assertEqual(dom.name, "pouet.com") self.assertTrue(dom.enabled) @@ -86,13 +94,17 @@ class DomainTestCase(ModoTestCase): def test_delete(self): """Test the removal of a domain """ - self.check_ajax_get(reverse("modoboa.admin.views.deldomain", args=[1]), {}) + self.check_ajax_get(reverse("modoboa.admin.views.deldomain", args=[self.dom.id]), {}) with self.assertRaises(Domain.DoesNotExist): Domain.objects.get(pk=1) class DomainAliasTestCase(ModoTestCase): - fixtures = ["initial_users.json", "test_content.json"] + fixtures = ['initial_users.json'] + + def setUp(self): + super(DomainAliasTestCase, self).setUp() + self.dom = factories.DomainFactory(name='test.com') def test_model(self): dom = Domain.objects.get(name="test.com") @@ -111,16 +123,23 @@ class DomainAliasTestCase(ModoTestCase): dom = Domain.objects.get(name="test.com") values = dict(name=dom.name, quota=dom.quota, enabled=dom.enabled, aliases="domalias.net", aliases_1="domalias.com") - self.check_ajax_post(reverse("modoboa.admin.views.editdomain", args=[1]), values) + self.check_ajax_post(reverse("modoboa.admin.views.editdomain", args=[dom.id]), values) self.assertEqual(dom.domainalias_set.count(), 2) del values["aliases_1"] - self.check_ajax_post(reverse("modoboa.admin.views.editdomain", args=[1]), values) + self.check_ajax_post(reverse("modoboa.admin.views.editdomain", args=[dom.id]), values) self.assertEqual(dom.domainalias_set.count(), 1) class AccountTestCase(ModoTestCase): - fixtures = ["initial_users.json", "test_content.json",] + fixtures = ["initial_users.json"] + + def setUp(self): + super(AccountTestCase, self).setUp() + self.dom = factories.DomainFactory(name="test.com") + self.account = factories.UserFactory( + username="user@test.com", groups=('SimpleUsers',), mailbox__domain=self.dom + ) def test_crud(self): values = dict(username="tester@test.com", first_name="Tester", last_name="Toto", @@ -132,14 +151,14 @@ class AccountTestCase(ModoTestCase): account = User.objects.get(username="tester@test.com") mb = account.mailbox_set.all()[0] self.assertEqual(mb.full_address, "tester@test.com") - self.assertEqual(mb.quota, 100) + self.assertEqual(mb.quota, 10) self.assertEqual(mb.enabled, True) self.assertEqual(mb.quota_value.username, "tester@test.com") self.assertEqual(account.username, mb.full_address) self.assertTrue(account.check_password("toto")) self.assertEqual(account.first_name, "Tester") self.assertEqual(account.last_name, "Toto") - self.assertEqual(mb.domain.mailbox_count, 4) + self.assertEqual(mb.domain.mailbox_count, 2) values["username"] = "pouet@test.com" self.check_ajax_post(reverse("modoboa.admin.views.editaccount", args=[account.id]), values) @@ -173,7 +192,17 @@ class AccountTestCase(ModoTestCase): class AliasTestCase(ModoTestCase): - fixtures = ["initial_users.json", "test_content.json"] + fixtures = ["initial_users.json"] + + def setUp(self): + super(AliasTestCase, self).setUp() + dom = factories.DomainFactory(name="test.com") + factories.UserFactory.create( + username="admin@test.com", groups=('DomainAdmins',), mailbox__domain=dom + ) + factories.UserFactory.create( + username="user@test.com", groups=('SimpleUsers',), mailbox__domain=dom + ) def test_alias(self): user = User.objects.get(username="user@test.com") @@ -245,24 +274,28 @@ class AliasTestCase(ModoTestCase): class PermissionsTestCase(ModoTestCase): - fixtures = ["initial_users.json", "test_content.json"] + fixtures = ["initial_users.json"] def setUp(self): - """ - FIXME: je n'arrive pas à générer des données de test incluant - déjà les permissions (cf. table ObjectAccess). C'est pour - cette raison que j'assigne le domaine test.com ici... - """ super(PermissionsTestCase, self).setUp() - self.user = User.objects.get(username="user@test.com") + dom = factories.DomainFactory(name='test.com') + self.user = factories.UserFactory( + username="user@test.com", groups=('SimpleUsers',), mailbox__domain=dom + ) self.values = dict( username=self.user.username, role="DomainAdmins", is_active=self.user.is_active, email="user@test.com" ) - self.admin = User.objects.get(username="admin@test.com") - dom = Domain.objects.get(name="test.com") + self.admin = factories.UserFactory( + username="admin@test.com", groups=('DomainAdmins',), mailbox__domain=dom + ) dom.add_admin(self.admin) + dom = factories.DomainFactory(name='test2.com') + factories.UserFactory( + username='user@test2.com', groups=('SimpleUsers',), mailbox__domain=dom + ) + def tearDown(self): self.clt.logout() @@ -336,15 +369,31 @@ class PermissionsTestCase(ModoTestCase): self.check_ajax_get(reverse("modoboa.admin.views.delaccount", args=[account.id]), {}, status="ko", respmsg="Permission denied") + def test_domainadmin_dlist_local_domain_not_owned(self): + """Check if a domain admin can use a local mailbox he can't + access as a recipient in a distribution list""" + values = dict( + email="all@test.com", + recipients="user@test.com", + recipients_1="user@test2.com", + enabled=True + ) + self.check_ajax_post(reverse("modoboa.admin.views.newdlist"), values) + class ImportTestCase(ModoTestCase): - fixtures = ["initial_users.json", "test_content.json"] + fixtures = ["initial_users.json"] def setUp(self): super(ImportTestCase, self).setUp() - self.admin = User.objects.get(username="admin@test.com") - dom = Domain.objects.get(name="test.com") + dom = factories.DomainFactory(name="test.com") + self.admin = factories.UserFactory.create( + username="admin@test.com", groups=('DomainAdmins',), mailbox__domain=dom + ) dom.add_admin(self.admin) + factories.UserFactory.create( + username="user@test.com", groups=('SimpleUsers',), mailbox__domain=dom + ) def test_domains_import(self): f = ContentFile(b"""domain; domain1.com; 100; True diff --git a/modoboa/extensions/limits/tests.py b/modoboa/extensions/limits/tests.py index 87fb27c32..c96536208 100644 --- a/modoboa/extensions/limits/tests.py +++ b/modoboa/extensions/limits/tests.py @@ -1,12 +1,21 @@ from django.core.urlresolvers import reverse from modoboa.lib.tests import ExtTestCase from modoboa.admin.models import User +from modoboa.admin import factories class PermissionsTestCase(ExtTestCase): - fixtures = ["initial_users.json", "test_content.json"] + fixtures = ["initial_users.json"] name = "limits" + def setUp(self): + super(PermissionsTestCase, self).setUp() + dom = factories.DomainFactory(name='test.com') + self.admin = factories.UserFactory( + username='admin@test.com', groups=('DomainAdmins',), mailbox__domain=dom + ) + dom.add_admin(self.admin) + def test_domainadmin_deletes_reseller(self): """Check if a domain admin can delete a reseller. @@ -23,7 +32,3 @@ class PermissionsTestCase(ExtTestCase): self.clt.login(username="admin@test.com", password="toto") self.check_ajax_get(reverse("modoboa.admin.views.delaccount", args=[account.id]), {}, status="ko", respmsg="Permission denied") - self.check_ajax_get(reverse("modoboa.admin.views.delaccount", args=[4]), {}, - status="ko", respmsg="Permission denied") - - diff --git a/requirements.txt b/requirements.txt index 33a9fecab..6b74c0566 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ sievelib chardet argparse rfc6266 +factory-boy