From 1db6c6373cbd76037a3a4bfb4465f9a05c07b09e Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 12 Oct 2013 18:14:27 +0200 Subject: [PATCH] Fixing unit tests. --- modoboa/core/factories.py | 21 +++++++------- modoboa/extensions/admin/factories.py | 32 ++++++++++++--------- modoboa/extensions/admin/forms/account.py | 2 +- modoboa/extensions/admin/forms/alias.py | 2 +- modoboa/extensions/admin/forms/domain.py | 2 +- modoboa/extensions/admin/lib.py | 4 +-- modoboa/extensions/admin/models/alias.py | 19 ++++++++---- modoboa/extensions/admin/tests/alias.py | 10 +++---- modoboa/extensions/admin/tests/export.py | 35 ++++++++++++++++++++--- modoboa/extensions/admin/views/user.py | 2 +- 10 files changed, 86 insertions(+), 43 deletions(-) diff --git a/modoboa/core/factories.py b/modoboa/core/factories.py index 19767d20e..df37f5a47 100644 --- a/modoboa/core/factories.py +++ b/modoboa/core/factories.py @@ -3,32 +3,33 @@ from django.contrib.auth.models import Group from . import models +class PermissionFactory(factory.DjangoModelFactory): + ABSTRACT_FACTORY = True + + @factory.post_generation + def set_permission(self, create, extracted, **kwargs): + if not create: + return + self.post_create(models.User.objects.get(pk=1)) + + class GroupFactory(factory.DjangoModelFactory): FACTORY_FOR = Group name = 'DefaultGroup' -class UserFactory(factory.DjangoModelFactory): +class UserFactory(PermissionFactory): 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)) diff --git a/modoboa/extensions/admin/factories.py b/modoboa/extensions/admin/factories.py index 9656a1dd2..1426d10ec 100644 --- a/modoboa/extensions/admin/factories.py +++ b/modoboa/extensions/admin/factories.py @@ -1,24 +1,24 @@ import factory from modoboa.core.models import User -from modoboa.core.factories import UserFactory +from modoboa.core.factories import PermissionFactory, UserFactory from . import models -class DomainFactory(factory.DjangoModelFactory): +class DomainFactory(PermissionFactory): FACTORY_FOR = models.Domain quota = 10 enabled = True -class MailboxFactory(factory.DjangoModelFactory): +class MailboxFactory(PermissionFactory): FACTORY_FOR = models.Mailbox quota = 0 use_domain_quota = True -class AliasFactory(factory.DjangoModelFactory): +class AliasFactory(PermissionFactory): FACTORY_FOR = models.Alias @@ -27,24 +27,30 @@ def populate_database(): 2 domains, 1 domain admin, 2 users """ - sa = User.objects.get(pk=1) dom = DomainFactory.create(name="test.com") admin = UserFactory( username="admin@test.com", groups=('DomainAdmins',) ) - admin.post_create(sa) MailboxFactory(address='admin', domain=dom, user=admin) account = UserFactory.create( username="user@test.com", groups=('SimpleUsers',) ) - account.post_create(sa) MailboxFactory.create(address='user', domain=dom, user=account) - dom2 = DomainFactory(name='test2.com') - u = UserFactory( + fwd = AliasFactory.create( + address='forward', domain=dom, extmboxes='user@external.com' + ) + al = AliasFactory.create( + address='alias', domain=dom + ) + al.mboxes.add(account.mailbox_set.all()[0]) + AliasFactory.create( + address='postmaster', domain=dom, extmboxes='toto@titi.com,test@truc.fr' + ) + dom.add_admin(admin) + + dom2 = DomainFactory.create(name='test2.com') + u = UserFactory.create( username='user@test2.com', groups=('SimpleUsers',) ) - u.post_create(sa) - MailboxFactory(address='user', domain=dom2, user=u) - - dom.add_admin(admin) + MailboxFactory.create(address='user', domain=dom2, user=u) diff --git a/modoboa/extensions/admin/forms/account.py b/modoboa/extensions/admin/forms/account.py index 179dd2ce4..7a10cc28a 100644 --- a/modoboa/extensions/admin/forms/account.py +++ b/modoboa/extensions/admin/forms/account.py @@ -209,7 +209,7 @@ class AccountFormMail(forms.Form, DynamicForm): events.raiseEvent("CanCreate", user, "mailbox_aliases") al = Alias(address=local_part, enabled=account.is_active) al.domain = Domain.objects.get(name=domname) - al.save([self.mb], [], creator=user) + al.save(int_rcpts=[self.mb], creator=user) for alias in self.mb.alias_set.all(): if len(alias.get_recipients()) >= 2: diff --git a/modoboa/extensions/admin/forms/alias.py b/modoboa/extensions/admin/forms/alias.py index a68bebfd4..89bfe4e68 100644 --- a/modoboa/extensions/admin/forms/alias.py +++ b/modoboa/extensions/admin/forms/alias.py @@ -115,6 +115,6 @@ class AliasForm(forms.ModelForm, DynamicForm): alias.address = localpart alias.domain = Domain.objects.get(name=domname) if commit: - alias.save(self.int_rcpts, self.ext_rcpts) + alias.save(int_rcpts=self.int_rcpts, ext_rcpts=self.ext_rcpts) self.save_m2m() return alias diff --git a/modoboa/extensions/admin/forms/domain.py b/modoboa/extensions/admin/forms/domain.py index 891d23c2e..2bc9a842a 100644 --- a/modoboa/extensions/admin/forms/domain.py +++ b/modoboa/extensions/admin/forms/domain.py @@ -194,7 +194,7 @@ class DomainFormOptions(forms.Form): if self.cleaned_data["create_aliases"] == "yes": al = Alias(address="postmaster", domain=domain, enabled=True) - al.save([mb], [], creator=user) + al.save(int_rcpts=[mb], creator=user) domain.add_admin(da) diff --git a/modoboa/extensions/admin/lib.py b/modoboa/extensions/admin/lib.py index 66116a036..758371f13 100644 --- a/modoboa/extensions/admin/lib.py +++ b/modoboa/extensions/admin/lib.py @@ -57,7 +57,7 @@ def get_listing_page(objects, pagenum): def get_identities(user, searchquery=None, idtfilter=None, grpfilter=None): - """Return all the identities owned by a user + """Return all the identities owned by a user. :param user: the desired user :param str searchquery: search pattern @@ -101,6 +101,6 @@ def get_identities(user, searchquery=None, idtfilter=None, grpfilter=None): q &= Q(address__icontains=searchquery) | \ Q(domain__name__icontains=searchquery) aliases = Alias.objects.select_related().filter(q) - if idtfilter is not None: + if idtfilter is not None and idtfilter: aliases = [al for al in aliases if al.type == idtfilter] return chain(accounts, aliases) diff --git a/modoboa/extensions/admin/models/alias.py b/modoboa/extensions/admin/models/alias.py index c59b5b083..134bf62d8 100644 --- a/modoboa/extensions/admin/models/alias.py +++ b/modoboa/extensions/admin/models/alias.py @@ -86,11 +86,16 @@ class Alias(DatesAware): for admin in self.domain.admins: grant_access_to_object(admin, self) - def save(self, int_rcpts, ext_rcpts, *args, **kwargs): - if len(ext_rcpts): - self.extmboxes = ",".join(ext_rcpts) + def save(self, *args, **kwargs): + if 'ext_rcpts' in kwargs: + self.extmboxes = ",".join(kwargs['ext_rcpts']) \ + if kwargs['ext_rcpts'] else "" + del kwargs['ext_rcpts'] + if 'int_rcpts' in kwargs: + int_rcpts = kwargs['int_rcpts'] + del kwargs['int_rcpts'] else: - self.extmboxes = "" + int_rcpts = [] if "creator" in kwargs: creator = kwargs["creator"] del kwargs["creator"] @@ -134,6 +139,10 @@ class Alias(DatesAware): return result def get_recipients_count(self): + """Return the number of recipients of this alias. + + :rtype: int + """ total = 0 if self.extmboxes != "": total += len(self.extmboxes.split(',')) @@ -178,7 +187,7 @@ class Alias(DatesAware): except Mailbox.DoesNotExist: raise AdminError(_("Local recipient %s not found" % rcpt)) int_rcpts += [target] - self.save(int_rcpts, ext_rcpts, creator=user) + self.save(int_rcpts=int_rcpts, ext_rcpts=ext_rcpts, creator=user) def to_csv(self, csvwriter): row = [self.type, self.full_address.encode("utf-8"), self.enabled] diff --git a/modoboa/extensions/admin/tests/alias.py b/modoboa/extensions/admin/tests/alias.py index dc715d352..1cb9a277d 100644 --- a/modoboa/extensions/admin/tests/alias.py +++ b/modoboa/extensions/admin/tests/alias.py @@ -46,9 +46,9 @@ class AliasTestCase(ModoTestCase): reverse("modoboa.extensions.admin.views.alias.newdlist"), values ) user = User.objects.get(username="user@test.com") - self.assertEqual(len(user.mailbox_set.all()[0].alias_set.all()), 1) + self.assertEqual(user.mailbox_set.all()[0].alias_set.count(), 2) admin = User.objects.get(username="admin@test.com") - self.assertEqual(len(admin.mailbox_set.all()[0].alias_set.all()), 1) + self.assertEqual(admin.mailbox_set.all()[0].alias_set.count(), 1) dlist = Alias.objects.get(address="all", domain__name="test.com") self.assertEqual(len(dlist.get_recipients()), 3) @@ -68,11 +68,11 @@ class AliasTestCase(ModoTestCase): address="all", domain__name="test.com") def test_forward(self): - values = dict(email="forward@test.com", recipients="rcpt@dest.com") + values = dict(email="forward2@test.com", recipients="rcpt@dest.com") self.check_ajax_post( reverse("modoboa.extensions.admin.views.alias.newforward"), values ) - fwd = Alias.objects.get(address="forward", domain__name="test.com") + fwd = Alias.objects.get(address="forward2", domain__name="test.com") self.assertEqual(fwd.get_recipients_count(), 1) values["recipients"] = "rcpt2@dest.com" @@ -88,7 +88,7 @@ class AliasTestCase(ModoTestCase): % fwd.id, {} ) self.assertRaises(Alias.DoesNotExist, Alias.objects.get, - address="forward", domain__name="test.com") + address="forward2", domain__name="test.com") def test_forward_and_local_copies(self): values = dict(email="user@test.com", recipients="rcpt@dest.com") diff --git a/modoboa/extensions/admin/tests/export.py b/modoboa/extensions/admin/tests/export.py index c0fb42dbe..5d4174bb7 100644 --- a/modoboa/extensions/admin/tests/export.py +++ b/modoboa/extensions/admin/tests/export.py @@ -22,25 +22,52 @@ class ExportTestCase(ModoTestCase): def test_export_identities(self): response = self.__export_identities() - self.assertEqual(response.content, "account;admin;{CRYPT}dTTsGDkA5ZHKg;;;True;SuperAdmins;\r\naccount;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;test.com\r\naccount;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com\r\n") + self.assertEqual(response.content, "account;admin;{CRYPT}dTTsGDkA5ZHKg;;;True;SuperAdmins;\r\naccount;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;test.com\r\naccount;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com\r\nalias;alias@test.com;False;user@test.com\r\nforward;forward@test.com;False;user@external.com\r\ndlist;postmaster@test.com;False;toto@titi.com;test@truc.fr\r\n") def test_export_simpleusers(self): - response = self.__export_identities(grpfilter="SimpleUsers") + response = self.__export_identities( + idtfilter="account", grpfilter="SimpleUsers" + ) self.assertEqual( response.content.strip(), "account;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com" ) def test_export_superadmins(self): - response = self.__export_identities(grpfilter="SuperAdmins") + response = self.__export_identities( + idtfilter="account", grpfilter="SuperAdmins" + ) self.assertEqual( response.content.strip(), "account;admin;{CRYPT}dTTsGDkA5ZHKg;;;True;SuperAdmins;" ) def test_export_domainadmins(self): - response = self.__export_identities(grpfilter="DomainAdmins") + response = self.__export_identities( + idtfilter="account", grpfilter="DomainAdmins" + ) self.assertEqual( response.content.strip(), "account;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;test.com" ) + + def test_export_aliases(self): + response = self.__export_identities(idtfilter="alias") + self.assertEqual( + response.content.strip(), + "alias;alias@test.com;False;user@test.com" + ) + + def test_export_forwards(self): + response = self.__export_identities(idtfilter="forward") + self.assertEqual( + response.content.strip(), + "forward;forward@test.com;False;user@external.com" + ) + + def test_export_dlists(self): + response = self.__export_identities(idtfilter="dlist") + self.assertEqual( + response.content.strip(), + "dlist;postmaster@test.com;False;toto@titi.com;test@truc.fr" + ) diff --git a/modoboa/extensions/admin/views/user.py b/modoboa/extensions/admin/views/user.py index 2c4ef4b6a..37fdd6d09 100644 --- a/modoboa/extensions/admin/views/user.py +++ b/modoboa/extensions/admin/views/user.py @@ -38,7 +38,7 @@ def forward(request, tplname='admin/forward.html'): if form.cleaned_data["keepcopies"]: intdests += [mb] form.parse_dest() - al.save(intdests, form.dests) + al.save(int_rcpts=intdests, ext_rcpts=form.dests) if request.user.group != "SimpleUsers": al.post_create(request.user) return ajax_response(request, respmsg=_("Forward updated"))