import datetime import pytz import unittest import kolabformat from pykolab.xml import Contact from pykolab.xml import ContactIntegrityError from pykolab.xml import contact_from_string from pykolab.xml import contact_from_message from email import message_from_string xml_contact = """ urn:uuid:437656b2-d55e-11e4-a43b-080027b7afc5 3.1.0 Roundcube-libkolab-1.1 Libkolabxml-1.2 20150328T152236Z individual Sample Dude Dude Sample M. Dr. Jr. This is a sample contact for testing <text>Head of everything</text> Kolab Inc. R&D Department x-manager Jane Manager x-assistant Mrs. Moneypenny O-steet San Francisco CA 55550 USA www.kolab.org home Homestreet 11 Hometown 12345 Germany work Workstreet 22 Worktown 4567 Switzerland the dude spouse Leia child Jay child Bob 20010401 20100705 data:image/gif;base64,R0lGODlhAQABAPAAAOjq6gAAACH/C1hNUCBEYXRhWE1QAT8AIfkEBQAAAAAsAAAAAAEAAQAAAgJEAQA7 M home +49-555-11223344 work +49-555-44556677 cell +41-777-55588899 jabber:dude@kolab.org home home@kolab.org work work@kolab.org data:application/pgp-keys;base64,LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQpWZXJzaW9uOiBHbnVQRy9NYWNHUEcyIHYyLjAuMjINCg0KbVFHaUJFSVNOcUVSQkFDUnovb3J5L0JEY3pBWUFUR3JnTSt5WDgzV2pkaUVrNmZKNFFUekk2ZFZ1TkxTNy4uLg0KLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ== """ contact_mime_message = """MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_4ff5155d75dc1328b7f5fe10ddce8d24" From: john.doe@example.org To: john.doe@example.org Date: Mon, 13 Apr 2015 15:26:44 +0200 X-Kolab-Type: application/x-vnd.kolab.contact X-Kolab-Mime-Version: 3.0 Subject: 05cfc56d-2bb3-46d1-ada4-5f5310337fb2 User-Agent: Roundcube Webmail/1.2-git --=_4ff5155d75dc1328b7f5fe10ddce8d24 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1 This is a Kolab Groupware object. To view this object you will need an emai= l client that understands the Kolab Groupware format. For a list of such em= ail clients please visit http://www.kolab.org/ --=_4ff5155d75dc1328b7f5fe10ddce8d24 Content-Transfer-Encoding: 8bit Content-Type: application/vcard+xml; charset=UTF-8; name=kolab.xml Content-Disposition: attachment; filename=kolab.xml; size=1636 urn:uuid:05cfc56d-2bb3-46d1-ada4-5f5310337fb2 3.1.0 Roundcube-libkolab-1.1 Libkolabxml-1.1 20150413T132644Z individual User One User One DAV This is a Kolab contact home +1555224488 home dav.user01@example.org home user.one@example.org --=_4ff5155d75dc1328b7f5fe10ddce8d24-- """ class TestContactXML(unittest.TestCase): contact = Contact() def assertIsInstance(self, _value, _type): if hasattr(unittest.TestCase, 'assertIsInstance'): return unittest.TestCase.assertIsInstance(self, _value, _type) else: if (type(_value)) == _type: return True else: raise AssertionError("%s != %s" % (type(_value), _type)) def test_001_minimal(self): self.contact.set_name("test") self.assertEqual("test", self.contact.name()) self.assertIsInstance(self.contact.__str__(), str) def test_002_full(self): self.contact.set_name("test") # TODO: add more setters and getter tests here def test_010_load_from_xml(self): contact = contact_from_string(xml_contact) self.assertEqual(contact.get_uid(), '437656b2-d55e-11e4-a43b-080027b7afc5') self.assertEqual(contact.name(), 'Sample Dude') def test_011_load_from_message(self): contact = contact_from_message(message_from_string(contact_mime_message)) self.assertEqual(contact.get_uid(), '05cfc56d-2bb3-46d1-ada4-5f5310337fb2') self.assertEqual(contact.name(), 'User One') def test_020_to_dict(self): data = contact_from_string(xml_contact).to_dict() self.assertIsInstance(data, dict) self.assertIsInstance(data['lastmodified-date'], datetime.datetime) self.assertEqual(data['uid'], '437656b2-d55e-11e4-a43b-080027b7afc5') self.assertEqual(data['fn'], 'Sample Dude') self.assertEqual(data['given'], 'Sample') self.assertEqual(data['surname'], 'Dude') self.assertEqual(data['prefix'], 'Dr.') self.assertEqual(data['suffix'], 'Jr.') self.assertIsInstance(data['birthday'], datetime.date) self.assertIsInstance(data['anniversary'], datetime.date) self.assertEqual(data['organization'], 'Kolab Inc.') self.assertEqual(data['department'], 'R&D Department') self.assertEqual(data['manager'], ['Jane Manager']) self.assertEqual(data['note'], 'This is a sample contact for testing') self.assertEqual(len(data['address']), 3) self.assertEqual(data['address'][0]['type'], 'home') self.assertEqual(data['address'][1]['type'], 'work') self.assertEqual(data['address'][2]['type'], 'office') self.assertEqual(len(data['tel']), 3) self.assertEqual(data['tel'][0]['type'], 'home') self.assertEqual(data['tel'][0]['number'], '+49-555-11223344') self.assertEqual(data['tel'][1]['type'], 'work') self.assertEqual(data['tel'][2]['type'], 'mobile') self.assertEqual(len(data['email']), 2) self.assertEqual(data['email'][0]['type'], 'home') self.assertEqual(data['email'][0]['address'], 'home@kolab.org') self.assertEqual(len(data['url']), 1) self.assertEqual(len(data['key']), 1) self.assertEqual(data['key'][0]['type'], 'pgp') self.assertIsInstance(data['photo'], dict) self.assertEqual(data['photo']['mimetype'], 'image/gif') if __name__ == '__main__': unittest.main()