diff --git a/Tests/Integration/carddav.py b/Tests/Integration/carddav.py new file mode 100644 index 000000000..62eb8e9bb --- /dev/null +++ b/Tests/Integration/carddav.py @@ -0,0 +1,87 @@ +from config import hostname, port, username, password +import webdavlib +import simplejson +import sogoLogin + + +DEBUG=True +DEBUG=False + + +class HTTPPreferencesPOST (webdavlib.HTTPPOST): + cookie = None + + def prepare_headers (self): + headers = webdavlib.HTTPPOST.prepare_headers(self) + if self.cookie: + headers["Cookie"] = self.cookie + return headers + +class HTTPPreferencesGET (webdavlib.HTTPGET): + cookie = None + + def prepare_headers (self): + headers = webdavlib.HTTPGET.prepare_headers(self) + if self.cookie: + headers["Cookie"] = self.cookie + return headers + +class Carddav: + login = username + passw = password + + def __init__(self, otherLogin = None, otherPassword = None): + if otherLogin and otherPassword: + self.login = otherLogin + self.passw = otherPassword + + self.client = webdavlib.WebDAVClient(hostname, port) + authCookie = sogoLogin.getAuthCookie(hostname, port, self.login, self.passw) + self.cookie = authCookie + self.cards = None + + #- If this is not set, we CAN'T save preferences + self.preferences = None + + def load_cards(self): + if not self.cards: + url = "/SOGo/%s/Contacts/personal/view" % (self.login) + get = HTTPPreferencesGET(url) + get.cookie = self.cookie + self.client.execute(get) + if DEBUG: print "(url):", url + if DEBUG: print "(status):", get.response["status"] + if DEBUG: print "(body):", get.response['body'] + content = simplejson.loads(get.response['body']) + self.cards = content['cards'] + return self.cards + + def get_cards(self, pattern): + self.load_cards() + return [a for a in self.cards if pattern in a.values()] + + def get_card(self, idstr): + url = "/SOGo/%s/Contacts/personal/%s/view" % (self.login, idstr) + get = HTTPPreferencesGET(url) + get.cookie = self.cookie + self.client.execute(get) + if DEBUG: print "(url):", url + if DEBUG: print "(status):", get.response["status"] + if DEBUG: print "(body):", get.response['body'] + content = simplejson.loads(get.response['body']) + return content + + def save_card(self, card): + url = "/SOGo/%s/Contacts/personal/%s/saveAsContact" % (self.login, card['id']) + if DEBUG: print "URL:", url + + post = HTTPPreferencesPOST(url, simplejson.dumps(card)) + post.content_type = "application/json" + post.cookie = self.cookie + self.client.execute(post) + + # Raise an exception if the pref wasn't properly set + if post.response["status"] != 200: + raise Exception ("failure setting prefs, (code = %d)" \ + % post.response["status"]) + diff --git a/Tests/Integration/test-carddav.py b/Tests/Integration/test-carddav.py new file mode 100755 index 000000000..d7a771daf --- /dev/null +++ b/Tests/Integration/test-carddav.py @@ -0,0 +1,94 @@ +#!/usr/bin/python + + +from config import hostname, port, username, password + +import carddav +import sogotests +import unittest +import webdavlib + + +class JsonDavTests(unittest.TestCase): + + def setUp(self): + self._connect_as_user() + self.newphone = [{'type': 'home', 'value': '123.456.7890'}] + self.newphones_difftype = [{'type': 'home', 'value': '123.456.7890'}, + {'type': 'work', 'value': '987.654.3210'}, + {'type': 'fax', 'value': '555.666.7777'}] + self.newphones_sametype = [{'type': 'work', 'value': '123.456.7890'}, + {'type': 'work', 'value': '987.654.3210'}] + # Easier to erase them all in tearDown + self.allphones = list(self.newphone) + self.allphones.extend(self.newphones_difftype) + self.allphones.extend(self.newphones_sametype) + + def tearDown(self): + self._connect_as_user() + self._get_card() + #- Remove the phones we just added + for phone in self.allphones: + try: + self.card['phones'].pop(self.card['phones'].index(phone)) + except ValueError: + #print "Can't find", phone + pass + self._save_card() + + + def _connect_as_user(self, newuser=username, newpassword=password): + self.dv = carddav.Carddav(newuser, newpassword) + + def _get_card(self, name="John Doe"): + tmp_card = self.dv.get_cards(name)[0] + self.card = self.dv.get_card(tmp_card['c_name']) + + def _save_card(self, card=None): + if card: + self.dv.save_card(card) + else: + self.dv.save_card(self.card) + + def _get_dav_data(self, filename, user=username, passwd=password): + w = webdavlib.WebDAVClient(hostname, port, user, passwd) + query = webdavlib.HTTPGET("http://localhost/SOGo/dav/%s/Contacts/personal/%s" % (username, filename)) + w.execute(query) + self.assertEquals(query.response['status'], 200) + return query.response['body'].split("\r\n") + + def _phone_to_dav_str(self, phonedict): + return "TEL;TYPE=%s:%s" % (phonedict['type'], phonedict['value']) + + def _testMultiplePhones(self, phones): + """ Add Multiple Phones to Contact JSON and verify with DAV """ + #- Use JSON to get CARD and add a phone and save it back + self._get_card() + oldphones = self.card['phones'] + oldphones.extend(phones) + self._save_card() + #- Make sure that the phone is there when using JSON + self._connect_as_user() + self._get_card() + #print "C:::", self.card + testphones = self.card['phones'] + #print "P1:", oldphones + #print "P2:", testphones + self.assertEquals(sorted(oldphones), sorted(testphones)) + #- Verify that DAV has the same values + dav = self._get_dav_data(self.card['id'], username, password) + for phone in phones: + found = dav.index(self._phone_to_dav_str(phone)) + self.assertTrue(found > 0) + + def testSinglePhone(self): + self._testMultiplePhones(self.newphone) + + def testMultipleDifferentPhones(self): + self._testMultiplePhones(self.newphones_difftype) + + def testMultipleSameTypePhones(self): + self._testMultiplePhones(self.newphones_sametype) + +if __name__ == "__main__": + sogotests.runTests()