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
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)
......
##############################################################################
# -*- 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