diff --git a/product/ERP5Form/tests/testOOoChart.py b/product/ERP5Form/tests/testOOoChart.py new file mode 100644 index 0000000000000000000000000000000000000000..2699873722e0f6f4b4ada28855fa32222e2da480 --- /dev/null +++ b/product/ERP5Form/tests/testOOoChart.py @@ -0,0 +1,214 @@ +############################################################################## +# Copyright (c) 2007 Nexedi SA and Contributors. All Rights Reserved. +# Jerome Perrin <jerome@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability 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 +# garantees 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 unittest +from Products.ERP5Form.Form import ERP5Form +from DocumentTemplate import String + +from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase +from Products.ERP5Form.Selection import Selection +from Testing import ZopeTestCase +from Products.ERP5OOo.tests.utils import Validator +from Acquisition import aq_base +from Products.ERP5Type.Utils import get_request +from Products.ERP5OOo.Document.OOoDocument import STANDARD_IMAGE_FORMAT_LIST + +HTTP_OK = 200 +debug = 0 + +class TestOOoChart(ERP5TypeTestCase, ZopeTestCase.Functional): + """Tests OOoChart a and this render for ERP5.""" + form_id = 'TestOOochart_viewForm' + nb_persons = 10 + content_type = 'application/vnd.oasis.opendocument.graphics' + skin = 'ODG' + + def getTitle(self): + return 'Test OOoChart' + + def getBusinessTemplateList(self): + return ('erp5_base', 'erp5_ui_test',) + + def afterSetUp(self): + self.auth = 'ERP5TypeTestCase:' + portal = self.getPortal() + container = portal.portal_skins.custom + container._setObject(self.form_id, ERP5Form(self.form_id, 'View')) + form = getattr(container, self.form_id) + # create some persons in person_module + self.createPersons() + # add a ListBox field + form.manage_addField('listbox', 'listbox', 'ListBox') + form.listbox.ListBox_setPropertyList(field_list_method='zCountDocumentPerOwner', + field_count_method='', + field_columns=['owner | Owner', + 'owner_count | Owner Count', + 'number_count | Reference Count'], + ) + + # create a Field OOoChart + form.manage_addField('my_OOoChart', 'my_OOoChart', 'OOoChart') + form.my_OOoChart.manage_edit_xmlrpc(dict(form_id=self.form_id, field_id='listbox')) + + # create a ZSQL Method + sql = """SELECT owner, count(uid) AS owner_count, + count(reference) AS number_count + FROM catalog + WHERE portal_type = 'Person' + GROUP BY owner ORDER BY owner_count DESC""" + + template = String(source_string=sql) + container.manage_addProduct['ZSQLMethods'].manage_addZSQLMethod('zCountDocumentPerOwner', 'zCountDocumentPerOwner', 'erp5_sql_connection', '', template) + # enable preference + preference = self.getPortal().portal_preferences.default_site_preference + preference.setPriority(1) + if preference.getPreferenceState() == 'disabled': + self.getWorkflowTool().doActionFor(ob=preference, + action='enable_action', + wf_id='preference_workflow') + self.validator = Validator() + get_transaction().commit() + self.tic() + + def createPersons(self): + """ Create 10 persons in person_module """ + module = self.getPersonModule() + if len(module.objectIds()) == 0: + for i in range(self.nb_persons): + module.newContent(portal_type='Person', id='person%s' % i) + + def _validate(self, odf_file_data): + error_list = self.validator.validate(odf_file_data) + if error_list: + self.fail(''.join(error_list)) + + def test_ooo_chart(self): + portal = self.getPortal() + # Does the form exist ? + self.assertTrue(self.form_id in portal.portal_skins.custom.objectIds()) + getattr(aq_base(portal.portal_skins.custom), self.form_id) + form = getattr(portal.portal_skins.custom, self.form_id) + listbox = form.listbox + request = get_request() + request['here'] = portal.portal_skins.custom + line_list = [l for l in listbox.get_value('default', + render_format='list', + REQUEST=request) ] + + # listbox is empty? + self.assertEquals(2, len(line_list)) + + # Does the field OOoChart exist ? + OOoChart = form.my_OOoChart + response = self.publish( + '/%s/%s/my_OOoChart?render_format=&display=medium' + % (self.portal.getId(), self.form_id), self.auth ) + # test render raw + self.assertEquals(HTTP_OK, response.getStatus()) + content_type = response.getHeader('content-type') + + # test content type : application/vnd.oasis.opendocument.graphics + self.assertTrue(content_type.startswith(self.content_type), content_type) + content_disposition = response.getHeader('content-disposition') + self.assertEquals('inline', content_disposition.split(';')[0]) + # Test ODG (zip) + body = response.getBody() + # Test Validation Relax NG + self._validate(body) + + from Products.ERP5OOo.OOoUtils import OOoParser + parser = OOoParser() + parser.openFromString(body) + content_xml_view = parser.oo_files['content.xml'] + import libxml2 + doc_view = libxml2.parseDoc(content_xml_view) + xpath = '//@*[name() = "xlink:href"]' + num_object = doc_view.xpathEval(xpath)[0].content[2:] + + content_xml_build = parser.oo_files['%s/content.xml' % num_object] + doc_build = libxml2.parseDoc(content_xml_build) + xpath = '//@*[name() = "office:value"]' + values = doc_build.xpathEval(xpath) + # Test the datas presence in the file XML + self.assertNotEquals(0, len(values)) + # 2 values because there are - 10 document created by a owner + # - 0 Reference count + self.assertEquals(2, len(values)) + + # Test the differents render + # render image + for image_format in STANDARD_IMAGE_FORMAT_LIST: + response = self.publish( + '/%s/%s/my_OOoChart?render_format=%s&display=medium' + % (self.portal.getId(), self.form_id, image_format), self.auth ) + self.assertEquals(HTTP_OK, response.getStatus()) + + # render pdf + response = self.publish( + '/%s/%s/my_OOoChart?render_format=pdf&display=medium' + % (self.portal.getId(), self.form_id), self.auth ) + self.assertEquals(HTTP_OK, response.getStatus()) + + + # Change some params and restart (circle, bar, ...) + # chart type : circle + form.my_OOoChart.manage_edit_xmlrpc(dict(chart_type='chart:circle')) + response = self.publish( + '/%s/%s/my_OOoChart?render_format=&display=medium' + % (self.portal.getId(), self.form_id), self.auth ) + # Test ODG (zip) with other params + body = response.getBody() + # Test Validation Relax NG + self._validate(body) + + # chart type : line + form.my_OOoChart.manage_edit_xmlrpc(dict(chart_type='chart:line')) + response = self.publish( + '/%s/%s/my_OOoChart?render_format=&display=medium' + % (self.portal.getId(), self.form_id), self.auth ) + # Test ODG (zip) with other params + body = response.getBody() + # Test Validation Relax NG + self._validate(body) + + #chart type : scatter + form.my_OOoChart.manage_edit_xmlrpc(dict(chart_type='chart:scatter')) + response = self.publish( + '/%s/%s/my_OOoChart?render_format=&display=medium' + % (self.portal.getId(), self.form_id), self.auth ) + # Test ODG (zip) with other params + body = response.getBody() + # Test Validation Relax NG + self._validate(body) + + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestOOoChart)) + return suite + +