Commit 345b0669 authored by Fabien Morin's avatar Fabien Morin

- add TODO

- add a method to get the odf document from the printout
- improve the way to validates original documents
- in test_09_FieldReplacement, validate generated documents
- initial import of testFormPrintoutAsODG.py. For now, it just contain a test
for text fields
- add test file Foo_001.odg


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@31240 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 43507de7
...@@ -37,10 +37,15 @@ from AccessControl.SecurityManagement import newSecurityManager ...@@ -37,10 +37,15 @@ from AccessControl.SecurityManagement import newSecurityManager
from Products.ERP5OOo.OOoUtils import OOoBuilder from Products.ERP5OOo.OOoUtils import OOoBuilder
from Products.ERP5OOo.tests.utils import Validator from Products.ERP5OOo.tests.utils import Validator
from Products.ERP5Type.tests.utils import FileUpload from Products.ERP5Type.tests.utils import FileUpload
from zLOG import LOG , INFO from StringIO import StringIO
from lxml import etree from lxml import etree
import os 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): class TestFormPrintout(ERP5TypeTestCase):
run_all_test = 1 run_all_test = 1
...@@ -147,20 +152,19 @@ class TestFormPrintout(ERP5TypeTestCase): ...@@ -147,20 +152,19 @@ class TestFormPrintout(ERP5TypeTestCase):
if default_pref.getPreferenceState() != 'global': if default_pref.getPreferenceState() != 'global':
default_pref.enable() default_pref.enable()
def _validate(self, odf_file_data): def _validate(self, odf_file_data):
error_list = self.validator.validate(odf_file_data) error_list = self.validator.validate(odf_file_data)
if error_list: if error_list:
self.fail(''.join(error_list)) self.fail(''.join(error_list))
def _validateFromPrintout(self, document, printout_form): def getODFDocumentFromPrintout(self, printout_form):
'''validate test document before to modify it '''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: if document_file is not None:
return self._validate(document_file.data) return document_file
raise ValueError ('%s template not found for %s' % (printout_form.template, raise ValueError ('%s template not found' % printout_form.template)
document))
def test_01_Paragraph(self, run=run_all_test): def test_01_Paragraph(self, run=run_all_test):
""" """
...@@ -179,7 +183,7 @@ class TestFormPrintout(ERP5TypeTestCase): ...@@ -179,7 +183,7 @@ class TestFormPrintout(ERP5TypeTestCase):
# test target # test target
foo_printout = portal.foo_module.test1.Foo_viewAsPrintout 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 request = self.app.REQUEST
# 1. Normal case: "my_title" field to the "my_title" reference in the ODF document # 1. Normal case: "my_title" field to the "my_title" reference in the ODF document
...@@ -870,7 +874,7 @@ return report_section_list ...@@ -870,7 +874,7 @@ return report_section_list
title='', title='',
form_name='FooReport_view', form_name='FooReport_view',
template='Foo2_getODTStyleSheet') template='Foo2_getODTStyleSheet')
self._validateFromPrintout(test1, foo_report_printout) self._validate(self.getODFDocumentFromPrintout(foo_report_printout))
odf_document = foo_report_printout() odf_document = foo_report_printout()
#test_output = open("/tmp/test_04_Iteratoin.odf", "w") #test_output = open("/tmp/test_04_Iteratoin.odf", "w")
...@@ -975,7 +979,7 @@ return report_section_list ...@@ -975,7 +979,7 @@ return report_section_list
title='', title='',
form_name='FooReport_view', form_name='FooReport_view',
template='Foo3_getODTStyleSheet') template='Foo3_getODTStyleSheet')
self._validateFromPrintout(test1, foo_report_printout) self._validate(self.getODFDocumentFromPrintout(foo_report_printout))
odf_document = foo_report_printout() odf_document = foo_report_printout()
#test_output = open("/tmp/test_04_Iteratoin_02_Section_01.odf", "w") #test_output = open("/tmp/test_04_Iteratoin_02_Section_01.odf", "w")
...@@ -1088,7 +1092,7 @@ return report_section_list ...@@ -1088,7 +1092,7 @@ return report_section_list
title='', title='',
form_name='Foo2_view', form_name='Foo2_view',
template='Foo4_getODTStyleSheet') template='Foo4_getODTStyleSheet')
self._validateFromPrintout(test1, foo_report_printout) self._validate(self.getODFDocumentFromPrintout(foo_report_printout))
odf_document = foo_report_printout() odf_document = foo_report_printout()
# test_output = open("/tmp/test_04_Iteratoin_03_Section_01.odf", "w") # test_output = open("/tmp/test_04_Iteratoin_03_Section_01.odf", "w")
...@@ -1220,7 +1224,7 @@ return [] ...@@ -1220,7 +1224,7 @@ return []
def test_09_FieldReplacement(self, run=run_all_test): def test_09_FieldReplacement(self, run=run_all_test):
"""test field in ODF Documents""" """test field in ODF Documents"""
foo_printout = self.portal.foo_module.test1.Foo5_viewAsPrintout 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 foo_form = self.portal.foo_module.test1.Foo_view
field_name = 'your_checkbox' field_name = 'your_checkbox'
if foo_form._getOb(field_name, None) is None: if foo_form._getOb(field_name, None) is None:
...@@ -1229,6 +1233,7 @@ return [] ...@@ -1229,6 +1233,7 @@ return []
checkbox.values['default'] = 1 checkbox.values['default'] = 1
odf_document = foo_printout() odf_document = foo_printout()
self._validate(odf_document)
builder = OOoBuilder(odf_document) builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml") content_xml = builder.extract("content.xml")
document_tree = etree.XML(content_xml) document_tree = etree.XML(content_xml)
...@@ -1237,6 +1242,7 @@ return [] ...@@ -1237,6 +1242,7 @@ return []
checkbox.values['default'] = 0 checkbox.values['default'] = 0
odf_document = foo_printout() odf_document = foo_printout()
self._validate(odf_document)
builder = OOoBuilder(odf_document) builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml") content_xml = builder.extract("content.xml")
document_tree = etree.XML(content_xml) document_tree = etree.XML(content_xml)
......
##############################################################################
# -*- 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment