##############################################################################
#
# Copyright (c) 2005 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.
#
##############################################################################
"""CMFFormController setup handler unit tests.
"""
import unittest
from Products.GenericSetup.tests.common import BaseRegistryTests
from Products.GenericSetup.tests.common import DummyExportContext
from Products.GenericSetup.tests.common import DummyImportContext
from Products.CMFFormController.FormAction import FormAction
from Products.CMFFormController.FormValidator import FormValidator
class _CMFFormControllerSetup(BaseRegistryTests):
V_OBJECT_ID = 'v_object_id'
V_CONTEXT_TYPE = 'v_context_type'
V_BUTTON = 'v_button'
V_VALIDATORS = ['validator1', 'validator2']
A_OBJECT_ID = 'a_object_id'
A_STATUS = 'a_status'
A_CONTEXT_TYPE = 'a_context_type'
A_BUTTON = 'a_button'
A_ACTION_TYPE = 'redirect_to'
A_ACTION_ARG = 'string:action_arg'
_EMPTY_EXPORT = """\
"""
_WITH_INFO_EXPORT = """\
""" % (A_OBJECT_ID,
A_STATUS,
A_CONTEXT_TYPE,
A_BUTTON,
A_ACTION_TYPE,
A_ACTION_ARG,
V_OBJECT_ID,
V_CONTEXT_TYPE,
V_BUTTON,
','.join(V_VALIDATORS),
)
_WITH_PARTIAL_INFO_EXPORT = """\
""" % (A_OBJECT_ID,
A_STATUS,
A_ACTION_TYPE,
A_ACTION_ARG,
V_OBJECT_ID,
','.join(V_VALIDATORS),
)
def _initSite(self, with_info=False):
from OFS.Folder import Folder
from Products.CMFFormController.FormController import FormController
self.root.site = Folder(id='site')
site = self.root.site
mgr = FormController()
site._setObject( mgr.getId(), mgr )
if with_info:
fc = getattr(site, mgr.getId())
fc.actions.set(FormAction(self.A_OBJECT_ID, self.A_STATUS, self.A_CONTEXT_TYPE, self.A_BUTTON, self.A_ACTION_TYPE, self.A_ACTION_ARG))
fc.validators.set(FormValidator(self.V_OBJECT_ID, self.V_CONTEXT_TYPE, self.V_BUTTON, ','.join(self.V_VALIDATORS)))
return site
class CMFFormControllerExportConfiguratorTests(_CMFFormControllerSetup):
def _getTargetClass(self):
from Products.CMFFormController.exportimport \
import CMFFormControllerExportConfigurator
return CMFFormControllerExportConfigurator
def test_generateXML_empty(self):
site = self._initSite(with_info=False)
configurator = self._makeOne(site).__of__(site)
self._compareDOM(configurator.generateXML(), self._EMPTY_EXPORT)
def test_generateXML_with_info(self):
site = self._initSite(with_info=True)
configurator = self._makeOne(site).__of__(site)
self._compareDOM(configurator.generateXML(), self._WITH_INFO_EXPORT)
class CMFFormControllerImportConfiguratorTests(_CMFFormControllerSetup):
def _getTargetClass(self):
from Products.CMFFormController.exportimport \
import CMFFormControllerImportConfigurator
return CMFFormControllerImportConfigurator
def test_parseXML_empty(self):
site = self._initSite(with_info=False)
configurator = self._makeOne(site)
fc_info = configurator.parseXML(self._EMPTY_EXPORT)
self.assertEqual(len(fc_info['actions']), 0)
self.assertEqual(len(fc_info['validators']), 0)
def test_parseXML_with_info(self):
site = self._initSite(with_info=False)
configurator = self._makeOne(site)
fc_info = configurator.parseXML(self._WITH_INFO_EXPORT)
self.assertEqual(len(fc_info['actions']), 1)
self.assertEqual(len(fc_info['validators']), 1)
info = fc_info['actions'][0]
self.assertEqual(info['object_id'], self.A_OBJECT_ID)
self.assertEqual(info['status'], self.A_STATUS)
self.assertEqual(info['context_type'], self.A_CONTEXT_TYPE)
self.assertEqual(info['button'], self.A_BUTTON)
self.assertEqual(info['action_type'], self.A_ACTION_TYPE)
self.assertEqual(info['action_arg'], self.A_ACTION_ARG)
info = fc_info['validators'][0]
self.assertEqual(info['object_id'], self.V_OBJECT_ID)
self.assertEqual(info['context_type'], self.V_CONTEXT_TYPE)
self.assertEqual(info['button'], self.V_BUTTON)
self.assertEqual(info['validators'], ','.join(self.V_VALIDATORS))
class Test_exportCMFFormController(_CMFFormControllerSetup):
def test_empty(self):
from Products.CMFFormController.exportimport \
import exportCMFFormController
site = self._initSite(with_info=False)
context = DummyExportContext(site)
exportCMFFormController(context)
self.assertEqual(len(context._wrote), 1)
filename, text, content_type = context._wrote[0]
self.assertEqual(filename, 'cmfformcontroller.xml')
self._compareDOM(text, self._EMPTY_EXPORT)
self.assertEqual(content_type, 'text/xml')
def test_with_info(self):
from Products.CMFFormController.exportimport \
import exportCMFFormController
site = self._initSite(with_info=True)
context = DummyExportContext(site)
exportCMFFormController(context)
self.assertEqual(len(context._wrote), 1)
filename, text, content_type = context._wrote[0]
self.assertEqual(filename, 'cmfformcontroller.xml')
self._compareDOM(text, self._WITH_INFO_EXPORT)
self.assertEqual(content_type, 'text/xml')
class Test_importCMFFormController(_CMFFormControllerSetup):
def test_normal(self):
from Products.CMFFormController.exportimport \
import importCMFFormController
site = self._initSite(with_info=False)
fc = site.portal_form_controller
self.assertEqual(len(fc.listFormValidators()), 0)
self.assertEqual(len(fc.listFormActions()), 0)
context = DummyImportContext(site)
context._files['cmfformcontroller.xml'] = self._WITH_INFO_EXPORT
importCMFFormController(context)
self.assertEqual(len(fc.listFormActions()), 1)
self.assertEqual(len(fc.listFormValidators()), 1)
action = fc.listFormActions()[0]
self.assertEqual(action.getObjectId(), self.A_OBJECT_ID)
self.assertEqual(action.getStatus(), self.A_STATUS)
self.assertEqual(action.getContextType(), self.A_CONTEXT_TYPE)
self.assertEqual(action.getButton(), self.A_BUTTON)
self.assertEqual(action.getActionType(), self.A_ACTION_TYPE)
self.assertEqual(action.getActionArg(), self.A_ACTION_ARG)
validator = fc.listFormValidators()[0]
self.assertEqual(validator.getObjectId(), self.V_OBJECT_ID)
self.assertEqual(validator.getContextType(), self.V_CONTEXT_TYPE)
self.assertEqual(validator.getButton(), self.V_BUTTON)
self.assertEqual(validator.getValidators(), self.V_VALIDATORS)
def test_partial(self):
from Products.CMFFormController.exportimport \
import importCMFFormController
site = self._initSite(with_info=False)
fc = site.portal_form_controller
self.assertEqual(len(fc.listFormValidators()), 0)
self.assertEqual(len(fc.listFormActions()), 0)
context = DummyImportContext(site)
context._files['cmfformcontroller.xml'] = self._WITH_PARTIAL_INFO_EXPORT
importCMFFormController(context)
self.assertEqual(len(fc.listFormActions()), 1)
self.assertEqual(len(fc.listFormValidators()), 1)
action = fc.listFormActions()[0]
self.assertEqual(action.getObjectId(), self.A_OBJECT_ID)
self.assertEqual(action.getStatus(), self.A_STATUS)
self.assertEqual(action.getContextType(), None)
self.assertEqual(action.getButton(), None)
self.assertEqual(action.getActionType(), self.A_ACTION_TYPE)
self.assertEqual(action.getActionArg(), self.A_ACTION_ARG)
validator = fc.listFormValidators()[0]
self.assertEqual(validator.getObjectId(), self.V_OBJECT_ID)
self.assertEqual(validator.getContextType(), None)
self.assertEqual(validator.getButton(), None)
self.assertEqual(validator.getValidators(), self.V_VALIDATORS)
def test_action_not_unicode(self):
# The action arg cannot be unicode for unrestrictedTraverse
# calls to work properly
from Products.CMFFormController.exportimport \
import importCMFFormController
site = self._initSite(with_info=False)
fc = site.portal_form_controller
context = DummyImportContext(site)
context._files['cmfformcontroller.xml'] = self._WITH_INFO_EXPORT
importCMFFormController(context)
action = fc.listFormActions()[0]
self.failUnless(isinstance(action.getActionArg(), str))
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(CMFFormControllerExportConfiguratorTests),
unittest.makeSuite(CMFFormControllerImportConfiguratorTests),
unittest.makeSuite(Test_exportCMFFormController),
unittest.makeSuite(Test_importCMFFormController),
))
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')