Beispiel #1
0
class TestProxyField(ERP5TypeTestCase):
    def getTitle(self):
        return "Proxy Field"

    def afterSetUp(self):
        self.container = Folder('container').__of__(self.portal)
        self.container._setObject(
            'Base_viewProxyFieldLibrary',
            ERP5Form('Base_viewProxyFieldLibrary', 'Proxys'))
        self.container._setObject('Base_view', ERP5Form('Base_view', 'View'))
        from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable
        _setUpDefaultTraversable()

    def addField(self, form, id, title, field_type):
        form.manage_addField(id, title, field_type)
        field = getattr(form, id)
        field._p_oid = makeDummyOid()
        return field

    def test_get_template_field(self):
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        proxy_field = self.addField(self.container.Base_view, 'my_title',
                                    'Not Title', 'ProxyField')
        self.assertEqual(None, proxy_field.getTemplateField())
        self.assertEqual(None, proxy_field.get_value('enable'))
        self.assertEqual(None, proxy_field.get_value('default'))

        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        self.assertEqual(original_field, proxy_field.getTemplateField())

    def test_simple_surcharge(self):
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        self.assertEqual('Title', original_field.get_value('title'))

        proxy_field = self.addField(self.container.Base_view, 'my_title',
                                    'Not Title', 'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        self.assert_(proxy_field.is_delegated('title'))
        self.assertEqual('Title', proxy_field.get_value('title'))

    def test_simple_not_surcharge(self):
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        self.assertEqual('Title', original_field.get_value('title'))

        proxy_field = self.addField(self.container.Base_view, 'my_title',
                                    'Proxy Title', 'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        # XXX no API for this ?
        proxy_field._surcharged_edit(dict(title='Proxy Title'), ['title'])

        self.assertFalse(proxy_field.is_delegated('title'))
        self.assertEqual('Proxy Title', proxy_field.get_value('title'))

    def test_get_value_default(self):
        # If the proxy field is named 'my_id', it will get 'id'
        # property on the context, regardless of the id of the proxified field
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        proxy_field = self.addField(self.container.Base_view, 'my_id', 'ID',
                                    'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        self.assertEqual('container', self.container.getId())
        self.assertEqual('container', proxy_field.get_value('default'))

    def test_field_tales_context(self):
        # in the TALES context, "field" will be the proxyfield, not the original
        # field.
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        original_field.manage_tales_xmlrpc(dict(title='field/getId'))
        self.assertEqual('my_title', original_field.get_value('title'))

        proxy_field = self.addField(self.container.Base_view, 'my_reference',
                                    'Not Title', 'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        # 'my_reference' is the ID of the proxy field
        self.assertEqual('my_reference', proxy_field.get_value('title'))

    def test_form_tales_context(self):
        # in the TALES context, "form" will be the form containing the proxyfield,
        # not the original form (ie. the field library).
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        original_field.manage_tales_xmlrpc(dict(title='form/getId'))
        self.assertEqual('Base_viewProxyFieldLibrary',
                         original_field.get_value('title'))

        proxy_field = self.addField(self.container.Base_view, 'my_title',
                                    'Title', 'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        self.assertEqual('Base_view', proxy_field.get_value('title'))

    def test_get_value_cache_on_TALES_target(self):
        # If the proxy field defines its target using TALES, then no caching should
        # happen.
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title',
            'StringField')
        other_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                    'my_other_field', 'Other', 'StringField')
        proxy_field = self.addField(self.container.Base_view, 'my_id', 'ID',
                                    'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(form_id='Base_viewProxyFieldLibrary'))
        proxy_field.manage_tales_xmlrpc(dict(field_id='request/field_id'))

        self.container.REQUEST.set('field_id', 'my_title')
        self.assertEqual(original_field, proxy_field.getTemplateField())
        self.assertEqual('Title', proxy_field.get_value('title'))

        self.container.REQUEST.set('field_id', 'my_other_field')
        self.assertEqual(other_field, proxy_field.getTemplateField())
        self.assertEqual('Other', proxy_field.get_value('title'))

    def test_proxy_to_date_time_field(self):
        # date time fields are specific, because they use a 'sub_form', we must
        # make sure this works as expected
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_date', 'Date',
            'DateTimeField')
        original_field.manage_edit_xmlrpc(dict(required=0))
        proxy_field = self.addField(self.container.Base_view, 'my_date',
                                    'Date', 'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_date',
            ))
        self.assertTrue(hasattr(proxy_field, '_get_sub_form'))
        self.assertEqual(proxy_field._get_sub_form().render(),
                         original_field._get_sub_form().render())

        # we can render
        proxy_field.render()
        # and validate
        self.container.Base_view.validate_all_to_request(self.portal.REQUEST)

        # change style in the original field
        original_field.manage_edit_xmlrpc(dict(input_style='number'))
        self.assertTrue('type="number"' in original_field.render())
        self.assertTrue('type="number"' in proxy_field.render())

        # override style in the proxy field
        original_field.manage_edit_xmlrpc(dict(input_style='text'))
        proxy_field._surcharged_edit({'input_style': 'number'},
                                     ['input_style'])
        self.assertTrue('type="text"' in original_field.render())
        self.assertTrue('type="number"' in proxy_field.render())

        # unproxify the proxy field
        self.container.Base_view.unProxifyField({'my_date': 'on'})
        unproxified_field = self.container.Base_view.my_date
        self.assertTrue('type="number"' in unproxified_field.render())

    def test_manage_edit_surcharged_xmlrpc(self):
        # manage_edit_surcharged_xmlrpc is a method to edit proxyfields
        # programmatically
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_string', 'String',
            'StringField')
        proxy_field = self.addField(self.container.Base_view, 'my_String', '',
                                    'ProxyField')
        proxy_field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_date',
            ))

        proxy_field.manage_edit_surcharged_xmlrpc(dict(title='Title'))
        self.assertFalse(proxy_field.is_delegated('title'))
        self.assertEqual('Title', proxy_field.get_value('title'))

        # beware that all values that are not passed in the mapping will be
        # delegated again, regardless of the old state.
        proxy_field.manage_edit_surcharged_xmlrpc({})
        self.assertTrue(proxy_field.is_delegated('title'))

    def test_same_field_id_in_proxy_field_and_template_field(self):
        """
    Test a case that if proxy field id is same as template field id.
    """
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_string', 'String',
            'StringField')
        # Use different id to the template field.
        proxy_field2 = self.addField(self.container.Base_view,
                                     'my_another_string', '', 'ProxyField')
        # Use same id to the template field.
        proxy_field1 = self.addField(self.container.Base_view, 'my_string', '',
                                     'ProxyField')
        proxy_field2.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_string',
            ))
        proxy_field1.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_string',
            ))

        def make_dummy_getter(value):
            def method():
                return value

            return method

        self.container.getAnotherString = make_dummy_getter('WAAA')
        self.container.getString = make_dummy_getter('123')

        # First, call field which the id is different to the template field's.
        self.assertEqual('WAAA', proxy_field2.get_value('default'))

        # Next, call field which the id is same to the template field's.
        self.assertEqual('123', proxy_field1.get_value('default'))

    def test_dicts_cleared_on_edit(self):
        """
    Test that values and tales dicts are cleared when property is switched to
    not surcharged.
    """
        # create a field
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'OrigTitle',
            'StringField')
        field = self.addField(self.container.Base_view, 'my_dict_test', '',
                              'ProxyField')
        field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))

        def surcharge_edit():
            #surcharge from edit
            field._surcharged_edit(dict(title='TestTitle'), ['title'])
            self.assertTrue('title' in field.delegated_list)
            self.assertEqual(field.values['title'], 'TestTitle')
            self.assertTrue('title' not in field.tales)

        def delegate_edit():
            # delegate the field from edit view
            field._surcharged_edit(dict(title='TestTitle'), [])
            self.assertTrue('title' not in field.delegated_list)
            self.assertTrue('title' not in field.values)
            self.assertTrue('title' not in field.tales)

        def surcharge_tales():
            #surcharge from tales
            field._surcharged_tales(dict(title='string:TestTitle'), ['title'])
            self.assertTrue('title' in field.delegated_list)
            self.assertTrue(field.values['title'], 'OrigTitle')
            self.assertEqual(field.tales['title'], 'string:TestTitle')

        def delegate_tales():
            # delegate the field from tales view
            field._surcharged_tales(dict(title='string:TestTitle'), [])
            self.assertTrue('title' not in field.delegated_list)
            self.assertTrue('title' not in field.values)
            self.assertTrue('title' not in field.tales)

        surcharge_edit()
        delegate_edit()
        surcharge_edit()
        delegate_tales()
        surcharge_tales()
        delegate_edit()
        surcharge_tales()
        delegate_tales()

    def test_proxify_error_message(self):
        """
    Test that error messages can be delegated and surcharged.
    """
        # create a field
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, 'my_title', 'OrigTitle',
            'StringField')
        field = self.addField(self.container.Base_view, 'my_dict_test', '',
                              'ProxyField')
        field.manage_edit_xmlrpc(
            dict(
                form_id='Base_viewProxyFieldLibrary',
                field_id='my_title',
            ))
        self.assertEqual(original_field.get_error_names(),
                         field.get_error_names())
        test_error = 'too_long'  # arbitrary chosen among StringField error names
        test_message = 'Some Unprobable Error'
        test_message2 = 'Some Even More Unprobable Error'
        original_field.message_values[test_error] = test_message
        field.message_values[test_error] = test_message2
        # delegated (by default)
        self.assertEqual(original_field.get_error_message(test_error),
                         test_message)
        self.assertTrue(field.is_message_delegated(test_error))
        self.assertEqual(field.get_error_message(test_error), test_message)
        # surcharged
        field.delegated_message_list = [test_error]
        self.assertEqual(original_field.get_error_message(test_error),
                         test_message)
        self.assertFalse(field.is_message_delegated(test_error))
        self.assertEqual(field.get_error_message(test_error), test_message2)
Beispiel #2
0
class TestProxyField(ERP5TypeTestCase):
    def getTitle(self):
        return "Proxy Field"

    def afterSetUp(self):
        self.container = Folder("container").__of__(self.portal)
        self.container._setObject("Base_viewProxyFieldLibrary", ERP5Form("Base_viewProxyFieldLibrary", "Proxys"))
        self.container._setObject("Base_view", ERP5Form("Base_view", "View"))
        from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable

        _setUpDefaultTraversable()

    def addField(self, form, id, title, field_type):
        form.manage_addField(id, title, field_type)
        field = getattr(form, id)
        field._p_oid = makeDummyOid()
        return field

    def test_get_template_field(self):
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        proxy_field = self.addField(self.container.Base_view, "my_title", "Not Title", "ProxyField")
        self.assertEqual(None, proxy_field.getTemplateField())
        self.assertEqual(None, proxy_field.get_value("enable"))
        self.assertEqual(None, proxy_field.get_value("default"))

        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        self.assertEqual(original_field, proxy_field.getTemplateField())

    def test_simple_surcharge(self):
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        self.assertEqual("Title", original_field.get_value("title"))

        proxy_field = self.addField(self.container.Base_view, "my_title", "Not Title", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        self.assert_(proxy_field.is_delegated("title"))
        self.assertEqual("Title", proxy_field.get_value("title"))

    def test_simple_not_surcharge(self):
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        self.assertEqual("Title", original_field.get_value("title"))

        proxy_field = self.addField(self.container.Base_view, "my_title", "Proxy Title", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        # XXX no API for this ?
        proxy_field._surcharged_edit(dict(title="Proxy Title"), ["title"])

        self.assertFalse(proxy_field.is_delegated("title"))
        self.assertEqual("Proxy Title", proxy_field.get_value("title"))

    def test_get_value_default(self):
        # If the proxy field is named 'my_id', it will get 'id'
        # property on the context, regardless of the id of the proxified field
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        proxy_field = self.addField(self.container.Base_view, "my_id", "ID", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        self.assertEqual("container", self.container.getId())
        self.assertEqual("container", proxy_field.get_value("default"))

    def test_field_tales_context(self):
        # in the TALES context, "field" will be the proxyfield, not the original
        # field.
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        original_field.manage_tales_xmlrpc(dict(title="field/getId"))
        self.assertEqual("my_title", original_field.get_value("title"))

        proxy_field = self.addField(self.container.Base_view, "my_reference", "Not Title", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        # 'my_reference' is the ID of the proxy field
        self.assertEqual("my_reference", proxy_field.get_value("title"))

    def test_form_tales_context(self):
        # in the TALES context, "form" will be the form containing the proxyfield,
        # not the original form (ie. the field library).
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        original_field.manage_tales_xmlrpc(dict(title="form/getId"))
        self.assertEqual("Base_viewProxyFieldLibrary", original_field.get_value("title"))

        proxy_field = self.addField(self.container.Base_view, "my_title", "Title", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        self.assertEqual("Base_view", proxy_field.get_value("title"))

    def test_get_value_cache_on_TALES_target(self):
        # If the proxy field defines its target using TALES, then no caching should
        # happen.
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField")
        other_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_other_field", "Other", "StringField")
        proxy_field = self.addField(self.container.Base_view, "my_id", "ID", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary"))
        proxy_field.manage_tales_xmlrpc(dict(field_id="request/field_id"))

        self.container.REQUEST.set("field_id", "my_title")
        self.assertEqual(original_field, proxy_field.getTemplateField())
        self.assertEqual("Title", proxy_field.get_value("title"))

        self.container.REQUEST.set("field_id", "my_other_field")
        self.assertEqual(other_field, proxy_field.getTemplateField())
        self.assertEqual("Other", proxy_field.get_value("title"))

    def test_proxy_to_date_time_field(self):
        # date time fields are specific, because they use a 'sub_form', we must
        # make sure this works as expected
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_date", "Date", "DateTimeField")
        original_field.manage_edit_xmlrpc(dict(required=0))
        proxy_field = self.addField(self.container.Base_view, "my_date", "Date", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_date"))
        self.assertTrue(hasattr(proxy_field, "sub_form"))
        self.assertTrue(aq_base(proxy_field.sub_form) is aq_base(original_field.sub_form))
        # we can render
        proxy_field.render()
        # and validate
        self.container.Base_view.validate_all_to_request(self.portal.REQUEST)

    def test_manage_edit_surcharged_xmlrpc(self):
        # manage_edit_surcharged_xmlrpc is a method to edit proxyfields
        # programmatically
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_string", "String", "StringField")
        proxy_field = self.addField(self.container.Base_view, "my_String", "", "ProxyField")
        proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_date"))

        proxy_field.manage_edit_surcharged_xmlrpc(dict(title="Title"))
        self.assertFalse(proxy_field.is_delegated("title"))
        self.assertEqual("Title", proxy_field.get_value("title"))

        # beware that all values that are not passed in the mapping will be
        # delegated again, regardless of the old state.
        proxy_field.manage_edit_surcharged_xmlrpc({})
        self.assertTrue(proxy_field.is_delegated("title"))

    def test_same_field_id_in_proxy_field_and_template_field(self):
        """
    Test a case that if proxy field id is same as template field id.
    """
        original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_string", "String", "StringField")
        # Use different id to the template field.
        proxy_field2 = self.addField(self.container.Base_view, "my_another_string", "", "ProxyField")
        # Use same id to the template field.
        proxy_field1 = self.addField(self.container.Base_view, "my_string", "", "ProxyField")
        proxy_field2.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_string"))
        proxy_field1.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_string"))

        def make_dummy_getter(value):
            def method():
                return value

            return method

        self.container.getAnotherString = make_dummy_getter("WAAA")
        self.container.getString = make_dummy_getter("123")

        # First, call field which the id is different to the template field's.
        self.assertEqual("WAAA", proxy_field2.get_value("default"))

        # Next, call field which the id is same to the template field's.
        self.assertEqual("123", proxy_field1.get_value("default"))

    def test_dicts_cleared_on_edit(self):
        """
    Test that values and tales dicts are cleared when property is switched to
    not surcharged.
    """
        # create a field
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, "my_title", "OrigTitle", "StringField"
        )
        field = self.addField(self.container.Base_view, "my_dict_test", "", "ProxyField")
        field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))

        def surcharge_edit():
            # surcharge from edit
            field._surcharged_edit(dict(title="TestTitle"), ["title"])
            self.assertTrue("title" in field.delegated_list)
            self.assertEqual(field.values["title"], "TestTitle")
            self.assertTrue("title" not in field.tales)

        def delegate_edit():
            # delegate the field from edit view
            field._surcharged_edit(dict(title="TestTitle"), [])
            self.assertTrue("title" not in field.delegated_list)
            self.assertTrue("title" not in field.values)
            self.assertTrue("title" not in field.tales)

        def surcharge_tales():
            # surcharge from tales
            field._surcharged_tales(dict(title="string:TestTitle"), ["title"])
            self.assertTrue("title" in field.delegated_list)
            self.assertTrue(field.values["title"], "OrigTitle")
            self.assertEqual(field.tales["title"], "string:TestTitle")

        def delegate_tales():
            # delegate the field from tales view
            field._surcharged_tales(dict(title="string:TestTitle"), [])
            self.assertTrue("title" not in field.delegated_list)
            self.assertTrue("title" not in field.values)
            self.assertTrue("title" not in field.tales)

        surcharge_edit()
        delegate_edit()
        surcharge_edit()
        delegate_tales()
        surcharge_tales()
        delegate_edit()
        surcharge_tales()
        delegate_tales()

    def test_proxify_error_message(self):
        """
    Test that error messages can be delegated and surcharged.
    """
        # create a field
        original_field = self.addField(
            self.container.Base_viewProxyFieldLibrary, "my_title", "OrigTitle", "StringField"
        )
        field = self.addField(self.container.Base_view, "my_dict_test", "", "ProxyField")
        field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title"))
        self.assertEqual(original_field.get_error_names(), field.get_error_names())
        test_error = "too_long"  # arbitrary chosen among StringField error names
        test_message = "Some Unprobable Error"
        test_message2 = "Some Even More Unprobable Error"
        original_field.message_values[test_error] = test_message
        field.message_values[test_error] = test_message2
        # delegated (by default)
        self.assertEqual(original_field.get_error_message(test_error), test_message)
        self.assertTrue(field.is_message_delegated(test_error))
        self.assertEqual(field.get_error_message(test_error), test_message)
        # surcharged
        field.delegated_message_list = [test_error]
        self.assertEqual(original_field.get_error_message(test_error), test_message)
        self.assertFalse(field.is_message_delegated(test_error))
        self.assertEqual(field.get_error_message(test_error), test_message2)
Beispiel #3
0
class TestProxyField(ERP5TypeTestCase):

  def getTitle(self):
    return "Proxy Field"

  def afterSetUp(self):
    self.container = Folder('container').__of__(self.portal)
    self.container._setObject('Base_viewProxyFieldLibrary',
                               ERP5Form('Base_viewProxyFieldLibrary', 'Proxys'))
    self.container._setObject('Base_view',
                               ERP5Form('Base_view', 'View'))
    try:
        from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable
        _setUpDefaultTraversable()
    except ImportError:
        pass # On Zope 2.8, remove when we no longer support it


  def addField(self, form, id, title, field_type):
    form.manage_addField(id, title, field_type)
    field = getattr(form, id)
    field._p_oid = makeDummyOid()
    return field

  def test_get_template_field(self):
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    proxy_field = self.addField(self.container.Base_view,
                                'my_title', 'Not Title', 'ProxyField')
    self.assertEquals(None, proxy_field.getTemplateField())
    self.assertEquals(None, proxy_field.get_value('enable'))
    self.assertEquals(None, proxy_field.get_value('default'))

    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_title',))
    self.assertEquals(original_field, proxy_field.getTemplateField())

  def test_simple_surcharge(self):
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    self.assertEquals('Title', original_field.get_value('title'))

    proxy_field = self.addField(self.container.Base_view,
                                'my_title', 'Not Title', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_title',))
    self.assert_(proxy_field.is_delegated('title'))
    self.assertEquals('Title', proxy_field.get_value('title'))

  def test_simple_not_surcharge(self):
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    self.assertEquals('Title', original_field.get_value('title'))

    proxy_field = self.addField(self.container.Base_view,
                                'my_title', 'Proxy Title', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_title',))
    # XXX no API for this ?
    proxy_field._surcharged_edit(dict(title='Proxy Title'), ['title'])

    self.failIf(proxy_field.is_delegated('title'))
    self.assertEquals('Proxy Title', proxy_field.get_value('title'))

  def test_get_value_default(self):
    # If the proxy field is named 'my_id', it will get 'id'
    # property on the context, regardless of the id of the proxified field
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    proxy_field = self.addField(self.container.Base_view,
                                'my_id', 'ID', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_title',))
    self.assertEquals('container', self.container.getId())
    self.assertEquals('container', proxy_field.get_value('default'))

  def test_field_tales_context(self):
    # in the TALES context, "field" will be the proxyfield, not the original
    # field.
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    original_field.manage_tales_xmlrpc(dict(title='field/getId'))
    self.assertEquals('my_title', original_field.get_value('title'))

    proxy_field = self.addField(self.container.Base_view,
                                'my_reference', 'Not Title', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_title',))
    # 'my_reference' is the ID of the proxy field
    self.assertEquals('my_reference', proxy_field.get_value('title'))

  def test_form_tales_context(self):
    # in the TALES context, "form" will be the form containing the proxyfield,
    # not the original form (ie. the field library).
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    original_field.manage_tales_xmlrpc(dict(title='form/getId'))
    self.assertEquals('Base_viewProxyFieldLibrary',
                       original_field.get_value('title'))

    proxy_field = self.addField(self.container.Base_view,
                                'my_title', 'Title', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_title',))
    self.assertEquals('Base_view', proxy_field.get_value('title'))

  def test_get_value_cache_on_TALES_target(self):
    # If the proxy field defines its target using TALES, then no caching should
    # happen.
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'Title', 'StringField')
    other_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_other_field', 'Other', 'StringField')
    proxy_field = self.addField(self.container.Base_view,
                                'my_id', 'ID', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary'))
    proxy_field.manage_tales_xmlrpc(dict(field_id='request/field_id'))

    self.container.REQUEST.set('field_id', 'my_title')
    self.assertEquals(original_field, proxy_field.getTemplateField())
    self.assertEquals('Title', proxy_field.get_value('title'))

    self.container.REQUEST.set('field_id', 'my_other_field')
    self.assertEquals(other_field, proxy_field.getTemplateField())
    self.assertEquals('Other', proxy_field.get_value('title'))

  def test_proxy_to_date_time_field(self):
    # date time fields are specific, because they use a 'sub_form', we must
    # make sure this works as expected
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_date', 'Date', 'DateTimeField')
    original_field.manage_edit_xmlrpc(dict(required=0))
    proxy_field = self.addField(self.container.Base_view,
                                'my_date', 'Date', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_date',))
    self.assertTrue(hasattr(proxy_field, 'sub_form'))
    self.assertTrue(aq_base(proxy_field.sub_form) is
                      aq_base(original_field.sub_form))
    # we can render
    proxy_field.render()
    # and validate
    self.container.Base_view.validate_all_to_request(dict())
    
  def test_manage_edit_surcharged_xmlrpc(self):
    # manage_edit_surcharged_xmlrpc is a method to edit proxyfields
    # programmatically
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_string', 'String', 'StringField')
    proxy_field = self.addField(self.container.Base_view,
                                'my_String', '', 'ProxyField')
    proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                        field_id='my_date',))

    proxy_field.manage_edit_surcharged_xmlrpc(dict(title='Title'))
    self.assertFalse(proxy_field.is_delegated('title'))
    self.assertEquals('Title', proxy_field.get_value('title'))

    # beware that all values that are not passed in the mapping will be
    # delegated again, regardless of the old state.
    proxy_field.manage_edit_surcharged_xmlrpc(dict())
    self.assertTrue(proxy_field.is_delegated('title'))

  def test_same_field_id_in_proxy_field_and_template_field(self):
    """
    Test a case that if proxy field id is same as template field id.
    """
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_string', 'String', 'StringField')
    # Use different id to the template field.
    proxy_field2 = self.addField(self.container.Base_view,
                                 'my_another_string', '', 'ProxyField')
    # Use same id to the template field.
    proxy_field1 = self.addField(self.container.Base_view,
                                 'my_string', '', 'ProxyField')
    proxy_field2.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                         field_id='my_string',))
    proxy_field1.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                         field_id='my_string',))

    def make_dummy_getter(value):
      def method():
        return value
      return method

    self.container.getAnotherString = make_dummy_getter('WAAA')
    self.container.getString = make_dummy_getter('123')

    # First, call field which the id is different to the template field's.
    self.assertEqual('WAAA', proxy_field2.get_value('default'))

    # Next, call field which the id is same to the template field's.
    self.assertEqual('123', proxy_field1.get_value('default'))

  def test_dicts_cleared_on_edit(self):
    """
    Test that values and tales dicts are cleared when property is switched to
    not surcharged.
    """
    # create a field
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'OrigTitle', 'StringField')
    field = self.addField(self.container.Base_view,
                                   'my_dict_test', '', 'ProxyField')
    field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                         field_id='my_title',))
    def surcharge_edit():
      #surcharge from edit
      field._surcharged_edit(dict(title='TestTitle'), ['title'])
      self.assertTrue('title' in field.delegated_list)
      self.assertEquals(field.values['title'], 'TestTitle')
      self.assertTrue('title' not in field.tales)

    def delegate_edit():
      # delegate the field from edit view
      field._surcharged_edit(dict(title='TestTitle'), [])
      self.assertTrue('title' not in field.delegated_list)
      self.assertTrue('title' not in field.values)
      self.assertTrue('title' not in field.tales)

    def surcharge_tales():
      #surcharge from tales
      field._surcharged_tales(dict(title='string:TestTitle'), ['title'])
      self.assertTrue('title' in field.delegated_list)
      self.assertTrue(field.values['title'], 'OrigTitle')
      self.assertEquals(field.tales['title'], 'string:TestTitle')

    def delegate_tales():
      # delegate the field from tales view
      field._surcharged_tales(dict(title='string:TestTitle'), [])
      self.assertTrue('title' not in field.delegated_list)
      self.assertTrue('title' not in field.values)
      self.assertTrue('title' not in field.tales)
    
    surcharge_edit()
    delegate_edit()
    surcharge_edit()
    delegate_tales()
    surcharge_tales()
    delegate_edit()
    surcharge_tales()
    delegate_tales()

  def test_proxify_error_message(self):
    """
    Test that error messages can be delegated and surcharged.
    """
    # create a field
    original_field = self.addField(self.container.Base_viewProxyFieldLibrary,
                                   'my_title', 'OrigTitle', 'StringField')
    field = self.addField(self.container.Base_view,
                                   'my_dict_test', '', 'ProxyField')
    field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary',
                                         field_id='my_title',))
    self.assertEquals(original_field.get_error_names(),
        field.get_error_names())
    test_error = 'too_long' # arbitrary chosen among StringField error names
    test_message = 'Some Unprobable Error'
    test_message2 = 'Some Even More Unprobable Error'
    original_field.message_values[test_error] = test_message
    field.message_values[test_error] = test_message2
    # delegated (by default)
    self.assertEquals(original_field.get_error_message(test_error),
      test_message)
    self.assertTrue(field.is_message_delegated(test_error))
    self.assertEquals(field.get_error_message(test_error), test_message)
    # surcharged
    field.delegated_message_list = [test_error]
    self.assertEquals(original_field.get_error_message(test_error),
      test_message)
    self.assertFalse(field.is_message_delegated(test_error))
    self.assertEquals(field.get_error_message(test_error), test_message2)