Test PROPFIND with a plain, working resource::

  >>> from Testing.ZopeTestCase import user_name, user_password

  >>> self.setRoles(['Manager'])

  >>> print http(r"""
  ... PROPFIND /%s HTTP/1.1
  ... Content-Type: text/xml; charset="utf-8"
  ... Authorization: Basic %s:%s
  ... Depth: 0
  ...
  ... <?xml version="1.0" encoding="utf-8"?>
  ...    <DAV:propfind xmlns:DAV="DAV:">
  ...      <DAV:prop><DAV:displayname/></DAV:prop>
  ...    </DAV:propfind>""" % (self.folder.getId(), user_name, 
  ...                          user_password), handle_errors=False)
  HTTP/1.1 207 Multi-Status
  ...
  Content-Type: text/xml; charset="utf-8"
  Date: ...
  <BLANKLINE>
  <?xml version="1.0" encoding="utf-8"?>
  <d:multistatus xmlns:d="DAV:">
  <d:response>
  <d:href>/test_folder_1_/</d:href>
  <d:propstat>
    <d:prop>
  <n:displayname xmlns:n="DAV:">test_folder_1_</n:displayname>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
  </d:response>
  </d:multistatus>

If an object provided a broken listDAVObjects implementation, we could fail. Make sure we work now::

  >>> from OFS.Image import File
  >>> from OFS.Folder import Folder
  >>> from Products.DavPack.tests.test_patches import BrokenPS
  >>> from Products.DavPack.tests.test_patches import BrokenDAVCollection

  >>> _ = self.folder._setObject('coll', BrokenDAVCollection('coll'))
  >>> _ = self.folder.coll._setObject('file1', File('file1', '', ''))

  >>> self.folder.coll.listDAVObjects()
  Traceback (most recent call last):
  ...
  ValueError: Broken!

  >>> print http(r"""
  ... PROPFIND /%s/coll HTTP/1.1
  ... Content-Type: text/xml; charset="utf-8"
  ... Authorization: Basic %s:%s
  ... Depth: infinity
  ...
  ... <?xml version="1.0" encoding="utf-8"?>
  ...    <DAV:propfind xmlns:DAV="DAV:">
  ...      <DAV:prop><DAV:displayname/></DAV:prop>
  ...    </DAV:propfind>""" % (self.folder.getId(), user_name, 
  ...                          user_password), handle_errors=False)
  HTTP/1.1 207 Multi-Status
  ...
  Content-Type: text/xml; charset="utf-8"
  Date: ...
  <BLANKLINE>
  <?xml version="1.0" encoding="utf-8"?>
  <d:multistatus xmlns:d="DAV:">
  <d:response>
  <d:href>/test_folder_1_/coll/</d:href>
  <d:propstat>
    <d:prop>
  <n:displayname xmlns:n="DAV:">coll</n:displayname>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
  </d:response>
  </d:multistatus>

Shoving a perfectly good listDAVObjects into the class makes it work::

  >>> BrokenDAVCollection.listDAVObjects = Folder.listDAVObjects.im_func

  >>> self.folder.coll.listDAVObjects()
  [<File at ...>] 

  >>> print http(r"""
  ... PROPFIND /%s/coll HTTP/1.1
  ... Content-Type: text/xml; charset="utf-8"
  ... Authorization: Basic %s:%s
  ... Depth: infinity
  ...
  ... <?xml version="1.0" encoding="utf-8"?>
  ...    <DAV:propfind xmlns:DAV="DAV:">
  ...      <DAV:prop><DAV:displayname/></DAV:prop>
  ...    </DAV:propfind>""" % (self.folder.getId(), user_name, 
  ...                          user_password), handle_errors=False)
  HTTP/1.1 207 Multi-Status
  ...
  Content-Type: text/xml; charset="utf-8"
  Date: ...
  <BLANKLINE>
  <?xml version="1.0" encoding="utf-8"?>
  <d:multistatus xmlns:d="DAV:">
  <d:response>
  <d:href>/test_folder_1_/coll/</d:href>
  <d:propstat>
    <d:prop>
  <n:displayname xmlns:n="DAV:">coll</n:displayname>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
  </d:response>
  <d:response>
  <d:href>/test_folder_1_/coll/file1</d:href>
  <d:propstat>
    <d:prop>
  <n:displayname xmlns:n="DAV:">file1</n:displayname>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
  </d:response>
  </d:multistatus>

Test a broken 'allprop' implementation::

  >>> BrokenDAVCollection.propertysheets = {'DAV:':BrokenPS()}

  >>> self.folder.coll.propertysheets['DAV:'].dav__allprop()
  Traceback (most recent call last):
  ...
  ValueError: Broken!

  >>> print http(r"""
  ... PROPFIND /%s/coll HTTP/1.1
  ... Content-Type: text/xml; charset="utf-8"
  ... Authorization: Basic %s:%s
  ... Depth: 0
  ...
  ... <?xml version="1.0" encoding="utf-8"?>
  ...    <DAV:propfind xmlns:DAV="DAV:">
  ...      <DAV:allprop/>
  ...    </DAV:propfind>""" % (self.folder.getId(), user_name, 
  ...                          user_password), handle_errors=False)
  HTTP/1.1 207 Multi-Status
  ...
  Content-Type: text/xml; charset="utf-8"
  Date: ...
  <BLANKLINE>
  <?xml version="1.0" encoding="utf-8"?>
  <d:multistatus xmlns:d="DAV:">
  <d:response>
  <d:href>/test_folder_1_/coll/</d:href>
  <d:status>200 OK</d:status>
  </d:response>
  </d:multistatus>

Test a broken 'propnames' implementation::

  >>> self.folder.coll.propertysheets['DAV:'].dav__propnames()
  Traceback (most recent call last):
  ...
  ValueError: Broken!

  >>> print http(r"""
  ... PROPFIND /%s/coll HTTP/1.1
  ... Content-Type: text/xml; charset="utf-8"
  ... Authorization: Basic %s:%s
  ... Depth: 0
  ...
  ... <?xml version="1.0" encoding="utf-8"?>
  ...    <DAV:propfind xmlns:DAV="DAV:">
  ...      <DAV:propname/>
  ...    </DAV:propfind>""" % (self.folder.getId(), user_name, 
  ...                          user_password), handle_errors=False)
  HTTP/1.1 207 Multi-Status
  ...
  Content-Type: text/xml; charset="utf-8"
  Date: ...
  <BLANKLINE>
  <?xml version="1.0" encoding="utf-8"?>
  <d:multistatus xmlns:d="DAV:">
  <d:response>
  <d:href>/test_folder_1_/coll/</d:href>
  <d:status>200 OK</d:status>
  </d:response>
  </d:multistatus>

Test a broken 'propstat' implementation:

  >>> print http(r"""
  ... PROPFIND /%s/coll HTTP/1.1
  ... Content-Type: text/xml; charset="utf-8"
  ... Authorization: Basic %s:%s
  ... Depth: 0
  ...
  ... <?xml version="1.0" encoding="utf-8"?>
  ...    <DAV:propfind xmlns:DAV="DAV:">
  ...      <DAV:prop><DAV:displayname/></DAV:prop>
  ...    </DAV:propfind>""" % (self.folder.getId(), user_name, 
  ...                          user_password), handle_errors=False)
  HTTP/1.1 207 Multi-Status
  ...
  Content-Type: text/xml; charset="utf-8"
  Date: ...
  <BLANKLINE>
  <?xml version="1.0" encoding="utf-8"?>
  <d:multistatus xmlns:d="DAV:">
  <d:response>
  <d:href>/test_folder_1_/coll/</d:href>
  <d:propstat>
    <d:prop>
  <n:displayname xmlns:n="DAV:"/>  </d:prop>
    <d:status>HTTP/1.1 404 Not Found</d:status>
  </d:propstat>
  </d:response>
  </d:multistatus>
