~landscape/zope3/ztk-1.1.3

« back to all changes in this revision

Viewing changes to src/zope/app/dav/tests/test_functional_proppatch.py

  • Committer: Sidnei da Silva
  • Date: 2010-07-05 21:07:01 UTC
  • Revision ID: sidnei.da.silva@canonical.com-20100705210701-zmqhqrbzad1mhzsl
- Reduce deps

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
##############################################################################
2
 
#
3
 
# Copyright (c) 2003 Zope Corporation and Contributors.
4
 
# All Rights Reserved.
5
 
#
6
 
# This software is subject to the provisions of the Zope Public License,
7
 
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
8
 
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9
 
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
 
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11
 
# FOR A PARTICULAR PURPOSE.
12
 
#
13
 
##############################################################################
14
 
"""Functional tests for PROPPATCH.
15
 
 
16
 
$Id: test_functional_proppatch.py 81002 2007-10-24 01:19:47Z srichter $
17
 
"""
18
 
import unittest
19
 
import transaction
20
 
from zope.pagetemplate.tests.util import normalize_xml
21
 
from zope.publisher.http import status_reasons
22
 
from zope.traversing.api import traverse
23
 
from zope.dublincore.interfaces import IZopeDublinCore
24
 
 
25
 
from zope.app.dav.tests.dav import DAVTestCase
26
 
from zope.app.dav.opaquenamespaces import IDAVOpaqueNamespaces
27
 
from zope.app.dav.testing import AppDavLayer
28
 
 
29
 
class TestPROPPATCH(DAVTestCase):
30
 
 
31
 
    def test_set(self):
32
 
        self.addPage('/pt', u'<span />')
33
 
        transaction.commit()
34
 
        expect = self._makePropstat(('uri://foo',), '<bar xmlns="a0"/>')
35
 
        self.verifyPropOK(path='/pt', namespaces=(('foo', 'uri://foo'),),
36
 
            set=('<foo:bar>spam</foo:bar>',), expect=expect)
37
 
        pt = traverse(self.getRootFolder(), '/pt')
38
 
        self._assertOPropsEqual(pt,
39
 
            {u'uri://foo': {u'bar': '<bar>spam</bar>'}})
40
 
 
41
 
    def test_remove(self):
42
 
        self.addPage('/pt', u'<span />')
43
 
        pt = traverse(self.getRootFolder(), '/pt')
44
 
        adapted = IDAVOpaqueNamespaces(pt)
45
 
        adapted[u'uri://foo'] = {u'bar': '<bar>spam</bar>'}
46
 
        transaction.commit()
47
 
        expect = self._makePropstat(('uri://foo',), '<bar xmlns="a0"/>')
48
 
        self.verifyPropOK(path='/pt', namespaces=(('foo', 'uri://foo'),),
49
 
            rm=('<foo:bar/>',), expect=expect)
50
 
        self._assertOPropsEqual(pt, {})
51
 
 
52
 
    def test_complex(self):
53
 
        self.addPage('/pt', u'<span />')
54
 
        pt = traverse(self.getRootFolder(), '/pt')
55
 
        adapted = IDAVOpaqueNamespaces(pt)
56
 
        adapted[u'uri://foo'] = {u'bar': '<bar>eggs</bar>'}
57
 
        adapted[u'uri://montypython'] = {u'castle': '<castle>camelot</castle>'}
58
 
        transaction.commit()
59
 
        expect = self._makePropstat(('uri://foo', 'uri://montypython'),
60
 
            '<bar xmlns="a0"/><castle xmlns="a1"/><song xmlns="a1"/>')
61
 
        self.verifyPropOK(path='/pt',
62
 
            namespaces=(('foo', 'uri://foo'), ('mp', 'uri://montypython')),
63
 
            set=('<foo:bar>spam</foo:bar>',),
64
 
            rm=('<mp:castle/>', '<mp:song/>'), expect=expect)
65
 
        self._assertOPropsEqual(pt,
66
 
            {u'uri://foo': {u'bar': '<bar>spam</bar>'}})
67
 
 
68
 
    def test_remove_dctitle(self):
69
 
        self.addPage('/pt', u'<span />')
70
 
        pt = traverse(self.getRootFolder(), '/pt')
71
 
        adapted = IZopeDublinCore(pt)
72
 
        adapted.title = u'Test'
73
 
        transaction.commit()
74
 
        # DC Title is a required field with no default, so a 409 is expected
75
 
        expect = self._makePropstat(('http://purl.org/dc/1.1',),
76
 
                                    '<title xmlns="a0"/>', 409)
77
 
        self.verifyPropOK(path='/pt',
78
 
            namespaces=(('DC', 'http://purl.org/dc/1.1'),),
79
 
            rm=('<DC:title/>',), expect=expect)
80
 
 
81
 
    def test_set_dctitle(self):
82
 
        self.addPage('/pt', u'<span />')
83
 
        pt = traverse(self.getRootFolder(), '/pt')
84
 
        adapted = IZopeDublinCore(pt)
85
 
        transaction.commit()
86
 
        expect = self._makePropstat(('http://purl.org/dc/1.1',),
87
 
                                    '<title xmlns="a0"/>')
88
 
        self.verifyPropOK(path='/pt',
89
 
            namespaces=(('DC', 'http://purl.org/dc/1.1'),),
90
 
            set=('<DC:title>Test Title</DC:title>',), expect=expect)
91
 
        self.assertEqual(IZopeDublinCore(pt).title, u'Test Title')
92
 
 
93
 
    def _assertOPropsEqual(self, obj, expect):
94
 
        oprops = IDAVOpaqueNamespaces(obj)
95
 
        namespacesA = list(oprops.keys())
96
 
        namespacesA.sort()
97
 
        namespacesB = expect.keys()
98
 
        namespacesB.sort()
99
 
        self.assertEqual(namespacesA, namespacesB,
100
 
                         'available opaque namespaces were %s, '
101
 
                         'expected %s' % (namespacesA, namespacesB))
102
 
 
103
 
        for ns in namespacesA:
104
 
            propnamesA = list(oprops[ns].keys())
105
 
            propnamesA.sort()
106
 
            propnamesB = expect[ns].keys()
107
 
            propnamesB.sort()
108
 
            self.assertEqual(propnamesA, propnamesB,
109
 
                             'props for opaque namespaces %s were %s, '
110
 
                             'expected %s' % (ns, propnamesA, propnamesB))
111
 
            for prop in propnamesA:
112
 
                valueA = oprops[ns][prop]
113
 
                valueB = expect[ns][prop]
114
 
                self.assertEqual(valueA, valueB,
115
 
                                 'opaque prop %s:%s was %s, '
116
 
                                 'expected %s' % (ns, prop, valueA, valueB))
117
 
 
118
 
 
119
 
    def _makePropstat(self, ns, properties, status=200):
120
 
        nsattrs = ''
121
 
        count = 0
122
 
        for uri in ns:
123
 
            nsattrs += ' xmlns:a%d="%s"' % (count, uri)
124
 
            count += 1
125
 
        reason = status_reasons[status]
126
 
        return '''<propstat>
127
 
            <prop%s>%s</prop>
128
 
            <status>HTTP/1.1 %d %s</status>
129
 
            </propstat>''' % (nsattrs, properties, status, reason)
130
 
 
131
 
    def verifyPropOK(self, path, namespaces=(), set=(), rm=(), expect='',
132
 
                     basic='mgr:mgrpw'):
133
 
        nsAttrs = setProps = removeProps = ''
134
 
        if set:
135
 
            setProps = '<set><prop>\n%s\n</prop></set>\n' % (''.join(set))
136
 
        if rm:
137
 
            removeProps = '<remove><prop>\n%s\n</prop></remove>\n' % (
138
 
                ''.join(rm))
139
 
        for prefix, ns in namespaces:
140
 
            nsAttrs += ' xmlns:%s="%s"' % (prefix, ns)
141
 
        body = """<?xml version="1.0" encoding="utf-8"?>
142
 
        <propertyupdate xmlns="DAV:"%s>
143
 
        %s
144
 
        </propertyupdate>""" % (nsAttrs, setProps + removeProps)
145
 
        result = self.publish(path, basic, env={'REQUEST_METHOD':'PROPPATCH',
146
 
                                                'CONTENT-LENGHT': len(body)},
147
 
                              request_body=body)
148
 
        self.assertEquals(result.getStatus(), 207)
149
 
        s1 = normalize_xml(result.getBody())
150
 
        s2 = normalize_xml("""<?xml version="1.0" encoding="utf-8"?>
151
 
        <multistatus xmlns="DAV:">
152
 
        <response>
153
 
        <href>http://localhost/pt</href>
154
 
        %s
155
 
        </response>
156
 
        </multistatus>""" % expect)
157
 
        self.assertEquals(s1, s2)
158
 
 
159
 
 
160
 
def test_suite():
161
 
    suite = unittest.TestSuite()
162
 
    TestPROPPATCH.layer = AppDavLayer
163
 
    suite.addTest(unittest.makeSuite(TestPROPPATCH))
164
 
    return suite
165
 
 
166
 
 
167
 
if __name__ == '__main__':
168
 
    unittest.main()