6 commits - kolabd/process.py pykolab/auth pykolab/wap_client tests/functional

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Wed Dec 26 15:06:26 CET 2012


 kolabd/process.py                                    |    8 +-
 pykolab/auth/ldap/__init__.py                        |   35 ++++------
 pykolab/wap_client/__init__.py                       |   25 +++++--
 tests/functional/purge_imap.py                       |   15 ++++
 tests/functional/purge_users.py                      |   24 -------
 tests/functional/test_kolabd/test_001_user_sync.py   |   27 ++------
 tests/functional/test_kolabd/test_002_user_rename.py |   62 +++++++++++++++++++
 tests/functional/test_kolabd/test_003_two_johns.py   |   51 +++++++++++++++
 8 files changed, 176 insertions(+), 71 deletions(-)

New commits:
commit 02a5f7f9eb5e62a0e1498e151c6e9dd968aec6fd
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 26 15:06:11 2012 +0100

    Update tests for fixed web admin

diff --git a/tests/functional/test_kolabd/test_001_user_sync.py b/tests/functional/test_kolabd/test_001_user_sync.py
index e8e31bf..44858bb 100644
--- a/tests/functional/test_kolabd/test_001_user_sync.py
+++ b/tests/functional/test_kolabd/test_001_user_sync.py
@@ -36,15 +36,9 @@ class TestKolabDaemon(unittest.TestCase):
 
         self.assertEqual(recipient, "uid=doe,ou=People,dc=example,dc=org")
 
-        result_before = wap_client.user_info(recipient)
-
-        # Ensure the synchronization is run even without a kolab daemon running.
-        auth.synchronize(mode='_paged_search')
-
-        result_after = wap_client.user_info(recipient)
-        self.assertEqual(result_after['mail'], 'john.doe at example.org')
-        self.assertEqual(result_before['alias'], ['doe at example.org', 'j.doe at example.org', 'john.doe at example.org'])
-        self.assertEqual(result_after['alias'], ['doe at example.org', 'j.doe at example.org'])
+        result = wap_client.user_info(recipient)
+        self.assertEqual(result['mail'], 'john.doe at example.org')
+        self.assertEqual(result['alias'], ['doe at example.org', 'j.doe at example.org'])
 
     def test_002_user_recipient_policy_duplicate(self):
         from tests.functional.user_add import user_add
@@ -62,15 +56,10 @@ class TestKolabDaemon(unittest.TestCase):
 
         self.assertEqual(recipient, "uid=doe2,ou=People,dc=example,dc=org")
 
-        result_before = wap_client.user_info(recipient)
-
-        # Ensure the synchronization is run even without a kolab daemon running.
-        auth.synchronize(mode='_paged_search')
+        result = wap_client.user_info(recipient)
 
-        result_after = wap_client.user_info(recipient)
-        self.assertEqual(result_after['mail'], 'jane.doe at example.org')
-        self.assertEqual(result_before['alias'], ['doe2 at example.org', 'j.doe2 at example.org', 'jane.doe at example.org'])
-        self.assertEqual(result_after['alias'], ['doe2 at example.org', 'j.doe2 at example.org'])
+        self.assertEqual(result['mail'], 'jane.doe at example.org')
+        self.assertEqual(result['alias'], ['doe2 at example.org', 'j.doe2 at example.org'])
 
     def test_003_user_mailbox_created(self):
         time.sleep(2)
@@ -126,8 +115,8 @@ class TestKolabDaemon(unittest.TestCase):
         folders = imap.lm()
         self.assertTrue("INBOX" in folders)
 
-        #folders = imap.imap.lsub()
-        #self.assertTrue("Calendar" in folders)
+        folders = imap.imap.lsub()
+        self.assertTrue("Calendar" in folders)
 
     def test_011_resource_add(self):
         pass
diff --git a/tests/functional/test_kolabd/test_002_user_rename.py b/tests/functional/test_kolabd/test_002_user_rename.py
new file mode 100644
index 0000000..dff9256
--- /dev/null
+++ b/tests/functional/test_kolabd/test_002_user_rename.py
@@ -0,0 +1,62 @@
+import time
+import unittest
+
+import pykolab
+from pykolab import wap_client
+from pykolab.auth import Auth
+from pykolab.imap import IMAP
+
+conf = pykolab.getConf()
+
+class TestKolabDaemon(unittest.TestCase):
+    @classmethod
+    def setup_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+        self.user = {
+                'local': 'john.doe',
+                'domain': 'example.org'
+            }
+
+        from tests.functional.user_add import user_add
+        user_add("John", "Doe")
+        time.sleep(5)
+
+    @classmethod
+    def teardown_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+    def test_001_user_rename(self):
+        """
+            Rename user "Doe, John" to "Sixpack, Joe" and verify the recipient
+            policy is applied, and the IMAP INBOX folder for the user is
+            renamed.
+        """
+        imap = IMAP()
+        imap.connect()
+        folders = imap.lm('user/john.doe at example.org')
+        self.assertEqual(len(folders), 1)
+
+        auth = Auth()
+        auth.connect()
+        recipient = auth.find_recipient("%(local)s@%(domain)s" % (self.user))
+
+        user_info = wap_client.user_info(recipient)
+        user_info['sn'] = 'Sixpack'
+        user_info['givenname'] = 'Joe'
+        user_info['uid'] = 'sixpack'
+        user_edit = wap_client.user_edit(recipient, user_info)
+
+        time.sleep(5)
+
+        user_info = wap_client.user_info('uid=sixpack,ou=People,dc=example,dc=org')
+        self.assertEqual(user_info['mail'], 'joe.sixpack at example.org')
+
+        folders = imap.lm('user/john.doe at example.org')
+        self.assertEqual(len(folders), 0)
+
+        folders = imap.lm('user/joe.sixpack at example.org')
+        self.assertEqual(len(folders), 1)
+
diff --git a/tests/functional/test_kolabd/test_003_two_johns.py b/tests/functional/test_kolabd/test_003_two_johns.py
new file mode 100644
index 0000000..b2bfb46
--- /dev/null
+++ b/tests/functional/test_kolabd/test_003_two_johns.py
@@ -0,0 +1,51 @@
+import time
+import unittest
+
+import pykolab
+from pykolab import wap_client
+from pykolab.auth import Auth
+from pykolab.imap import IMAP
+
+conf = pykolab.getConf()
+
+class TestKolabDaemon(unittest.TestCase):
+    @classmethod
+    def setup_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+    @classmethod
+    def teardown_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+    def test_001_two_johns(self):
+        from tests.functional.user_add import user_add
+        user_add("John", "Doe")
+        user_add("John", "Doe")
+
+        time.sleep(3)
+
+        auth = Auth()
+        auth.connect()
+
+        max_tries = 20
+        while max_tries > 0:
+            recipient1 = auth.find_recipient('john.doe at example.org')
+            recipient2 = auth.find_recipient('john.doe2 at example.org')
+
+            if not recipient1 or not recipient2:
+                time.sleep(1)
+                max_tries -= 1
+            else:
+                break
+
+        imap = IMAP()
+        imap.connect()
+
+        folders = imap.lm('user/john.doe at example.org')
+        self.assertEqual(len(folders), 1, "No INBOX found for first John")
+
+        folders = imap.lm('user/john.doe2 at example.org')
+        self.assertEqual(len(folders), 1, "No INBOX found for second John")
+


commit 0d634bb139dcaf041ebe8192b2996e6725bd5c1c
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 26 15:03:53 2012 +0100

    Display a traceback with the process fails

diff --git a/kolabd/process.py b/kolabd/process.py
index ddaac63..c936fdc 100644
--- a/kolabd/process.py
+++ b/kolabd/process.py
@@ -41,6 +41,8 @@ class KolabdProcess(multiprocessing.Process):
             auth = Auth(domain)
             auth.connect(domain)
             auth.synchronize()
-        except:
-            log.error(_("Error in process %r, terminating") % (self.name))
-            return
\ No newline at end of file
+        except Exception, errmsg:
+            log.error(_("Error in process %r, terminating:\n\t%r") % (self.name, errmsg))
+            import traceback
+            traceback.print_exc()
+            return


commit f184ecd427b7ae97acf510d7a6876f9afa28b906
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 26 14:39:24 2012 +0100

    Apply the recipient policy to entries with existing attributes as well (so mailboxes get renamed and such).

diff --git a/pykolab/auth/ldap/__init__.py b/pykolab/auth/ldap/__init__.py
index 61ae4a8..c538083 100644
--- a/pykolab/auth/ldap/__init__.py
+++ b/pykolab/auth/ldap/__init__.py
@@ -522,12 +522,14 @@ class LDAP(pykolab.base.Base):
                         log.debug(_("sec. mail pol. is not empty"), level=8)
                         want_attrs.append(_mail_attr)
 
-        log.debug(_("Attributes %r are not yet available for entry %r") % (
-                    want_attrs,
-                    entry_dn
-                ),
-                level=8
-            )
+        if len(want_attrs) > 0:
+            log.debug(_("Attributes %r are not yet available for entry %r") % (
+                        want_attrs,
+                        entry_dn
+                    ),
+                    level=8
+                )
+
         # Also append the preferredlanguage or 'native tongue' configured
         # for the entry.
         if not entry.has_key('preferredlanguage'):
@@ -551,19 +553,14 @@ class LDAP(pykolab.base.Base):
 
         # Primary mail address
         if not primary_mail == None:
-            if not entry.has_key(primary_mail_attribute) or \
-                    entry[primary_mail_attribute] == None:
-
-                primary_mail_address = conf.plugins.exec_hook(
-                        "set_primary_mail",
-                        kw={
-                                'primary_mail': primary_mail,
-                                'entry': entry,
-                                'primary_domain': self.domain
-                            }
-                    )
-            else:
-                primary_mail_address = entry[primary_mail_attribute]
+            primary_mail_address = conf.plugins.exec_hook(
+                    "set_primary_mail",
+                    kw={
+                            'primary_mail': primary_mail,
+                            'entry': entry,
+                            'primary_domain': self.domain
+                        }
+                )
 
             i = 1
             _primary_mail = primary_mail_address


commit aa3c5b4a9c00050390a5ba37a76ff769956179db
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 26 14:38:35 2012 +0100

    Update the user_edit function

diff --git a/pykolab/wap_client/__init__.py b/pykolab/wap_client/__init__.py
index 373e636..a38953a 100644
--- a/pykolab/wap_client/__init__.py
+++ b/pykolab/wap_client/__init__.py
@@ -295,7 +295,7 @@ def user_add(params=None):
 
     params = json.dumps(params)
 
-    return request('POST', 'user.add', get=None, post=params)
+    return request('POST', 'user.add', post=params)
 
 def user_delete(params=None):
     if params == None:
@@ -307,17 +307,26 @@ def user_delete(params=None):
 
     return request('POST', 'user.delete', post=post)
 
-def user_edit(params=None):
-    if params == None:
-        params = {
+def user_edit(user = None, attributes={}):
+    if user == None:
+        get = {
                 'user': utils.ask_question("Username for user to edit", "user")
             }
+    else:
+        get = {
+                'user': user
+            }
 
-    get = json.dumps(params)
+    user_info = request('GET', 'user.info', get=get)
 
-    user = request('GET', 'user.info', get=get)
+    for attribute in attributes.keys():
+        user_info[attribute] = attributes[attribute]
 
-    return user
+    post = json.dumps(user_info)
+
+    user_edit = request('POST', 'user.edit', get=get, post=post)
+
+    return user_edit
 
 def user_form_value_generate_cn(params=None):
     if params == None:
@@ -424,7 +433,7 @@ def user_info(user=None):
     if user == None:
         user = utils.ask_question("User email address")
     _params = { 'user': user }
-    user = request('GET', 'user.info?%s' % (urllib.urlencode(_params)))
+    user = request('GET', 'user.info', get=_params)
     return user
 
 def user_types_list():


commit 844c8e9b1a4d21b79222d43f1fbef144f638cfb8
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 26 14:37:54 2012 +0100

    It is just as easy for purge_users() to call purge_imap()

diff --git a/tests/functional/purge_users.py b/tests/functional/purge_users.py
index 1b18cb0..5bc1b82 100644
--- a/tests/functional/purge_users.py
+++ b/tests/functional/purge_users.py
@@ -13,25 +13,5 @@ def purge_users():
     for user in users['list']:
         wap_client.user_delete({'user': user})
 
-    auth = Auth()
-    domains = auth.list_domains()
-
-    imap = IMAP()
-    imap.connect()
-
-    folders = []
-
-    for domain,aliases in domains:
-        folders.extend(imap.lm("user/%%@%s" % (domain)))
-
-    for folder in folders:
-        user = folder.replace('user/','')
-
-        recipient = auth.find_recipient(user)
-
-        if len(recipient) == 0 or recipient == []:
-            try:
-                imap.dm(folder)
-            except:
-                pass
-
+    from tests.functional.purge_imap import purge_imap
+    purge_imap()


commit 3c66afa12004edaff6e28ad9092fce2e8b6b4b58
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 26 14:36:49 2012 +0100

    Add purge_imap() because sometimes you will want to end up with a clean IMAP server

diff --git a/tests/functional/purge_imap.py b/tests/functional/purge_imap.py
new file mode 100644
index 0000000..d3827a4
--- /dev/null
+++ b/tests/functional/purge_imap.py
@@ -0,0 +1,15 @@
+import pykolab
+
+from pykolab import wap_client
+from pykolab.imap import IMAP
+
+conf = pykolab.getConf()
+
+def purge_imap():
+    imap = IMAP()
+    imap.connect()
+    for folder in imap.lm():
+        try:
+            imap.dm(folder)
+        except:
+            pass





More information about the commits mailing list