Testing forms
=============
Before we can begin, we need to set up a few things. We need a
manager account:
>>> uf = self.folder.acl_users
>>> _ignored = uf._doAddUser('manager', 'r00t', ['Manager'], [])
We need to configure all of Five for the functional test:
# BBB for Zope 2.12
>>> try:
... from Zope2.App import zcml
... except ImportError:
... from Products.Five import zcml
>>> import Products.Five
>>> zcml.load_config('meta.zcml', Products.Five)
>>> import five.formlib
>>> import five.formlib.tests
>>> zcml.load_config('configure.zcml', package=Products.Five)
>>> zcml.load_config('configure.zcml', package=five.formlib)
>>> zcml.load_config('configure.zcml', package=five.formlib.tests)
Finally, we need to setup a traversable folder. Otherwise, Five won't
get to to do its view lookup:
>>> from Products.Five.tests.testing import manage_addFiveTraversableFolder
>>> manage_addFiveTraversableFolder(self.folder, 'ftf')
Let's set up a testbrowser:
# BBB for Zope 2.12
>>> try:
... from Testing.testbrowser import Browser
... except ImportError:
... from Products.Five.testbrowser import Browser
>>> browser = Browser()
>>> browser.addHeader('Accept-Language', 'en-US')
Add forms
---------
We can add objects to containers (object managers) through add forms.
An unprotected form can be accessed with anonymously:
>>> browser.open("http://localhost/test_folder_1_/ftf/+/addfieldcontent.html")
>>> print browser.headers
Status: 200 ...
...
We don't have access, we will not be able to get to the protected add form:
>>> browser.open("http://localhost/test_folder_1_/ftf/+/protectedaddform.html")
Traceback (most recent call last):
...
HTTPError: HTTP Error 401: Unauthorized
For a protected one we need a manager account:
>>> browser.addHeader('Authorization', 'Basic manager:r00t')
>>> browser.open("http://localhost/test_folder_1_/ftf/+/protectedaddform.html")
>>> print browser.headers
Status: 200 ...
...
Now let's add a piece of our sample content object to test more things
on it:
>>> ctl = browser.getControl(name="field.title")
>>> ctl.value = 'title'
>>> ctl = browser.getControl(name="add_input_name")
>>> ctl.value = 'edittest'
>>> browser.getControl(name="UPDATE_SUBMIT").click()
Having added this piece of content, we can access it under its URL:
>>> browser.open("http://localhost/test_folder_1_/ftf/edittest")
>>> print browser.headers
Status: 200 ...
...
We can also verify that the title was set correctly, and the not
specified attribute is the default value:
>>> edittest = self.folder.ftf.edittest
>>> edittest.title
u'title'
>>> edittest.description #XXX shouldn't we get a u'' here???
We can also verify that the IObjectCreatedEvent was fired, and the test
subscriber we registered set a flag indicating such:
>>> edittest._created_flag
True
Because the process of adding an object often sets attributes after the
object is created and added, and IObjectModified event should also have been
fired:
>>> edittest._modified_flag
True
>>> del edittest._modified_flag
Edit forms
----------
First, it's important to note that forms validate user input.
Therefore, if we specify invalid data, our object won't change:
>>> browser.open("http://localhost/test_folder_1_/ftf/edittest/@@edit.html")
>>> ctl = browser.getControl(name="field.title")
>>> ctl.value = ''
>>> ctl = browser.getControl(name="field.description")
>>> ctl.value = 'BarDescription'
>>> browser.getControl(name="UPDATE_SUBMIT").click()
>>> print browser.headers
Status: 200 ...
...
>>> print browser.contents
...
There are 1 input errors.
...
We will see that nothing has changed:
>>> edittest.title
u'title'
>>> edittest.description #XXX shouldn't we get a u'' here???
>>> getattr(edittest, '_modified_flag', False)
False
However, when we specify the correct fields:
>>> browser.open("http://localhost/test_folder_1_/ftf/edittest/@@edit.html")
>>> ctl = browser.getControl(name="field.title")
>>> ctl.value = 'FooTitle'
>>> ctl = browser.getControl(name="field.description")
>>> ctl.value = 'FooDescription'
>>> browser.getControl(name="UPDATE_SUBMIT").click()
>>> print browser.headers
Status: 200 ...
...
We will see that something has changed:
>>> edittest.title
u'FooTitle'
>>> edittest.description
u'FooDescription'
And that the event has been fired:
>>> edittest._modified_flag
True
>>> del edittest._modified_flag
Widget Overrides
----------------
We have an alternate add form for IFieldContent which uses a TextArea widget
via and override in the zcml. Let's ensure that that works:
>>> print http(r"""
... GET /test_folder_1_/ftf/+/addwidgetoverride.html HTTP/1.1
... """, handle_errors=False)
HTTP/1.1 200 OK
...
...