[Erp5-report] r37012 nicolas - /erp5/trunk/products/ERP5/tests/testWebDavSupport.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Jul 9 14:50:16 CEST 2010
Author: nicolas
Date: Fri Jul 9 14:50:15 2010
New Revision: 37012
URL: http://svn.erp5.org?rev=37012&view=rev
Log:
Add tests to check WebDav Features on Contribution Tools and some Documents.
Consider this test as a early work which needs to be improved.
At least, it test Document creation through Contribution Tool
Added:
erp5/trunk/products/ERP5/tests/testWebDavSupport.py
Added: erp5/trunk/products/ERP5/tests/testWebDavSupport.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testWebDavSupport.py?rev=37012&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/tests/testWebDavSupport.py (added)
+++ erp5/trunk/products/ERP5/tests/testWebDavSupport.py [utf8] Fri Jul 9 14:50:15 2010
@@ -0,0 +1,282 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2004, 2010 Nexedi SA and Contributors.
+# All Rights Reserved.
+# Nicolas Delaby <nicolas at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+import re
+import unittest
+import os
+import transaction
+from AccessControl import Unauthorized
+from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl.SecurityManagement import getSecurityManager
+from Testing import ZopeTestCase
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.utils import DummyLocalizer,\
+ createZODBPythonScript, FileUpload
+from Products.ERP5Type.tests.backportUnittest import expectedFailure
+
+import httplib
+from StringIO import StringIO
+from DateTime import DateTime
+
+from lxml import etree
+
+def makeFilePath(name):
+ return os.path.join(os.path.dirname(__file__), 'test_data', name)
+
+def makeFileUpload(name, as_name=None):
+ if as_name is None:
+ as_name = name
+ path = makeFilePath(name)
+ return FileUpload(path, as_name)
+
+class TestWebDavSupport(ERP5TypeTestCase):
+ """Test for WEBDAV access.
+ """
+
+ authentication = 'ERP5TypeTestCase:'
+
+ def getTitle(self):
+ return "Test WebDav Support"
+
+ def getBusinessTemplateList(self):
+ """
+ Return the list of required business templates.
+ """
+ return ('erp5_base',
+ 'erp5_ingestion',
+ 'erp5_ingestion_mysql_innodb_catalog',
+ 'erp5_web',
+ 'erp5_dms',
+ )
+
+ def afterSetUp(self):
+ portal = self.getPortal()
+
+ def clearModule(self, module):
+ module.manage_delObjects(list(module.objectIds()))
+ transaction.commit()
+ self.tic()
+
+ def beforeTearDown(self):
+ self.clearModule(self.portal.document_module)
+ self.clearModule(self.portal.web_page_module)
+
+ def getDocumentModule(self):
+ return self.portal.getDefaultModule('Text')
+
+ def getWebPageModule(self):
+ return self.portal.getDefaultModule('Web Page')
+
+ def test_PUT_on_contributionTool(self):
+ """Test Portal Contribution through Webdav calls
+ Create a document
+ """
+ # Create a new document via FTP/DAV
+ path = self.portal.portal_contributions.getPath()
+ filename = 'P-DMS-Presentation.3.Pages-001-en.odp'
+ file_object = makeFileUpload(filename)
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ stdin=file_object,
+ basic=self.authentication)
+
+ self.assertEqual(response.getStatus(), httplib.CREATED)
+ document_module = self.getDocumentModule()
+ self.failUnless(filename in document_module.objectIds())
+ self.assertEquals(document_module[filename].getPortalType(), 'Presentation')
+ file_object.seek(0)
+ self.assertEquals(document_module[filename].getData(), file_object.read())
+
+ def test_GET_on_contributionTool(self):
+ """Get a document through Contribution Tool.
+
+ XXX not sure if this test is usefull as listing all Documents from ZODB
+ can collapse the portal
+ """
+ # Create a new document via FTP/DAV
+ path = self.portal.portal_contributions.getPath()
+ filename = 'P-DMS-Presentation.3.Pages-001-en.odp'
+ file_object = makeFileUpload(filename)
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ stdin=file_object,
+ basic=self.authentication)
+
+ self.assertEqual(response.getStatus(), httplib.CREATED)
+ transaction.commit()
+ self.tic()
+
+ # check Document fetching
+ document_module = self.getDocumentModule()
+ document = document_module[filename]
+ document_id = '%s-%s' % (document.getUid(), filename,)
+ response = self.publish('%s/%s' % (path, document_id),
+ request_method='GET',
+ stdin=StringIO(),
+ basic=self.authentication)
+ self.assertEquals(response.getStatus(), httplib.OK)
+ self.assertEquals(response.getBody(), document.getData())
+
+ def test_PUT_on_web_page(self):
+ """Edit a web_page in webdav
+ with encoded data in iso-8859-1
+ """
+ # Create a new document via FTP/DAV
+ path = self.portal.portal_contributions.getPath()
+ filename = 'my_document.html'
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ basic=self.authentication)
+
+ self.assertEqual(response.getStatus(), httplib.CREATED)
+ web_page_module = self.getWebPageModule()
+ self.failUnless(filename in web_page_module.objectIds())
+ self.assertEquals(web_page_module[filename].getPortalType(), 'Web Page')
+
+ # Edit a new document via FTP/DAV
+ text_content= """<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ </head>
+ <body>
+ <p>Content edited through webdav in iso-8859-1</p>
+ <p>éàèùêôîç</p>
+ </body>
+ </html>
+ """
+ iso_text_content = text_content.decode('utf-8').encode('iso-8859-1')
+ path = web_page_module.getPath()
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ stdin=StringIO(iso_text_content),
+ basic=self.authentication)
+ self.assertEqual(response.getStatus(), httplib.NO_CONTENT)
+ self.assertEquals(web_page_module[filename].getData(), iso_text_content)
+ # Convert to base format and run conversion into utf-8
+ transaction.commit()
+ self.tic()
+ # Content-Type header is replaced if sonversion encoding succeed
+ new_text_content = text_content.replace('charset=iso-8859-1', 'charset=utf-8')
+ self.assertEquals(web_page_module[filename].getTextContent(), new_text_content)
+
+ def test_GET_on_document(self):
+ """Get data from document in webdav
+ """
+ path = self.portal.portal_contributions.getPath()
+ filename = 'P-DMS-Presentation.3.Pages-001-en.odp'
+ file_object = makeFileUpload(filename)
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ stdin=file_object,
+ basic=self.authentication)
+ # Convert to base format and run conversion into utf-8
+ transaction.commit()
+ self.tic()
+
+ document_module = self.getDocumentModule()
+ document = document_module[filename]
+
+ response = self.publish(document.getPath(),
+ request_method='GET',
+ stdin=StringIO(),
+ basic=self.authentication)
+
+ self.assertEquals(response.getStatus(), httplib.OK)
+ self.assertEquals(response.getBody(), document.getData())
+
+ def test_PROPFIND_on_document(self):
+ """test Metadata extraction from webdav protocol
+ """
+ path = self.portal.portal_contributions.getPath()
+ filename = 'P-DMS-Presentation.3.Pages-001-en.odp'
+ file_object = makeFileUpload(filename)
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ stdin=file_object,
+ basic=self.authentication)
+ document_module = self.getDocumentModule()
+ document = document_module[filename]
+
+ # Do a PROPFIND on document, this needs to result in a 207
+ response = self.publish(document.getPath(),
+ request_method='PROPFIND',
+ env={'HTTP_DEPTH': '0'},
+ stdin=StringIO(),
+ basic=self.authentication)
+
+ self.assertEquals(response.getStatus(), httplib.MULTI_STATUS)
+ xml_metadata_string = response.getBody()
+ xml_metadata = etree.fromstring(xml_metadata_string)
+ self.assertEquals(xml_metadata.find('{DAV:}response/{DAV:}href').text,
+ document.getPath())
+ self.assertEquals(xml_metadata.find(
+ '{DAV:}response/{DAV:}propstat/{DAV:}prop/'\
+ '{DAV:}getcontenttype').text,
+ document.getContentType())
+ # Outputed string is not reproductable for comparaison.
+ # So we need to parse the date and use the same format
+ self.assertEquals(DateTime(xml_metadata.find('{DAV:}response/'\
+ '{DAV:}propstat/{DAV:}prop/{DAV:}getlastmodified')\
+ .text).ISO8601(),
+ document.getModificationDate().toZone('UTC').ISO8601())
+
+ @expectedFailure
+ def test_PROPFIND_on_document_bis(self):
+ """same test than test_PROPFIND_on_document
+ But with expected failure which is non blocking.
+ """
+ path = self.portal.portal_contributions.getPath()
+ filename = 'P-DMS-Presentation.3.Pages-001-en.odp'
+ file_object = makeFileUpload(filename)
+ response = self.publish('%s/%s' % (path, filename),
+ request_method='PUT',
+ stdin=file_object,
+ basic=self.authentication)
+ document_module = self.getDocumentModule()
+ document = document_module[filename]
+
+ # Do a PROPFIND on document, this needs to result in a 207
+ response = self.publish(document.getPath(),
+ request_method='PROPFIND',
+ env={'HTTP_DEPTH': '0'},
+ stdin=StringIO(),
+ basic=self.authentication)
+
+ self.assertEquals(response.getStatus(), httplib.MULTI_STATUS)
+ xml_metadata_string = response.getBody()
+ xml_metadata = etree.fromstring(xml_metadata_string)
+ self.assertEquals(xml_metadata.find(
+ '{DAV:}response/{DAV:}propstat/{DAV:}prop/{DAV:}creationdate').text,
+ document.getCreationDate().HTML4())
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestWebDavSupport))
+ return suite
More information about the Erp5-report
mailing list