############################################################################## # # Copyright (c) 2004 Zope Corporation and Contributors. All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """ GenericSetup.utils unit tests $Id: test_utils.py 41591 2006-02-10 15:52:17Z yuppie $ """ import unittest import Testing from xml.dom.minidom import parseString from Products.GenericSetup.utils import PrettyDocument from Products.GenericSetup.testing import DummySetupEnviron _EMPTY_PROPERTY_EXPORT = """\ False 1970/01/01 0.0 0 0 False 0 0.0 False """ _NORMAL_PROPERTY_EXPORT = """\ True 2000/01/01 1.1 1 1 Foo String Foo Text Foo False 1789 3.1415 True """ _FIXED_PROPERTY_EXPORT = """\ True 2000/01/01 1.1 1 1 Foo String Foo Text Foo False 1789 3.1415 True """ _SPECIAL_IMPORT = """\ 0 """ _I18N_IMPORT = """\ Foo String """ _NOPURGE_IMPORT = """\ """ def _testFunc( *args, **kw ): """ This is a test. This is only a test. """ _TEST_FUNC_NAME = 'Products.GenericSetup.tests.test_utils._testFunc' class Whatever: pass _WHATEVER_NAME = 'Products.GenericSetup.tests.test_utils.Whatever' whatever_inst = Whatever() whatever_inst.__name__ = 'whatever_inst' _WHATEVER_INST_NAME = 'Products.GenericSetup.tests.test_utils.whatever_inst' class UtilsTests( unittest.TestCase ): def test__getDottedName_simple( self ): from Products.GenericSetup.utils import _getDottedName self.assertEqual( _getDottedName( _testFunc ), _TEST_FUNC_NAME ) def test__getDottedName_string( self ): from Products.GenericSetup.utils import _getDottedName self.assertEqual( _getDottedName( _TEST_FUNC_NAME ), _TEST_FUNC_NAME ) def test__getDottedName_unicode( self ): from Products.GenericSetup.utils import _getDottedName dotted = u'%s' % _TEST_FUNC_NAME self.assertEqual( _getDottedName( dotted ), _TEST_FUNC_NAME ) self.assertEqual( type( _getDottedName( dotted ) ), str ) def test__getDottedName_class( self ): from Products.GenericSetup.utils import _getDottedName self.assertEqual( _getDottedName( Whatever ), _WHATEVER_NAME ) def test__getDottedName_inst( self ): from Products.GenericSetup.utils import _getDottedName self.assertEqual( _getDottedName( whatever_inst ) , _WHATEVER_INST_NAME ) def test__getDottedName_noname( self ): from Products.GenericSetup.utils import _getDottedName class Doh: pass doh = Doh() self.assertRaises( ValueError, _getDottedName, doh ) class PropertyManagerHelpersTests(unittest.TestCase): def _getTargetClass(self): from Products.GenericSetup.utils import PropertyManagerHelpers return PropertyManagerHelpers def _makeOne(self, *args, **kw): from Products.GenericSetup.utils import NodeAdapterBase class Foo(self._getTargetClass(), NodeAdapterBase): pass return Foo(*args, **kw) def setUp(self): from OFS.PropertyManager import PropertyManager obj = PropertyManager('obj') obj.foobarbaz = ('Foo', 'Bar', 'Baz') obj._properties = () obj.manage_addProperty('foo_boolean', '', 'boolean') obj.manage_addProperty('foo_date', '1970/01/01', 'date') obj.manage_addProperty('foo_float', '0', 'float') obj.manage_addProperty('foo_int', '0', 'int') obj.manage_addProperty('foo_lines', '', 'lines') obj.manage_addProperty('foo_long', '0', 'long') obj.manage_addProperty('foo_string', '', 'string') obj.manage_addProperty('foo_text', '', 'text') obj.manage_addProperty('foo_tokens', '', 'tokens') obj.manage_addProperty('foo_selection', 'foobarbaz', 'selection') obj.manage_addProperty('foo_mselection', 'foobarbaz', 'multiple selection') obj.manage_addProperty('foo_boolean0', '', 'boolean') obj.manage_addProperty('foo_ro', '', 'string') obj._properties[-1]['mode'] = '' # Read-only, not exported or purged obj.manage_addProperty('foo_int_nodel', 0, 'int') obj._properties[-1]['mode'] = 'w' # Not deletable obj.manage_addProperty('foo_float_nodel', 0, 'float') obj._properties[-1]['mode'] = 'w' # Not deletable obj.manage_addProperty('foo_boolean_nodel', '', 'boolean') obj._properties[-1]['mode'] = 'w' # Not deletable self.helpers = self._makeOne(obj, DummySetupEnviron()) def _populate(self, obj): obj._updateProperty('foo_boolean', 'True') obj._updateProperty('foo_date', '2000/01/01') obj._updateProperty('foo_float', '1.1') obj._updateProperty('foo_int', '1') obj._updateProperty('foo_lines', 'Foo\nLines') obj._updateProperty('foo_long', '1') obj._updateProperty('foo_string', 'Foo String') obj._updateProperty('foo_text', 'Foo\nText') obj._updateProperty( 'foo_tokens', ('Foo', 'Tokens') ) obj._updateProperty('foo_selection', 'Foo') obj._updateProperty( 'foo_mselection', ('Foo', 'Baz') ) obj.foo_boolean0 = 0 obj._updateProperty('foo_ro', 'RO') obj._updateProperty('foo_int_nodel', '1789') obj._updateProperty('foo_float_nodel', '3.1415') obj._updateProperty('foo_boolean_nodel', 'True') def test__extractProperties_empty(self): doc = self.helpers._doc = PrettyDocument() node = doc.createElement('dummy') node.appendChild(self.helpers._extractProperties()) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), _EMPTY_PROPERTY_EXPORT) def test__extractProperties_normal(self): self._populate(self.helpers.context) doc = self.helpers._doc = PrettyDocument() node = doc.createElement('dummy') node.appendChild(self.helpers._extractProperties()) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), _NORMAL_PROPERTY_EXPORT) def test__purgeProperties(self): obj = self.helpers.context self._populate(obj) self.helpers._purgeProperties() self.assertEqual(getattr(obj, 'foo_boolean', None), None) self.assertEqual(getattr(obj, 'foo_date', None), None) self.assertEqual(getattr(obj, 'foo_float', None), None) self.assertEqual(getattr(obj, 'foo_int', None), None) self.assertEqual(getattr(obj, 'foo_lines', None), None) self.assertEqual(getattr(obj, 'foo_long', None), None) self.assertEqual(getattr(obj, 'foo_string', None), None) self.assertEqual(getattr(obj, 'foo_text', None), None) self.assertEqual(getattr(obj, 'foo_tokens', None), None) self.assertEqual(getattr(obj, 'foo_selection', None), None) self.assertEqual(getattr(obj, 'foo_mselection', None), None) self.assertEqual(getattr(obj, 'foo_boolean0', None), None) self.assertEqual(getattr(obj, 'foo_ro', None), 'RO') def test__initProperties_normal(self): node = parseString(_NORMAL_PROPERTY_EXPORT).documentElement self.helpers._initProperties(node) self.assertEqual(type(self.helpers.context.foo_int), int) self.assertEqual(type(self.helpers.context.foo_string), str) self.assertEqual(type(self.helpers.context.foo_tokens), tuple) self.assertEqual(type(self.helpers.context.foo_tokens[0]), str) doc = self.helpers._doc = PrettyDocument() node = doc.createElement('dummy') node.appendChild(self.helpers._extractProperties()) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), _NORMAL_PROPERTY_EXPORT) def test__initProperties_fixed(self): node = parseString(_FIXED_PROPERTY_EXPORT).documentElement self.helpers._initProperties(node) doc = self.helpers._doc = PrettyDocument() node = doc.createElement('dummy') node.appendChild(self.helpers._extractProperties()) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), _NORMAL_PROPERTY_EXPORT) def test__initProperties_special(self): node = parseString(_SPECIAL_IMPORT).documentElement self.helpers._initProperties(node) doc = self.helpers._doc = PrettyDocument() node = doc.createElement('dummy') node.appendChild(self.helpers._extractProperties()) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), _EMPTY_PROPERTY_EXPORT) def test__initProperties_i18n(self): self.helpers.context.manage_addProperty('i18n_domain', '', 'string') node = parseString(_I18N_IMPORT).documentElement self.helpers._initProperties(node) self.assertEqual(self.helpers.context.i18n_domain, 'dummy_domain') def test__initProperties_nopurge_base(self): node = parseString(_NOPURGE_IMPORT).documentElement self.helpers.environ._should_purge = True # base profile obj = self.helpers.context obj._properties = () obj.manage_addProperty('lines1', ('Foo', 'Gee'), 'lines') obj.manage_addProperty('lines2', ('Foo', 'Gee'), 'lines') obj.manage_addProperty('lines3', ('Foo', 'Gee'), 'lines') self.helpers._initProperties(node) self.assertEquals(obj.lines1, ('Foo', 'Bar')) self.assertEquals(obj.lines2, ('Foo', 'Bar')) self.assertEquals(obj.lines3, ('Gee', 'Foo', 'Bar')) def test__initProperties_nopurge_extension(self): node = parseString(_NOPURGE_IMPORT).documentElement self.helpers.environ._should_purge = False # extension profile obj = self.helpers.context obj._properties = () obj.manage_addProperty('lines1', ('Foo', 'Gee'), 'lines') obj.manage_addProperty('lines2', ('Foo', 'Gee'), 'lines') obj.manage_addProperty('lines3', ('Foo', 'Gee'), 'lines') self.helpers._initProperties(node) self.assertEquals(obj.lines1, ('Foo', 'Bar')) self.assertEquals(obj.lines2, ('Foo', 'Bar')) self.assertEquals(obj.lines3, ('Gee', 'Foo', 'Bar')) class PrettyDocumentTests(unittest.TestCase): def test_attr_quoting(self): original = 'baz  &"\'' expected = ('\n' '\n') doc = PrettyDocument() node = doc.createElement('doc') node.setAttribute('foo', original) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), expected) # Reparse e = parseString(expected).documentElement self.assertEqual(e.getAttribute('foo'), original) def test_text_quoting(self): original = 'goo  &"\'' expected = ('\n' 'goo &nbsp;<hmm>&"\'\n') doc = PrettyDocument() node = doc.createElement('doc') child = doc.createTextNode(original) node.appendChild(child) doc.appendChild(node) self.assertEqual(doc.toprettyxml(' '), expected) # Reparse e = parseString(expected).documentElement self.assertEqual(e.childNodes[0].nodeValue, original) def test_suite(): # reimport to make sure tests are run from Products from Products.GenericSetup.tests.test_utils import UtilsTests return unittest.TestSuite(( unittest.makeSuite(UtilsTests), unittest.makeSuite(PropertyManagerHelpersTests), unittest.makeSuite(PrettyDocumentTests), )) if __name__ == '__main__': unittest.main(defaultTest='test_suite')