testOOoDynamicStyle.py 11.1 KB
Newer Older
1
# -*- coding: utf-8 -*-
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
##############################################################################
#
# Copyright (c) 2009 Nexedi KK and Contributors. All Rights Reserved.
#                    Tatuya Kamada <tatuya@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 os
import sys
import unittest
33
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
34 35 36 37
from AccessControl.SecurityManagement import newSecurityManager
from Products.ERP5Type.tests.utils import DummyLocalizer
from zLOG import LOG
from Products.ERP5OOo.tests.utils import Validator
38
from Products.ERP5OOo.OOoUtils import OOoBuilder
39

40

41
class TestOooDynamicStyle(ERP5TypeTestCase):
42 43 44
  manager_username = 'tatuya'
  manager_password = 'tatuya'
  content_type_writer = 'application/vnd.oasis.opendocument.text'
45
  content = "<office:document-content xmlns:draw='urn:oasis:names:tc:opendocument:xmlns:drawing:1.0' xmlns:office='urn:oasis:names:tc:opendocument:xmlns:office:1.0' xmlns:text='urn:oasis:names:tc:opendocument:xmlns:text:1.0' xmlns:ooo='http://openoffice.org/2004/office' xmlns:number='urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:meta='urn:oasis:names:tc:opendocument:xmlns:meta:1.0' xmlns:table='urn:oasis:names:tc:opendocument:xmlns:table:1.0' xmlns:dr3d='urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0' xmlns:fo='urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0' xmlns:style='urn:oasis:names:tc:opendocument:xmlns:style:1.0' xmlns:xforms='http://www.w3.org/2002/xforms' xmlns:form='urn:oasis:names:tc:opendocument:xmlns:form:1.0' xmlns:script='urn:oasis:names:tc:opendocument:xmlns:script:1.0' xmlns:ooow='http://openoffice.org/2004/writer' xmlns:svg='urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0' xmlns:chart='urn:oasis:names:tc:opendocument:xmlns:chart:1.0' xmlns:dom='http://www.w3.org/2001/xml-events' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:oooc='http://openoffice.org/2004/calc' xmlns:math='http://www.w3.org/1998/Math/MathML' xmlns:tal='http://xml.zope.org/namespaces/tal' office:version='1.2'><office:scripts /><office:font-face-decls /><office:automatic-styles /><office:body><office:text /></office:body></office:document-content>"
46 47 48 49

  def getTitle(self):
    return "TestOOoDynamicStyle"

50 51
  def getBusinessTemplateList(self):
    return ('erp5_base',)
52 53 54

  def afterSetUp(self):
    self.login()
55
    self.getPortal().Localizer = DummyLocalizer()
56
    v12schema_url = os.path.join(os.path.dirname(__file__),
57
                                 'OpenDocument-v1.2-os-schema.rng') 
58
    self.validator = Validator(schema_url=v12schema_url)
59 60 61 62 63 64 65 66 67
    en_file_path = os.path.join(os.path.dirname(__file__),
                                'test_document',
                                'DYNAMIC_STYLE_en.odt')
    en_file = open(en_file_path, 'rb')
    ja_file_path = os.path.join(os.path.dirname(__file__),
                                'test_document',
                                'DYNAMIC_STYLE_ja.odt')
    ja_file = open(ja_file_path, 'rb')

68 69 70 71 72 73 74 75 76
    addStyleSheet = self.getPortal().manage_addProduct['OFSP'].manage_addFile
    if getattr(self.getPortal(), 'Test_getODTStyleSheet_en', None) is None:
      addStyleSheet(id='Test_getODTStyleSheet_en', file=en_file, title='',
        precondition='', content_type=self.content_type_writer)
    if getattr(self.getPortal(), 'Test_getODTStyleSheet_ja', None) is None:
      addStyleSheet(id='Test_getODTStyleSheet_ja', file=ja_file, title='',
        precondition='', content_type=self.content_type_writer)
    if getattr(self.getPortal(), 'Base_getODTStyleSheetByLanguage', None) is None:
      script_body = """
77 78 79
current_language = context.Localizer.get_selected_language()
return getattr(context, "%s_%s" % (parameter, current_language))
"""
80 81 82 83
      dispatcher = self.getPortal().manage_addProduct['PythonScripts']
      dispatcher.manage_addPythonScript('Base_getODTStyleSheetByLanguage')
      script = self.getPortal().Base_getODTStyleSheetByLanguage
      script.ZPythonScript_edit('parameter', script_body)
84 85 86 87 88 89 90 91 92 93 94 95

  def _validate(self, odf_file_data):
    error_list = self.validator.validate(odf_file_data)
    if error_list:
      self.fail(''.join(error_list))

  def test_01_dynamic(self):
    """
    Test applying stylesheet dynamically, using a Python Script with
    a stylesheet file name parameter.
    """
    request = self.app.REQUEST
96
    addOOoTemplate = self.getPortal().manage_addProduct['ERP5OOo'].addOOoTemplate
97
    addOOoTemplate(id='Dynamic_viewAsOdt', title='')
98
    Dynamic_viewAsOdt = self.getPortal().Dynamic_viewAsOdt
99 100 101
    # The stylesheet file 'Test_getODTStyleSheet' is not exist in this site.
    # So, the 'Base_getODTStyleSheet', a python script creates dynamically 
    # exsited stylesheet file name. 
102 103 104
    self.assertFalse(self.getPortal().hasObject('Test_getODTStyleSheet'))
    self.assertTrue(self.getPortal().hasObject('Test_getODTStyleSheet_ja'))
    self.assertTrue(self.getPortal().hasObject('Test_getODTStyleSheet_en'))
105 106 107 108 109 110
    Dynamic_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
                                 ooo_stylesheet='Test_getODTStyleSheet', 
                                 script_name='Base_getODTStyleSheetByLanguage')
    Dynamic_viewAsOdt.pt_edit(self.content, content_type='application/vnd.oasis.opendocument.text')

    # 1. test a normal case, language: ja
111 112
    self.getPortal().Localizer.changeLanguage('ja')
    response = self.publish('/' + self.getPortal().Dynamic_viewAsOdt.absolute_url(1))
113 114
    self.assertEqual('application/vnd.oasis.opendocument.text',
                     response.getHeader('content-type').split(';')[0])
115
    self.assertEqual('attachment; filename="Dynamic_viewAsOdt.odt"',
116 117 118 119
                     response.getHeader('content-disposition'))
    self._validate(response.getBody()) 
    self.assertTrue(200, response.getStatus())

120 121
    ooo_builder = OOoBuilder(response.getBody())
    styles_xml_body = ooo_builder.extract('styles.xml')
122 123 124 125
    self.assertTrue(len(styles_xml_body) > 0)
    # 'Style sheet ja' text is in the odt document header, 
    # and the header is in the 'styles.xml'.
    self.assertTrue(styles_xml_body.find('Style sheet ja') > 0)
Nicolas Delaby's avatar
Nicolas Delaby committed
126

127 128
    # 2. test a normal case, change the language to 'en', 
    #    so that the stylesheet changes dynamically.
129
    self.getPortal().Localizer = DummyLocalizer()
130 131
    self.getPortal().Localizer.changeLanguage('en')
    response = self.publish('/' + self.getPortal().Dynamic_viewAsOdt.absolute_url(1))
132
    self._validate(response.getBody()) 
133 134
    ooo_builder = OOoBuilder(response.getBody())
    styles_xml_body = ooo_builder.extract('styles.xml')
135
    self.assertTrue(styles_xml_body.find('Style sheet en') > 0)
Nicolas Delaby's avatar
Nicolas Delaby committed
136

137 138 139 140
    # 3. test a fail case, reset a not existed stylesheet
    Dynamic_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
                                 ooo_stylesheet='NotFound_getODTStyleSheet', 
                                 script_name='Base_getODTStyleSheet')
141 142 143 144 145
    self.assertFalse(self.getPortal().hasObject('NotFound_getODTStyleSheet'))
    self.assertFalse(self.getPortal().hasObject('NotFound_getODTStyleSheet_ja'))
    self.assertFalse(self.getPortal().hasObject('NotFound_getODTStyleSheet_en'))
    self.getPortal().Localizer.changeLanguage('en')
    response = self.publish('/' + self.getPortal().Dynamic_viewAsOdt.absolute_url(1))
146 147 148 149 150 151 152 153 154 155
    # then, it is not a zip stream 
    self.assertFalse(response.getBody().startswith('PK'))
    self.assertTrue(500, response.getStatus())
   

  def test_02_static(self):
    """
    Test applying stylesheet statically, using a stylesheet File object.
    """
    request = self.app.REQUEST
156
    addOOoTemplate = self.getPortal().manage_addProduct['ERP5OOo'].addOOoTemplate
157
    addOOoTemplate(id='Static_viewAsOdt', title='')
158
    Static_viewAsOdt = self.getPortal().Static_viewAsOdt
159
    # Test_getODTStyleSheet_ja is statically exist.
160
    self.assertTrue(self.getPortal().hasObject('Test_getODTStyleSheet_ja'))
161 162 163 164 165
    Static_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
                                ooo_stylesheet='Test_getODTStyleSheet_ja', script_name='')
    Static_viewAsOdt.pt_edit(self.content, content_type='application/vnd.oasis.opendocument.text')

    # 1. test a normal case
166
    response = self.publish('/' + self.getPortal().Static_viewAsOdt.absolute_url(1))
167 168 169
    self.assertTrue(200, response.getStatus())
    self.assertEqual('application/vnd.oasis.opendocument.text',
                     response.getHeader('content-type').split(';')[0])
170
    self.assertEqual('attachment; filename="Static_viewAsOdt.odt"',
171 172
                     response.getHeader('content-disposition'))
    self._validate(response.getBody()) 
173 174
    ooo_builder = OOoBuilder(response.getBody())
    styles_xml_body = ooo_builder.extract('styles.xml')
175 176
    self.assertTrue(len(styles_xml_body) > 0)
    self.assertTrue(styles_xml_body.find('Style sheet ja') > 0)
Nicolas Delaby's avatar
Nicolas Delaby committed
177

178
    # 2. test a normal case, change the style sheet
179
    self.assertTrue(self.getPortal().hasObject('Test_getODTStyleSheet_en'))
180 181
    Static_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
                                ooo_stylesheet='Test_getODTStyleSheet_en', script_name='')
182
    response = self.publish('/' + self.getPortal().Static_viewAsOdt.absolute_url(1))
183 184
    self.assertTrue(200, response.getStatus())
    self._validate(response.getBody()) 
185 186
    ooo_builder = OOoBuilder(response.getBody())
    styles_xml_body = ooo_builder.extract('styles.xml')
187 188
    self.assertTrue(len(styles_xml_body) > 0)
    self.assertTrue(styles_xml_body.find('Style sheet en') > 0)
Nicolas Delaby's avatar
Nicolas Delaby committed
189

190
    # 3. test a fail case
191
    self.assertFalse(self.getPortal().hasObject('NotFound_getODTStyleSheet'))
192 193
    Static_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
                                ooo_stylesheet='NotFound_getODTStyleSheet', script_name='')
194
    response = self.publish('/' + self.getPortal().Static_viewAsOdt.absolute_url(1))
195 196
    self.assertFalse(response.getBody().startswith('PK'))
    self.assertTrue(500, response.getStatus())
Nicolas Delaby's avatar
Nicolas Delaby committed
197

198 199 200 201 202

def test_suite():
  suite = unittest.TestSuite()
  suite.addTest(unittest.makeSuite(TestOooDynamicStyle))
  return suite