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
+
+