def test_handler_render(self): """ Show that the handlers are also added into the data field, as the Collection+JSON has this undefined, and that at the protocol level (for both ``application/x-www-form-urlencoded`` and ``multipart/form-data`` encode "buttons" like any other field anyway. We will have type to distinguish between the standard inputs and those that have attached handlers. """ f = form.ItemForm(self.item, self.request) f.update() result = core.formfields_to_collection_template(f) answer = json.loads(""" { "data": [ { "name": "form.widgets.item_id", "value": "", "prompt": "Item ID", "type": "TextLine", "required": true, "options": null, "description": "The unique identifier for this item." }, { "name": "form.widgets.name", "value": "", "prompt": "Name", "type": "TextLine", "required": true, "options": null, "description": "Name of this item." }, { "name": "form.widgets.description", "value": "", "prompt": "Description", "type": "TextLine", "required": false, "options": null, "description": "The description of this item." }, { "name": "form.buttons.save", "value": null, "type": "Button", "required": false, "prompt": "Save", "description": null }, { "name": "form.buttons.save_notify", "value": null, "type": "Button", "required": false, "prompt": "Save and Notify", "description": null } ] } """) self.assertEqual(result, answer) self.assertEqual(result, f._jc_template)
def test_base_render(self): f = form.ItemFormJsonBase(self.item, self.request) f.update() result = core.formfields_to_collection_template(f) answer = json.loads(""" { "data": [ { "name": "form.widgets.item_id", "value": "", "prompt": "Item ID", "type": "TextLine", "required": true, "options": null, "description": "The unique identifier for this item." }, { "name": "form.widgets.name", "value": "", "prompt": "Name", "type": "TextLine", "required": true, "options": null, "description": "Name of this item." }, { "name": "form.widgets.description", "value": "", "prompt": "Description", "type": "TextLine", "required": false, "options": null, "description": "The description of this item." } ] } """) self.assertEqual(result, answer) self.assertEqual(result, f._jc_template)
def update(self): """ Convert JSON input into standard request. """ _disable_csrf_for_webservices(self) update_json_collection_form(self) super(JsonCollectionFormMixin, self).update() self._jc_template = formfields_to_collection_template(self) return None
def test_choice_render(self): """ Choice rendering """ f = form.OptionForm(self.option, self.request) f.update() result = core.formfields_to_collection_template(f) # XXX the --NOVALUE-- token really needs rethinking. Plone # does not seem to let mapping of these things to be done nicely answer = json.loads(""" { "data": [ { "name": "form.widgets.item_id", "value": "", "prompt": "Item ID", "type": "TextLine", "required": true, "options": null, "description": "The item id that this option is attached to." }, { "name": "form.widgets.option", "value": [], "prompt": "Option", "type": "Choice", "required": false, "options": [ {"value": "--NOVALUE--", "text": "No value"}, {"value": "small", "text": "small"}, {"value": "medium", "text": "medium"}, {"value": "large", "text": "large"} ], "description": "The desired option." }, { "name": "form.buttons.submit", "value": null, "type": "Button", "required": false, "prompt": "Submit", "description": null } ] } """) self.assertEqual(result, answer) self.assertEqual(result, f._jc_template)
def update(self): """ Convert JSON input into standard request. """ # XXX at some point we need to consider the security and how # this might be vulnerable to XSS (for browsers that do not have # origin policy support). self.disableAuthenticator = True update_json_collection_form(self) super(JsonCollectionFormMixin, self).update() self._jc_template = formfields_to_collection_template(self) return None
def test_submit_error(self): request = TestRequest(stdin=StringIO('''{ "template": { "data": [ { "name": "form.widgets.item_id", "value": "TestItem\\nID" }, { "name": "form.widgets.name", "value": "A Test Item Name" }, { "name": "form.widgets.description", "value": "This describes the item." }, { "name": "form.buttons.save", "value": 1 } ] }}'''), method='POST') f = form.ItemForm(self.item, request) f.update() result = core.formfields_to_collection_template(f) answer = json.loads(""" { "data": [ { "name": "form.widgets.item_id", "value": "TestItem\\nID", "prompt": "Item ID", "type": "TextLine", "required": true, "options": null, "description": "The unique identifier for this item." }, { "name": "form.widgets.name", "value": "A Test Item Name", "prompt": "Name", "type": "TextLine", "required": true, "options": null, "description": "Name of this item." }, { "name": "form.widgets.description", "value": "This describes the item.", "type": "TextLine", "required": false, "prompt": "Description", "options": null, "description": "The description of this item." }, { "name": "form.buttons.save", "value": null, "type": "Button", "required": false, "prompt": "Save", "description": null }, { "name": "form.buttons.save_notify", "value": null, "type": "Button", "required": false, "prompt": "Save and Notify", "description": null } ] } """) self.assertEqual(result, answer) self.assertEqual(result, f._jc_template) error_answer = json.loads(""" { "title": "Error", "code": "error", "message": "There were some errors.", "errors": [ { "message": "Constraint not satisfied", "name": "form.widgets.item_id" } ] } """) self.assertEqual(error_answer, f._jc_error) # that item is still unchanged. self.assertIsNone(self.item.description)