diff --git a/product/ERP5OOo/tests/testFormPrintout.py b/product/ERP5OOo/tests/testFormPrintout.py index f561fdc6782403c7a60236209b602fe3311a44b0..d5579b1f28e5a5aec71e052348a98fe791cddf16 100644 --- a/product/ERP5OOo/tests/testFormPrintout.py +++ b/product/ERP5OOo/tests/testFormPrintout.py @@ -37,10 +37,15 @@ from AccessControl.SecurityManagement import newSecurityManager from Products.ERP5OOo.OOoUtils import OOoBuilder from Products.ERP5OOo.tests.utils import Validator from Products.ERP5Type.tests.utils import FileUpload -from zLOG import LOG , INFO +from StringIO import StringIO from lxml import etree import os +# TODO : move code specific to ODT document to another file like +# testFormPrintoutAsODT which inherite from this class. +# This class should contain only common parts to all ODF type tests (odg, odt, +# ods, ...). + class TestFormPrintout(ERP5TypeTestCase): run_all_test = 1 @@ -146,21 +151,20 @@ class TestFormPrintout(ERP5TypeTestCase): #default_pref.setPreferredConversionCacheFactory('document_cache_factory') if default_pref.getPreferenceState() != 'global': default_pref.enable() - def _validate(self, odf_file_data): error_list = self.validator.validate(odf_file_data) if error_list: self.fail(''.join(error_list)) - def _validateFromPrintout(self, document, printout_form): - '''validate test document before to modify it + def getODFDocumentFromPrintout(self, printout_form): + '''return odf document from the printout ''' - document_file = getattr(document, printout_form.template, None) + document_file = getattr(self.portal, printout_form.template, None) + document_file = StringIO(document_file).read() if document_file is not None: - return self._validate(document_file.data) - raise ValueError ('%s template not found for %s' % (printout_form.template, - document)) + return document_file + raise ValueError ('%s template not found' % printout_form.template) def test_01_Paragraph(self, run=run_all_test): """ @@ -179,7 +183,7 @@ class TestFormPrintout(ERP5TypeTestCase): # test target foo_printout = portal.foo_module.test1.Foo_viewAsPrintout - self._validateFromPrintout(portal.foo_module.test1, foo_printout) + self._validate(self.getODFDocumentFromPrintout(foo_printout)) request = self.app.REQUEST # 1. Normal case: "my_title" field to the "my_title" reference in the ODF document @@ -870,7 +874,7 @@ return report_section_list title='', form_name='FooReport_view', template='Foo2_getODTStyleSheet') - self._validateFromPrintout(test1, foo_report_printout) + self._validate(self.getODFDocumentFromPrintout(foo_report_printout)) odf_document = foo_report_printout() #test_output = open("/tmp/test_04_Iteratoin.odf", "w") @@ -975,7 +979,7 @@ return report_section_list title='', form_name='FooReport_view', template='Foo3_getODTStyleSheet') - self._validateFromPrintout(test1, foo_report_printout) + self._validate(self.getODFDocumentFromPrintout(foo_report_printout)) odf_document = foo_report_printout() #test_output = open("/tmp/test_04_Iteratoin_02_Section_01.odf", "w") @@ -1088,7 +1092,7 @@ return report_section_list title='', form_name='Foo2_view', template='Foo4_getODTStyleSheet') - self._validateFromPrintout(test1, foo_report_printout) + self._validate(self.getODFDocumentFromPrintout(foo_report_printout)) odf_document = foo_report_printout() # test_output = open("/tmp/test_04_Iteratoin_03_Section_01.odf", "w") @@ -1220,7 +1224,7 @@ return [] def test_09_FieldReplacement(self, run=run_all_test): """test field in ODF Documents""" foo_printout = self.portal.foo_module.test1.Foo5_viewAsPrintout - self._validateFromPrintout(self.portal.foo_module.test1, foo_printout) + self._validate(self.getODFDocumentFromPrintout(foo_printout)) foo_form = self.portal.foo_module.test1.Foo_view field_name = 'your_checkbox' if foo_form._getOb(field_name, None) is None: @@ -1229,6 +1233,7 @@ return [] checkbox.values['default'] = 1 odf_document = foo_printout() + self._validate(odf_document) builder = OOoBuilder(odf_document) content_xml = builder.extract("content.xml") document_tree = etree.XML(content_xml) @@ -1237,6 +1242,7 @@ return [] checkbox.values['default'] = 0 odf_document = foo_printout() + self._validate(odf_document) builder = OOoBuilder(odf_document) content_xml = builder.extract("content.xml") document_tree = etree.XML(content_xml) diff --git a/product/ERP5OOo/tests/testFormPrintoutAsODG.py b/product/ERP5OOo/tests/testFormPrintoutAsODG.py new file mode 100644 index 0000000000000000000000000000000000000000..c7a113dd145e95c639402251bd12a92d4475702f --- /dev/null +++ b/product/ERP5OOo/tests/testFormPrintoutAsODG.py @@ -0,0 +1,236 @@ +############################################################################## +# -*- coding: utf-8 -*- +# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. +# Fabien Morin <fabien@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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, +# USA. +# +############################################################################## + +import unittest +import transaction +from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase +from Products.ERP5OOo.tests.testFormPrintout import TestFormPrintout +from Products.ERP5OOo.OOoUtils import OOoBuilder +from Products.ERP5OOo.tests.utils import Validator +from lxml import etree +import os + +class TestFormPrintoutAsODG(TestFormPrintout): + run_all_test = 1 + + def getTitle(self): + """ + Return the title of the current test set. + """ + return "FormPrintoutAsODG" + + def afterSetUp(self): + self.login() + # XML validator + v12schema_url = os.path.join(os.path.dirname(__file__), + 'OpenDocument-schema-v1.2-draft9.rng') + self.validator = Validator(schema_url=v12schema_url) + + foo_file_path = os.path.join(os.path.dirname(__file__), + 'test_document', + 'Foo_001.odg') + foo_file = open(foo_file_path, 'rb') + self._validate(foo_file.read()) + custom = self.portal.portal_skins.custom + addStyleSheet = custom.manage_addProduct['OFSP'].manage_addFile + if custom._getOb('Foo_getODGStyleSheet', None) is None: + addStyleSheet(id='Foo_getODGStyleSheet', file=foo_file, title='', + precondition='', + content_type='application/vnd.oasis.opendocument.graphics') + erp5OOo = custom.manage_addProduct['ERP5OOo'] + addOOoTemplate = erp5OOo.addOOoTemplate + if custom._getOb('Foo_viewAsOdg', None) is None: + addOOoTemplate(id='Foo_viewAsOdg', title='') + request = self.app.REQUEST + Foo_viewAsOdg = custom.Foo_viewAsOdg + Foo_viewAsOdg.doSettings(request, title='', xml_file_id='content.xml', + ooo_stylesheet='Foo_getODGStyleSheet') + builder = OOoBuilder(foo_file) + content = builder.extract('content.xml') + Foo_viewAsOdg.pt_edit(content, + content_type='application/vnd.oasis.opendocument.graphics') + if custom._getOb('Foo_viewAsODGPrintout', None) is None: + erp5OOo.addFormPrintout(id='Foo_viewAsODGPrintout', title='', + form_name='Foo_view', template='Foo_getODGStyleSheet') + if custom._getOb('FooReport_viewAsODGPrintout', None) is None: + erp5OOo.addFormPrintout(id='FooReport_viewAsODGPrintout', + title='') + + ## append 'test1' data to a listbox + foo_module = self.portal.foo_module + if foo_module._getOb('test1', None) is None: + foo_module.newContent(id='test1', portal_type='Foo') + test1 = foo_module.test1 + if test1._getOb("foo_1", None) is None: + test1.newContent("foo_1", portal_type='Foo Line') + if test1._getOb("foo_2", None) is None: + test1.newContent("foo_2", portal_type='Foo Line') + transaction.commit() + self.tic() + + def getStyleDictFromFieldName(self, content_xml, field_id): + '''parse content_xml string and return a dict with node node.tag + as key and style dict as value + ''' + element_tree = etree.XML(content_xml) + text_xpath = '//draw:frame[@draw:name="%s"]/*' % field_id + node_list = element_tree.xpath(text_xpath, namespaces=element_tree.nsmap) + style_dict = {} + for target_node in node_list: + style_dict = {} + for descendant in target_node.iterdescendants(): + style_dict.setdefault(descendant.tag, {}).update(descendant.attrib) + return style_dict + + def test_01_TextField(self): + """ + mapping a field to textbox + """ + portal = self.getPortal() + foo_module = self.portal.foo_module + if foo_module._getOb('test1', None) is None: + foo_module.newContent(id='test1', portal_type='Foo') + test1 = foo_module.test1 + test1.setTitle('Foo title!') + transaction.commit() + self.tic() + + style_dict = {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}span': + {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T2'}, + '{urn:oasis:names:tc:opendocument:xmlns:text:1.0}p': + {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'P2'} + } + + # test target + foo_printout = portal.foo_module.test1.Foo_viewAsODGPrintout + original_file_content = self.getODFDocumentFromPrintout(foo_printout) + self._validate(original_file_content) + + # extract content.xml from original odg document + original_doc_builder = OOoBuilder(original_file_content) + original_content_xml = original_doc_builder.extract("content.xml") + # get style of the title in the orignal test document + original_document_style_dict = self.getStyleDictFromFieldName(original_content_xml, + 'my_title') + + # check the style is good before the odg generation + self.assertEqual(original_document_style_dict, style_dict) + + request = self.app.REQUEST + # 1. Normal case: "my_title" field to the "my_title" reference in the ODF document + self.portal.changeSkin('ODT') + odf_document = foo_printout.index_html(REQUEST=request) + self.assertTrue(odf_document is not None) + builder = OOoBuilder(odf_document) + content_xml = builder.extract("content.xml") + final_document_style_dict = self.getStyleDictFromFieldName(content_xml, + 'my_title') + + # check the style is keept after the odg generation + self.assertEqual(final_document_style_dict, style_dict) + + self.assertTrue(content_xml.find("Foo title!") > 0) + self.assertEqual(request.RESPONSE.getHeader('content-type'), + 'application/vnd.oasis.opendocument.graphics; charset=utf-8') + self.assertEqual(request.RESPONSE.getHeader('content-disposition'), + 'inline;filename="Foo_viewAsODGPrintout.odg"') + self._validate(odf_document) + + # 2. Normal case: change the field value and check again the ODF document + test1.setTitle("Changed Title!") + #foo_form.my_title.set_value('default', "Changed Title!") + odf_document = foo_printout.index_html(REQUEST=request) + self.assertTrue(odf_document is not None) + builder = OOoBuilder(odf_document) + content_xml = builder.extract("content.xml") + self.assertTrue(content_xml.find("Changed Title!") > 0) + self._validate(odf_document) + + # 3. False case: change the field name + test1.setTitle("you cannot find") + # rename id 'my_title' to 'xxx_title', then does not match in the ODF document + foo_form = portal.foo_module.test1.Foo_view + foo_form.manage_renameObject('my_title', 'xxx_title', REQUEST=request) + odf_document = foo_printout.index_html(REQUEST=request) + self.assertTrue(odf_document is not None) + builder = OOoBuilder(odf_document) + content_xml = builder.extract("content.xml") + self.assertFalse(content_xml.find("you cannot find") > 0) + self._validate(odf_document) + # put back + foo_form.manage_renameObject('xxx_title', 'my_title', REQUEST=request) + + ## 4. False case: does not set a ODF template + self.assertTrue(foo_printout.template == 'Foo_getODGStyleSheet') + tmp_template = foo_printout.template + foo_printout.template = None + # template == None, causes a ValueError + try: + foo_printout.index_html(REQUEST=request) + except ValueError, e: + # e -> 'Can not create a ODF Document without a odf_template' + self.assertTrue(True) + + # put back + foo_printout.template = tmp_template + + # 5. Normal case: just call a FormPrintout object + request.RESPONSE.setHeader('Content-Type', 'text/html') + test1.setTitle("call!") + odf_document = foo_printout() # call + self.assertTrue(odf_document is not None) + builder = OOoBuilder(odf_document) + content_xml = builder.extract("content.xml") + self.assertTrue(content_xml.find("call!") > 0) + # when just call FormPrintout, it does not change content-type + self.assertEqual(request.RESPONSE.getHeader('content-type'), 'text/html') + self._validate(odf_document) + + # 5. Normal case: utf-8 string + test1.setTitle("Fran莽ais") + odf_document = foo_printout() + self.assertTrue(odf_document is not None) + builder = OOoBuilder(odf_document) + content_xml = builder.extract("content.xml") + self.assertTrue(content_xml.find("Fran莽ais") > 0) + self._validate(odf_document) + + # 6. Normal case: unicode string + test1.setTitle(u'Fran莽ais test2') + odf_document = foo_printout() + self.assertTrue(odf_document is not None) + builder = OOoBuilder(odf_document) + content_xml = builder.extract("content.xml") + self.assertTrue(content_xml.find("Fran莽ais test2") > 0) + self._validate(odf_document) + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestFormPrintoutAsODG)) + return suite diff --git a/product/ERP5OOo/tests/test_document/Foo_001.odg b/product/ERP5OOo/tests/test_document/Foo_001.odg new file mode 100644 index 0000000000000000000000000000000000000000..2eabfa01db60eb8a9c0fe9474d13bf801cb08c42 Binary files /dev/null and b/product/ERP5OOo/tests/test_document/Foo_001.odg differ