Add tests for filtering address books
This commit is contained in:
parent
31a0f65a7e
commit
ad0b4e5e85
@ -3,4 +3,5 @@ VERSION:3.0
|
|||||||
UID:contact1
|
UID:contact1
|
||||||
N:Contact;;;;
|
N:Contact;;;;
|
||||||
FN:Contact
|
FN:Contact
|
||||||
|
NICKNAME:test
|
||||||
END:VCARD
|
END:VCARD
|
||||||
|
@ -25,6 +25,7 @@ import posixpath
|
|||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@ -404,31 +405,162 @@ class BaseRequestsMixIn:
|
|||||||
assert status == 200
|
assert status == 200
|
||||||
assert answer.count("BEGIN:VEVENT") == 2
|
assert answer.count("BEGIN:VEVENT") == 2
|
||||||
|
|
||||||
def _test_filter(self, filters, kind="event", items=(1,)):
|
def _test_filter(self, filters, kind="event", test=None, items=(1,)):
|
||||||
filters_text = "".join(
|
filter_template = "<C:filter>{}</C:filter>"
|
||||||
"<C:filter>%s</C:filter>" % filter_ for filter_ in filters)
|
if kind in ("event", "journal", "todo"):
|
||||||
status, _, _ = self.request("DELETE", "/calendar.ics/")
|
create_collection_fn = partial(self.request, "MKCALENDAR")
|
||||||
|
path = "/calendar.ics/"
|
||||||
|
filename_template = "{}{}.ics"
|
||||||
|
namespace = "urn:ietf:params:xml:ns:caldav"
|
||||||
|
report = "calendar-query"
|
||||||
|
elif kind == "contact":
|
||||||
|
create_collection_fn = self._create_addressbook
|
||||||
|
if test:
|
||||||
|
filter_template = '<C:filter test="{}">{{}}</C:filter>'.format(
|
||||||
|
test)
|
||||||
|
path = "/contacts.vcf/"
|
||||||
|
filename_template = "{}{}.vcf"
|
||||||
|
namespace = "urn:ietf:params:xml:ns:carddav"
|
||||||
|
report = "addressbook-query"
|
||||||
|
else:
|
||||||
|
raise ValueError("Unsupported kind: %r" % kind)
|
||||||
|
status, _, _ = self.request("DELETE", path)
|
||||||
assert status in (200, 404)
|
assert status in (200, 404)
|
||||||
status, _, _ = self.request("MKCALENDAR", "/calendar.ics/")
|
status, _, _ = create_collection_fn(path)
|
||||||
assert status == 201
|
assert status == 201
|
||||||
for i in items:
|
for i in items:
|
||||||
filename = "{}{}.ics".format(kind, i)
|
filename = filename_template.format(kind, i)
|
||||||
event = get_file_content(filename)
|
event = get_file_content(filename)
|
||||||
status, _, _ = self.request(
|
status, _, _ = self.request(
|
||||||
"PUT", "/calendar.ics/%s" % filename, event)
|
"PUT", posixpath.join(path, filename), event)
|
||||||
assert status == 201
|
assert status == 201
|
||||||
|
filters_text = "".join(
|
||||||
|
filter_template.format(filter_) for filter_ in filters)
|
||||||
status, _, answer = self.request(
|
status, _, answer = self.request(
|
||||||
"REPORT", "/calendar.ics",
|
"REPORT", path,
|
||||||
"""<?xml version="1.0" encoding="utf-8" ?>
|
"""<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
|
<C:{1} xmlns:C="{0}">
|
||||||
<D:prop xmlns:D="DAV:">
|
<D:prop xmlns:D="DAV:">
|
||||||
<D:getetag/>
|
<D:getetag/>
|
||||||
</D:prop>
|
</D:prop>
|
||||||
%s
|
{2}
|
||||||
</C:calendar-query>""" % filters_text)
|
</C:{1}>""".format(namespace, report, filters_text))
|
||||||
assert status == 207
|
assert status == 207
|
||||||
return answer
|
return answer
|
||||||
|
|
||||||
|
def test_addressbook_empty_filter(self):
|
||||||
|
self._test_filter([""], kind="contact")
|
||||||
|
|
||||||
|
def test_addressbook_prop_filter(self):
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="contains"
|
||||||
|
>es</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>es</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="contains"
|
||||||
|
>a</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="equals"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="equals"
|
||||||
|
>tes</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="equals"
|
||||||
|
>est</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="starts-with"
|
||||||
|
>tes</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="starts-with"
|
||||||
|
>est</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="ends-with"
|
||||||
|
>est</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
match-type="ends-with"
|
||||||
|
>tes</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
|
||||||
|
def test_addressbook_prop_filter_any(self):
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>
|
||||||
|
<C:prop-filter name="EMAIL">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact", test="anyof")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>a</C:text-match>
|
||||||
|
</C:prop-filter>
|
||||||
|
<C:prop-filter name="EMAIL">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact", test="anyof")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>
|
||||||
|
<C:prop-filter name="EMAIL">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact")
|
||||||
|
|
||||||
|
def test_addressbook_prop_filter_all(self):
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>tes</C:text-match>
|
||||||
|
</C:prop-filter>
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>est</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact", test="allof")
|
||||||
|
assert "href>/contacts.vcf/contact1.vcf</" not in self._test_filter(["""
|
||||||
|
<C:prop-filter name="NICKNAME">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>
|
||||||
|
<C:prop-filter name="EMAIL">
|
||||||
|
<C:text-match collation="i;unicode-casemap"
|
||||||
|
>test</C:text-match>
|
||||||
|
</C:prop-filter>"""], "contact", test="allof")
|
||||||
|
|
||||||
def test_calendar_empty_filter(self):
|
def test_calendar_empty_filter(self):
|
||||||
self._test_filter([""])
|
self._test_filter([""])
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user