2009-09-28 22:47:27 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
2009-10-01 14:20:52 +02:00
|
|
|
from config import hostname, port, username, password, mailserver, subscriber_username, subscriber_password
|
2009-09-28 22:47:27 +02:00
|
|
|
|
|
|
|
import sys
|
|
|
|
import unittest
|
|
|
|
import webdavlib
|
|
|
|
import time
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
# TODO
|
|
|
|
# add test with multiple sort criterias
|
|
|
|
|
2009-09-28 22:47:27 +02:00
|
|
|
def fetchUserEmail(login):
|
|
|
|
client = webdavlib.WebDAVClient(hostname, port,
|
2009-10-01 14:20:52 +02:00
|
|
|
username, password)
|
2009-09-28 22:47:27 +02:00
|
|
|
resource = '/SOGo/dav/%s/' % login
|
|
|
|
propfind = webdavlib.WebDAVPROPFIND(resource,
|
2009-10-01 14:20:52 +02:00
|
|
|
["{urn:ietf:params:xml:ns:caldav}calendar-user-address-set"],
|
|
|
|
0)
|
2009-09-28 22:47:27 +02:00
|
|
|
propfind.xpath_namespace = { "D": "DAV:",
|
2009-10-01 14:20:52 +02:00
|
|
|
"C": "urn:ietf:params:xml:ns:caldav" }
|
2009-09-28 22:47:27 +02:00
|
|
|
client.execute(propfind)
|
|
|
|
nodes = propfind.xpath_evaluate('/D:multistatus/D:response/D:propstat/D:prop/C:calendar-user-address-set/D:href',
|
2009-10-01 14:20:52 +02:00
|
|
|
None)
|
2009-09-28 22:47:27 +02:00
|
|
|
|
|
|
|
return nodes[0].childNodes[0].nodeValue
|
|
|
|
|
2009-09-29 22:13:36 +02:00
|
|
|
message1 = """Return-Path: <cyril@cyril.dev>
|
|
|
|
Received: from cyril.dev (localhost [127.0.0.1])
|
|
|
|
by cyril.dev (Cyrus v2.3.8-Debian-2.3.8-1) with LMTPA;
|
2009-10-02 16:00:58 +02:00
|
|
|
Tue, 17 Dec 2009 07:42:16 -0400
|
2009-10-01 22:16:52 +02:00
|
|
|
Received: from aloha.dev (localhost [127.0.0.1])
|
|
|
|
by aloha.dev (Cyrus v2.3.8-Debian-2.3.8-1) with LMTPA;
|
|
|
|
Tue, 29 Sep 2009 07:42:16 -0400
|
2009-10-02 16:00:58 +02:00
|
|
|
Message-ID: <4AC1F29sept6.5060801@cyril.dev>
|
2009-10-07 20:16:34 +02:00
|
|
|
Date: Mon, 28 Sep 2009 07:42:14 -0400
|
2009-10-02 16:00:58 +02:00
|
|
|
From: Cyril <message1from@cyril.dev>
|
|
|
|
User-Agent: Thunderbird 2.0.0.22 (Macintosh/20090605)
|
2009-10-02 16:30:07 +02:00
|
|
|
References: <4AC3BF1B.3010806@inverse.ca>
|
2009-10-02 16:00:58 +02:00
|
|
|
MIME-Version: 1.0
|
|
|
|
To: message1to@cyril.dev
|
2009-10-08 00:34:24 +02:00
|
|
|
CC: 2message1cc@cyril.dev, user10@cyril.dev
|
2009-10-02 16:00:58 +02:00
|
|
|
Subject: message1subject
|
|
|
|
Content-Type: text/plain; charset=us-ascii; format=flowed
|
|
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
Reply-To: support@inverse.ca
|
|
|
|
|
|
|
|
Hello Jacques,
|
|
|
|
|
|
|
|
Can you read me?
|
|
|
|
|
|
|
|
--
|
|
|
|
Cyril <cyril@cyril.dev>
|
|
|
|
"""
|
|
|
|
|
|
|
|
message2 = """Return-Path: <cyril@cyril.dev>
|
|
|
|
Received: from cyril.dev (localhost [127.0.0.1])
|
|
|
|
by cyril.dev (Cyrus v2.3.8-Debian-2.3.8-1) with LMTPA;
|
|
|
|
Tue, 09 Dec 2009 07:42:16 -0400
|
|
|
|
Message-ID: <410sepAC1F296.5060801a@cyril.dev>
|
|
|
|
Date: Tue, 10 Sep 2009 07:42:14 -0400
|
|
|
|
User-Agent: Thunderbird 2.0.0.22 (Macintosh/20090605)
|
|
|
|
MIME-Version: 1.0
|
|
|
|
From: Cyril <message2from@cyril.dev>
|
|
|
|
To: message2to@cyril.dev
|
2009-10-08 00:34:24 +02:00
|
|
|
CC: 3message2cc@cyril.dev
|
2009-10-02 16:00:58 +02:00
|
|
|
Subject: message2subject
|
|
|
|
Content-Type: text/plain; charset=us-ascii; format=flowed
|
|
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
Reply-To: support@inverse.ca
|
|
|
|
|
|
|
|
Hello Jacques,
|
|
|
|
|
|
|
|
Can you read me?
|
|
|
|
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
Stuff StuffStuffStuffStuff StuffStuffStuff StuffStuff
|
|
|
|
--
|
|
|
|
Cyril <cyril@cyril.dev>
|
|
|
|
"""
|
|
|
|
|
|
|
|
message3 = """Return-Path: <cyril@cyril.dev>
|
|
|
|
Received: from cyril.dev (localhost [127.0.0.1])
|
|
|
|
by cyril.dev (Cyrus v2.3.8-Debian-2.3.8-1) with LMTPA;
|
|
|
|
Tue, 15 Dec 2009 07:42:16 -0400
|
|
|
|
Message-ID: <4AC1aF2dec96.5060801a@cyril.dev>
|
|
|
|
Date: Tue, 10 Dec 2009 07:42:14 -0400
|
2009-09-29 22:13:36 +02:00
|
|
|
User-Agent: Thunderbird 2.0.0.22 (Macintosh/20090605)
|
|
|
|
MIME-Version: 1.0
|
2009-10-02 16:00:58 +02:00
|
|
|
From: Cyril <message3from@cyril.dev>
|
|
|
|
To: message3to@cyril.dev
|
2009-10-08 00:34:24 +02:00
|
|
|
CC: 1message3cc@cyril.dev
|
2009-09-29 22:13:36 +02:00
|
|
|
Subject: Hallo
|
2009-10-02 16:00:58 +02:00
|
|
|
Content-Type: text/plain; charset=us-ascii; format=flowed
|
2009-09-29 22:13:36 +02:00
|
|
|
Content-Transfer-Encoding: 7bit
|
2009-10-02 16:00:58 +02:00
|
|
|
Reply-To: support@inverse.ca
|
2009-09-29 22:13:36 +02:00
|
|
|
|
|
|
|
Hello Jacques,
|
|
|
|
|
|
|
|
Can you read me?
|
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
This message is just a big larger than message1 but smaller than message2
|
2009-09-29 22:13:36 +02:00
|
|
|
--
|
|
|
|
Cyril <cyril@cyril.dev>
|
|
|
|
"""
|
2009-10-01 22:16:52 +02:00
|
|
|
message1_received = """Received: from cyril.dev (localhost [127.0.0.1])
|
|
|
|
by cyril.dev (Cyrus v2.3.8-Debian-2.3.8-1) with LMTPA;
|
2009-10-02 16:00:58 +02:00
|
|
|
Tue, 17 Dec 2009 07:42:16 -0400"""
|
2009-09-29 22:13:36 +02:00
|
|
|
|
2009-10-01 14:20:52 +02:00
|
|
|
class DAVMailCollectionTest(unittest.TestCase):
|
2009-09-28 22:47:27 +02:00
|
|
|
resource = '/SOGo/dav/%s/Mail/' % username
|
|
|
|
user_email = None
|
|
|
|
|
|
|
|
def setUp(self):
|
2009-10-01 14:20:52 +02:00
|
|
|
self.client = webdavlib.WebDAVClient(hostname, port,
|
|
|
|
username, password)
|
2009-09-28 22:47:27 +02:00
|
|
|
if self.user_email is None:
|
|
|
|
self.user_email = fetchUserEmail(username)
|
2009-10-02 16:00:58 +02:00
|
|
|
if self.user_email.startswith("mailto:"):
|
2009-09-28 22:47:27 +02:00
|
|
|
self.user_email = self.user_email[7:]
|
|
|
|
|
2009-10-01 14:20:52 +02:00
|
|
|
self.resource = '/SOGo/dav/%s/Mail/%s_A_%s/' \
|
|
|
|
% (username,
|
2009-10-02 16:00:58 +02:00
|
|
|
username.replace("@", "_A_").replace(".", "_D_"),
|
|
|
|
mailserver.replace(".", "_D_"))
|
2009-09-28 22:47:27 +02:00
|
|
|
|
2009-10-01 15:06:42 +02:00
|
|
|
## helper methods
|
2009-10-02 16:00:58 +02:00
|
|
|
def _makeCollection(self, name, status = 201):
|
2009-10-01 15:06:42 +02:00
|
|
|
url = "%s%s" % (self.resource, name)
|
|
|
|
mkcol = webdavlib.WebDAVMKCOL(url)
|
|
|
|
self.client.execute(mkcol)
|
|
|
|
self.assertEquals(mkcol.response["status"], status,
|
|
|
|
"failure creating collection"
|
|
|
|
"(code = %d)" % mkcol.response["status"])
|
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
def _deleteCollection(self, name, status = 204):
|
2009-10-01 15:06:42 +02:00
|
|
|
url = "%sfolder%s" % (self.resource, name)
|
|
|
|
delete = webdavlib.WebDAVDELETE(url)
|
|
|
|
self.client.execute(delete)
|
|
|
|
self.assertEquals(delete.response["status"], status,
|
|
|
|
"failure deleting collection"
|
|
|
|
"(code = %d)" % delete.response["status"])
|
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
def _putMessage(self, client, folder, message,
|
2009-10-01 15:06:42 +02:00
|
|
|
exp_status = 201):
|
2009-10-02 16:00:58 +02:00
|
|
|
url = "%sfolder%s" % (self.resource, folder)
|
2009-10-01 15:06:42 +02:00
|
|
|
put = webdavlib.HTTPPUT(url, message)
|
|
|
|
put.content_type = "message/rfc822"
|
|
|
|
client.execute(put)
|
2009-10-02 16:00:58 +02:00
|
|
|
if (exp_status is not None):
|
|
|
|
self.assertEquals(put.response["status"], exp_status,
|
|
|
|
"message creation/modification:"
|
|
|
|
" expected status code '%d' (received '%d')"
|
|
|
|
% (exp_status, put.response["status"]))
|
|
|
|
return put.response["headers"]["location"]
|
2009-10-01 15:06:42 +02:00
|
|
|
|
2009-10-02 15:51:21 +02:00
|
|
|
def _testProperty (self, url, property, expected, isDate = 0):
|
2009-10-01 22:16:52 +02:00
|
|
|
propfind = webdavlib.WebDAVPROPFIND(url, (property, ), 0)
|
|
|
|
self.client.execute(propfind)
|
|
|
|
key = property.replace("{urn:schemas:httpmail:}", "a:")
|
|
|
|
key = key.replace("{urn:schemas:mailheader:}", "a:")
|
|
|
|
tmp = propfind.xpath_evaluate("/D:multistatus/D:response/D:propstat/D:prop")
|
|
|
|
prop = tmp[0].firstChild;
|
|
|
|
result = None
|
|
|
|
|
|
|
|
if prop:
|
|
|
|
result = prop._get_firstChild()._get_nodeValue()
|
|
|
|
#print key, result
|
|
|
|
|
2009-10-02 15:51:21 +02:00
|
|
|
if isDate:
|
|
|
|
tstruct = time.strptime (result, "%a, %d %b %Y %H:%M:%S %Z")
|
|
|
|
result = int (time.mktime (tstruct))
|
|
|
|
|
2009-10-01 22:16:52 +02:00
|
|
|
self.assertEquals(result, expected,
|
|
|
|
"failure in propfind"
|
|
|
|
"(%s != %s)" % (result, expected))
|
|
|
|
|
2009-10-07 20:17:12 +02:00
|
|
|
def testMKCOL(self):
|
2009-10-01 15:06:42 +02:00
|
|
|
"""Folder creation"""
|
2009-10-02 16:00:58 +02:00
|
|
|
self._deleteCollection("test-dav-mail-%40-abc")
|
|
|
|
self._deleteCollection("test-dav-mail-@-def")
|
|
|
|
self._deleteCollection("test-dav-mail-%20-ghi")
|
2009-10-02 22:10:40 +02:00
|
|
|
|
|
|
|
self._makeCollection("test-dav-mail-%40-abc")
|
|
|
|
self._makeCollection("test-dav-mail-@-def")
|
|
|
|
self._makeCollection("test-dav-mail-%20-ghi")
|
2009-10-02 16:00:58 +02:00
|
|
|
self._makeCollection("test-dav-mail-%25-jkl", 500)
|
2009-09-28 22:47:27 +02:00
|
|
|
|
2009-09-29 22:13:36 +02:00
|
|
|
# Test MOVE
|
2009-09-28 22:47:27 +02:00
|
|
|
# self._makeCollection ("test-dav-mail-movable")
|
|
|
|
# url = "%sfolder%s" % (self.resource, "test-dav-mail-movable")
|
|
|
|
# move = webdavlib.WebDAVMOVE (url)
|
|
|
|
# move.destination = "http://cyril.dev%s%s2" % (self.resource, "test-dav-mail-movable")
|
|
|
|
# move.host = "cyril.dev"
|
|
|
|
# self.client.execute (move)
|
|
|
|
# self.assertEquals(move.response["status"], 204,
|
|
|
|
# "failure creating collection"
|
|
|
|
# "(code = %d)" % move.response["status"])
|
|
|
|
|
2009-10-07 20:17:12 +02:00
|
|
|
def testPUT(self):
|
2009-10-01 15:06:42 +02:00
|
|
|
"""Message creation"""
|
2009-10-02 16:00:58 +02:00
|
|
|
self._deleteCollection("test-dav-mail")
|
|
|
|
self._makeCollection("test-dav-mail")
|
2009-10-01 15:06:42 +02:00
|
|
|
|
|
|
|
# message creation on collection url
|
2009-09-29 22:13:36 +02:00
|
|
|
url = "%s%s" % (self.resource, "foldertest-dav-mail/")
|
2009-10-02 16:00:58 +02:00
|
|
|
put = webdavlib.HTTPPUT(url, message1)
|
2009-10-01 15:59:04 +02:00
|
|
|
put.content_type = "message/rfc822"
|
2009-10-02 16:00:58 +02:00
|
|
|
self.client.execute(put)
|
2009-09-29 22:13:36 +02:00
|
|
|
self.assertEquals(put.response["status"], 201,
|
2009-10-01 14:20:52 +02:00
|
|
|
"failure putting message"
|
|
|
|
"(code = %d)" % put.response["status"])
|
2009-09-29 22:13:36 +02:00
|
|
|
|
|
|
|
itemLocation = put.response["headers"]["location"]
|
2009-10-02 16:00:58 +02:00
|
|
|
get = webdavlib.WebDAVGET(itemLocation)
|
|
|
|
self.client.execute(get)
|
2009-09-29 22:13:36 +02:00
|
|
|
self.assertEquals(get.response["status"], 200,
|
2009-10-01 14:20:52 +02:00
|
|
|
"failure getting item"
|
|
|
|
"(code = %d)" % get.response["status"])
|
2009-09-29 22:13:36 +02:00
|
|
|
|
2009-10-01 15:06:42 +02:00
|
|
|
# message creation with explicit filename
|
2009-10-02 16:00:58 +02:00
|
|
|
url = "%s%s" %(self.resource, "foldertest-dav-mail/blabla.eml")
|
|
|
|
put = webdavlib.HTTPPUT(url, message1)
|
2009-10-01 15:59:04 +02:00
|
|
|
put.content_type = "message/rfc822"
|
2009-10-02 16:00:58 +02:00
|
|
|
self.client.execute(put)
|
2009-09-29 22:13:36 +02:00
|
|
|
self.assertEquals(put.response["status"], 201,
|
2009-10-01 14:20:52 +02:00
|
|
|
"failure putting message"
|
|
|
|
"(code = %d)" % put.response["status"])
|
|
|
|
|
2009-09-29 22:13:36 +02:00
|
|
|
itemLocation = put.response["headers"]["location"]
|
2009-10-02 16:00:58 +02:00
|
|
|
get = webdavlib.WebDAVGET(itemLocation)
|
|
|
|
self.client.execute(get)
|
2009-09-29 22:13:36 +02:00
|
|
|
self.assertEquals(get.response["status"], 200,
|
2009-10-01 14:20:52 +02:00
|
|
|
"failure getting item"
|
|
|
|
"(code = %d)" % get.response["status"])
|
2009-09-29 22:13:36 +02:00
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
self._deleteCollection("test-dav-mail")
|
|
|
|
|
|
|
|
def _testFilters(self, filters):
|
|
|
|
for filter in filters:
|
|
|
|
self._testFilter(filter)
|
|
|
|
|
|
|
|
def _testFilter(self, filter):
|
|
|
|
expected_hrefs = {}
|
|
|
|
expected_count = len(filter[1])
|
|
|
|
for href in filter[1]:
|
|
|
|
expected_hrefs[href] = True
|
|
|
|
|
|
|
|
received_count = 0
|
2009-10-05 23:34:16 +02:00
|
|
|
url = "%sfolder%s" % (self.resource, "test-dav-mail")
|
|
|
|
query = webdavlib.MailDAVMailQuery(url, ["displayname"], filter[0])
|
2009-10-02 16:00:58 +02:00
|
|
|
self.client.execute(query)
|
|
|
|
self.assertEquals(query.response["status"], 207,
|
|
|
|
"filter %s:\n\tunexpected status: %d"
|
|
|
|
% (filter[0], query.response["status"]))
|
|
|
|
query.xpath_namespace = { "D": "DAV:",
|
|
|
|
"I": "urn:inverse:params:xml:ns:inverse-dav" }
|
|
|
|
response_nodes = query.xpath_evaluate("/D:multistatus/D:response")
|
|
|
|
for response_node in response_nodes:
|
|
|
|
href_node = query.xpath_evaluate("D:href", response_node)[0]
|
|
|
|
href = href_node.childNodes[0].nodeValue
|
|
|
|
received_count = received_count + 1
|
|
|
|
self.assertTrue(expected_hrefs.has_key(href),
|
|
|
|
"filter %s:\n\tunexpected href: %s" % (filter[0], href))
|
|
|
|
|
|
|
|
self.assertEquals(len(filter[1]), received_count,
|
|
|
|
"filter %s:\n\tunexpected amount of refs: %d"
|
|
|
|
% (filter[0], received_count))
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
def _testSort(self, sortOrder, ascending = True):
|
2009-10-08 00:34:24 +02:00
|
|
|
expected_hrefs = sortOrder[1]
|
|
|
|
expected_count = len(expected_hrefs)
|
|
|
|
|
|
|
|
received_count = 0
|
|
|
|
url = "%sfolder%s" % (self.resource, "test-dav-mail")
|
|
|
|
query = webdavlib.MailDAVMailQuery(url, ["displayname"],
|
2009-10-08 15:04:00 +02:00
|
|
|
None, sortOrder[0], ascending)
|
2009-10-08 00:34:24 +02:00
|
|
|
self.client.execute(query)
|
|
|
|
self.assertEquals(query.response["status"], 207,
|
|
|
|
"sortOrder %s:\n\tunexpected status: %d"
|
|
|
|
% (sortOrder[0], query.response["status"]))
|
|
|
|
query.xpath_namespace = { "D": "DAV:",
|
|
|
|
"I": "urn:inverse:params:xml:ns:inverse-dav" }
|
|
|
|
response_nodes = query.xpath_evaluate("/D:multistatus/D:response")
|
|
|
|
for response_node in response_nodes:
|
|
|
|
href_node = query.xpath_evaluate("D:href", response_node)[0]
|
|
|
|
href = href_node.childNodes[0].nodeValue
|
|
|
|
self.assertEquals(expected_hrefs[received_count], href,
|
|
|
|
"sortOrder %s:\n\tunexpected href: %s (expecting: %s)"
|
|
|
|
% (sortOrder[0], href,
|
|
|
|
expected_hrefs[received_count]))
|
2009-10-08 15:04:00 +02:00
|
|
|
received_count = received_count + 1
|
2009-10-08 00:34:24 +02:00
|
|
|
|
|
|
|
self.assertEquals(expected_count, received_count,
|
|
|
|
"sortOrder %s:\n\tunexpected amount of refs: %d"
|
|
|
|
% (sortOrder[0], received_count))
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
def testREPORTMailQueryFilters(self):
|
|
|
|
"""mail-query filters"""
|
2009-10-02 16:00:58 +02:00
|
|
|
self._deleteCollection("test-dav-mail")
|
|
|
|
self._makeCollection("test-dav-mail")
|
|
|
|
|
|
|
|
msg1Loc = self._putMessage(self.client, "test-dav-mail", message1)
|
|
|
|
parsed = webdavlib.HTTPUnparsedURL(msg1Loc)
|
|
|
|
msg1Path = parsed.path
|
|
|
|
msg2Loc = self._putMessage(self.client, "test-dav-mail", message2)
|
|
|
|
parsed = webdavlib.HTTPUnparsedURL(msg2Loc)
|
|
|
|
msg2Path = parsed.path
|
|
|
|
msg3Loc = self._putMessage(self.client, "test-dav-mail", message3)
|
|
|
|
parsed = webdavlib.HTTPUnparsedURL(msg3Loc)
|
|
|
|
msg3Path = parsed.path
|
|
|
|
|
|
|
|
properties = ["{DAV:}displayname"]
|
|
|
|
|
|
|
|
## 1. test filter: receive-date
|
|
|
|
# SINCE, BEFORE, ON
|
|
|
|
# q = MailDAVMailQuery(self.resource, properties, filters = None)
|
|
|
|
|
|
|
|
filters = (({ "receive-date": { "from": "20091201T000000Z",
|
|
|
|
"to": "20091208T000000Z" } },
|
|
|
|
[]),
|
|
|
|
({ "receive-date": { "from": "20091208T000000Z",
|
|
|
|
"to": "20091213T134300Z" } },
|
|
|
|
[ msg2Loc ]),
|
|
|
|
({ "receive-date": { "from": "20091208T000000Z",
|
|
|
|
"to": "20091216T134300Z" } },
|
|
|
|
[ msg2Loc, msg3Loc ]),
|
|
|
|
({ "receive-date": { "from": "20091216T000000Z",
|
|
|
|
"to": "20091220T134300Z" } },
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "receive-date": { "from": "20091220T000000Z",
|
|
|
|
"to": "20091229T134300Z" } },
|
|
|
|
[]))
|
2009-10-07 20:16:34 +02:00
|
|
|
# receive-date seems to be considered the same as date by imapd
|
|
|
|
print "Warning, receive-date test disabled"
|
|
|
|
#self._testFilters(filters)
|
2009-10-02 16:00:58 +02:00
|
|
|
|
|
|
|
## 1. test filter: date
|
|
|
|
# SENTSINCE, SENTBEFORE, SENTON
|
|
|
|
|
|
|
|
filters = (({ "date": { "from": "20090101T000000Z",
|
|
|
|
"to": "20090201T000000Z" } },
|
|
|
|
[]),
|
|
|
|
({ "date": { "from": "20090912T000000Z",
|
|
|
|
"to": "20090929T134300Z" } },
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "date": { "from": "20090929T134300Z",
|
|
|
|
"to": "20091209T000000Z" } },
|
|
|
|
[]),
|
|
|
|
({ "date": { "from": "20090901T134300Z",
|
|
|
|
"to": "20091209T000000Z" } },
|
|
|
|
[ msg1Loc, msg2Loc ]),
|
|
|
|
({ "date": { "from": "20091201T000000Z",
|
|
|
|
"to": "20091211T000000Z" } },
|
|
|
|
[ msg3Loc ]),
|
|
|
|
({ "date": { "from": "20091211T000000Z",
|
|
|
|
"to": "20101211T000000Z" } },
|
|
|
|
[]),
|
|
|
|
({ "date": { "from": "20090101T000000Z",
|
|
|
|
"to": "20100101T000000Z" } },
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]))
|
|
|
|
self._testFilters(filters)
|
|
|
|
|
|
|
|
## 1. test filter: sequence
|
|
|
|
# x:y
|
|
|
|
filters = (({ "sequence": { "from": "1" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "sequence": { "from": "5" }},
|
|
|
|
[]),
|
|
|
|
({ "sequence": { "to": "5" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "sequence": { "from": "1",
|
|
|
|
"to": "2" }},
|
|
|
|
[ msg1Loc, msg2Loc ]))
|
2009-10-07 20:16:34 +02:00
|
|
|
# Sequence not yet implemented
|
|
|
|
print "Warning, sequence test disabled"
|
|
|
|
#self._testFilters(filters)
|
2009-10-02 16:00:58 +02:00
|
|
|
|
|
|
|
## 1. test filter: uid
|
|
|
|
# UID
|
|
|
|
filters = (({ "uid": { "from": "1" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
2009-10-07 20:16:34 +02:00
|
|
|
# disabled because we get 3
|
|
|
|
#({ "uid": { "from": "5" }},
|
|
|
|
# []),
|
2009-10-02 16:00:58 +02:00
|
|
|
({ "uid": { "to": "5" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "uid": { "from": "1",
|
|
|
|
"to": "2" }},
|
|
|
|
[ msg1Loc, msg2Loc ]))
|
2009-10-07 20:16:34 +02:00
|
|
|
print "Warning, one of the uid tests is disabled"
|
2009-10-02 16:00:58 +02:00
|
|
|
self._testFilters(filters)
|
|
|
|
|
|
|
|
## 1. test filter: from
|
|
|
|
# FROM
|
|
|
|
filters = (({ "from": { "match": "message" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "from": { "match": "Cyril" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "from": { "match": "cyril.dev" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "from": { "match": "message1from" }},
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "from": { "match": "message2from" }},
|
|
|
|
[ msg2Loc ]),
|
|
|
|
({ "from": { "match": "message3from" }},
|
|
|
|
[ msg3Loc ]))
|
|
|
|
self._testFilters(filters)
|
|
|
|
|
|
|
|
## 1. test filter: to
|
|
|
|
# TO
|
|
|
|
filters = (({ "to": { "match": "message" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "to": { "match": "Cyril" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "to": { "match": "cyril.dev" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "to": { "match": "message1to" }},
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "to": { "match": "message2to" }},
|
|
|
|
[ msg2Loc ]),
|
|
|
|
({ "to": { "match": "message3to" }},
|
|
|
|
[ msg3Loc ]))
|
|
|
|
self._testFilters(filters)
|
|
|
|
|
|
|
|
## 1. test filter: cc
|
|
|
|
# CC
|
|
|
|
filters = (({ "cc": { "match": "message" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "cc": { "match": "Cyril" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "cc": { "match": "cyril.dev" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "cc": { "match": "message1cc" }},
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "cc": { "match": "message2cc" }},
|
|
|
|
[ msg2Loc ]),
|
|
|
|
({ "cc": { "match": "message3cc" }},
|
|
|
|
[ msg3Loc ]))
|
|
|
|
self._testFilters(filters)
|
|
|
|
|
|
|
|
## 1. test filter: bcc
|
|
|
|
# BCC
|
|
|
|
## TODO
|
|
|
|
|
|
|
|
## 1. test filter: body
|
|
|
|
# BODY
|
|
|
|
filters = (({ "body": { "match": "Hello" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "body": { "match": "Stuff" }},
|
|
|
|
[ msg2Loc ]),
|
|
|
|
({ "body": { "match": "DOESNOT MATCH" }},
|
|
|
|
[]))
|
|
|
|
self._testFilters(filters)
|
|
|
|
|
|
|
|
## 1. test filter: size
|
|
|
|
# LARGER, SMALLER
|
2009-10-07 21:26:12 +02:00
|
|
|
#1 848
|
|
|
|
#2 4308
|
|
|
|
#3 699
|
|
|
|
filters = (({ "size": { "min": "300",
|
|
|
|
"max": "300" }},
|
|
|
|
[]),
|
|
|
|
({ "size": { "min": "800",
|
|
|
|
"max": "800" }},
|
|
|
|
[]),
|
|
|
|
({ "size": { "min": "5000",
|
|
|
|
"max": "5000" }},
|
|
|
|
[]),
|
|
|
|
({ "size": { "min": "838",
|
|
|
|
"max": "838" }},
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "size": { "min": "699",
|
|
|
|
"max": "4308" }},
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]),
|
|
|
|
({ "size": { "min": "700",
|
|
|
|
"max": "4308" }},
|
|
|
|
[ msg1Loc, msg2Loc ]),
|
|
|
|
({ "size": { "min": "698",
|
|
|
|
"max": "848" }},
|
|
|
|
[ msg1Loc, msg3Loc ]),
|
|
|
|
({ "size": { "min": "300",
|
|
|
|
"max": "5000" },
|
|
|
|
"size": { "min": "840",
|
|
|
|
"max": "850",
|
|
|
|
"not": "true" }},
|
|
|
|
[ msg2Loc, msg3Loc ]))
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
print "message flags are not handled yet"
|
2009-10-02 16:00:58 +02:00
|
|
|
## 1. test filter: answered
|
|
|
|
# ANSWERED, UNANSWERED
|
|
|
|
## 1. test filter: draft
|
|
|
|
# DRAFT
|
|
|
|
## 1. test filter: flagged
|
|
|
|
# FLAGGED
|
|
|
|
## 1. test filter: recent
|
|
|
|
# RECENT
|
|
|
|
## 1. test filter: seen
|
|
|
|
# SEEN
|
|
|
|
## 1. test filter: deleted
|
|
|
|
# DELETED
|
|
|
|
## 1. test filter: keywords
|
|
|
|
# KEYWORD x
|
|
|
|
|
2009-10-07 21:26:12 +02:00
|
|
|
## 1. test filter: multiple combinations
|
|
|
|
filters = (({ "body": { "match": "Hello" },
|
|
|
|
"cc": { "match": "message1cc" }},
|
|
|
|
[ msg1Loc ]),
|
|
|
|
({ "to": { "match": "message" },
|
|
|
|
"uid": { "from": "1",
|
|
|
|
"to": "2" }},
|
|
|
|
[ msg1Loc, msg2Loc ]),
|
|
|
|
({ "to": { "match": "message" },
|
|
|
|
"uid": { "from": "1",
|
|
|
|
"to": "2" },
|
|
|
|
"cc": { "match": "message3cc" }},
|
|
|
|
[]))
|
|
|
|
self._testFilters(filters)
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
self._deleteCollection("test-dav-mail")
|
|
|
|
|
|
|
|
def testREPORTMailQuerySort(self):
|
|
|
|
"""mail-query sort"""
|
|
|
|
self._deleteCollection("test-dav-mail")
|
|
|
|
self._makeCollection("test-dav-mail")
|
|
|
|
|
|
|
|
msg1Loc = self._putMessage(self.client, "test-dav-mail", message1)
|
|
|
|
parsed = webdavlib.HTTPUnparsedURL(msg1Loc)
|
|
|
|
msg1Path = parsed.path
|
|
|
|
msg2Loc = self._putMessage(self.client, "test-dav-mail", message2)
|
|
|
|
parsed = webdavlib.HTTPUnparsedURL(msg2Loc)
|
|
|
|
msg2Path = parsed.path
|
|
|
|
msg3Loc = self._putMessage(self.client, "test-dav-mail", message3)
|
|
|
|
parsed = webdavlib.HTTPUnparsedURL(msg3Loc)
|
|
|
|
msg3Path = parsed.path
|
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
# 1. test sort: (receive-date) ARRIVAL
|
2009-10-08 00:34:24 +02:00
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}received" ],
|
2009-10-08 15:04:00 +02:00
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]))
|
2009-10-08 00:34:24 +02:00
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
# 1. test sort: (date) DATE
|
2009-10-08 00:34:24 +02:00
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}date" ],
|
2009-10-08 15:04:00 +02:00
|
|
|
[ msg2Loc, msg1Loc, msg3Loc ]))
|
|
|
|
|
|
|
|
# 1. test sort: FROM
|
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}from" ],
|
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]))
|
|
|
|
|
|
|
|
# 1. test sort: TO
|
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}to" ],
|
2009-10-08 00:34:24 +02:00
|
|
|
[ msg1Loc, msg2Loc, msg3Loc ]))
|
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
# 1. test sort: CC
|
2009-10-08 00:34:24 +02:00
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}cc" ],
|
|
|
|
[ msg3Loc, msg1Loc, msg2Loc ]))
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
# 1. test sort: SUBJECT
|
|
|
|
self._testSort(([ "{DAV:}displayname" ],
|
|
|
|
[ msg3Loc, msg1Loc, msg2Loc ]))
|
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}subject" ],
|
|
|
|
[ msg3Loc, msg1Loc, msg2Loc ]))
|
2009-10-08 00:34:24 +02:00
|
|
|
|
2009-10-02 16:00:58 +02:00
|
|
|
# 1. test sort: SIZE
|
2009-10-08 00:34:24 +02:00
|
|
|
self._testSort(([ "{DAV:}getcontentlength" ],
|
|
|
|
[ msg3Loc, msg1Loc, msg2Loc ]))
|
|
|
|
|
2009-10-08 15:04:00 +02:00
|
|
|
# 1. test sort: REVERSE CC
|
|
|
|
self._testSort(([ "{urn:schemas:mailheader:}cc" ],
|
|
|
|
[ msg2Loc, msg1Loc, msg3Loc ]),
|
|
|
|
False)
|
2009-10-02 16:00:58 +02:00
|
|
|
|
|
|
|
self._deleteCollection("test-dav-mail")
|
2009-09-29 22:13:36 +02:00
|
|
|
|
2009-10-07 20:17:12 +02:00
|
|
|
def testPROPFIND(self):
|
2009-10-01 22:16:52 +02:00
|
|
|
"""Message properties"""
|
|
|
|
self._deleteCollection ("test-dav-mail")
|
|
|
|
self._makeCollection ("test-dav-mail")
|
|
|
|
|
|
|
|
url = "%s%s" % (self.resource, "foldertest-dav-mail/")
|
|
|
|
put = webdavlib.HTTPPUT (url, message1)
|
|
|
|
put.content_type = "message/rfc822"
|
|
|
|
self.client.execute (put)
|
|
|
|
self.assertEquals(put.response["status"], 201,
|
|
|
|
"failure putting message"
|
|
|
|
"(code = %d)" % put.response["status"])
|
|
|
|
|
|
|
|
itemLocation = put.response["headers"]["location"]
|
2009-10-07 21:11:01 +02:00
|
|
|
tests = (("{urn:schemas:httpmail:}date", 1254156134, 1),
|
2009-10-02 15:51:21 +02:00
|
|
|
("{urn:schemas:httpmail:}hasattachment", "0", 0),
|
|
|
|
("{urn:schemas:httpmail:}read", "0", 0),
|
2009-10-01 22:16:52 +02:00
|
|
|
("{urn:schemas:httpmail:}textdescription",
|
2009-10-02 15:51:21 +02:00
|
|
|
"<![CDATA[%s]]>" % message1, 0),
|
|
|
|
("{urn:schemas:httpmail:}unreadcount", None, 0),
|
2009-10-08 15:04:00 +02:00
|
|
|
("{urn:schemas:mailheader:}cc",
|
|
|
|
"2message1cc@cyril.dev, user10@cyril.dev", 0),
|
|
|
|
("{urn:schemas:mailheader:}date",
|
|
|
|
"Mon, 28 Sep 2009 11:42:14 GMT", 0),
|
|
|
|
("{urn:schemas:mailheader:}from",
|
|
|
|
"Cyril <message1from@cyril.dev>", 0),
|
2009-10-02 15:51:21 +02:00
|
|
|
("{urn:schemas:mailheader:}in-reply-to", None, 0),
|
2009-10-08 15:04:00 +02:00
|
|
|
("{urn:schemas:mailheader:}message-id",
|
|
|
|
"<4AC1F29sept6.5060801@cyril.dev>", 0),
|
2009-10-02 15:51:21 +02:00
|
|
|
("{urn:schemas:mailheader:}received", message1_received, 0),
|
|
|
|
("{urn:schemas:mailheader:}references",
|
|
|
|
"<4AC3BF1B.3010806@inverse.ca>", 0),
|
2009-10-02 16:30:07 +02:00
|
|
|
("{urn:schemas:mailheader:}subject", "message1subject", 0),
|
|
|
|
("{urn:schemas:mailheader:}to", "message1to@cyril.dev", 0))
|
2009-10-01 22:16:52 +02:00
|
|
|
|
|
|
|
for test in tests:
|
2009-10-02 15:51:21 +02:00
|
|
|
property, expected, isDate = test
|
|
|
|
self._testProperty(itemLocation, property, expected, isDate)
|
2009-10-01 22:16:52 +02:00
|
|
|
|
|
|
|
self._deleteCollection ("test-dav-mail")
|
|
|
|
|
2009-09-28 22:47:27 +02:00
|
|
|
if __name__ == "__main__":
|
|
|
|
unittest.main()
|