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 ... ...