helma/modules/jala/tests/Form.js

460 lines
15 KiB
JavaScript

//
// Jala Project [http://opensvn.csie.org/traccgi/jala]
//
// Copyright 2004 ORF Online und Teletext GmbH
//
// Licensed under the Apache License, Version 2.0 (the ``License'');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an ``AS IS'' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// $Revision$
// $LastChangedBy$
// $LastChangedDate$
// $HeadURL$
//
/**
* a global variable containing the form instance
* @type jala.Form
*/
var form;
/**
* Create and configure the form object
*/
var setup = function() {
form = jala.Form.create(getConfig(), new DataObject());
// form.render(); // show the test form
return;
};
/**
* Test the form rendering mechanism
*/
var testFormRender = function() {
var html = new jala.HtmlDocument(form.renderAsString());
var list = html.getAll("*");
var idx = 2;
assertEqual(list[idx].name, "form");
assertAttribute(list[idx].attributes, "id", "test");
assertAttribute(list[idx].attributes, "class", "form");
assertAttribute(list[idx].attributes, "name", "test");
assertAttribute(list[idx].attributes, "enctype", "multipart/form-data");
assertAttribute(list[idx].attributes, "method", "post");
// alias / input
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testAlias");
assertAttribute(list[idx].attributes, "class", "component require");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testAliasControl");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testAliasControl");
assertAttribute(list[idx].attributes, "class", "input");
assertAttribute(list[idx].attributes, "type", "text");
assertAttribute(list[idx].attributes, "maxlength", "10");
assertAttribute(list[idx].attributes, "name", "alias");
assertAttribute(list[idx].attributes, "size", "20");
assertEqual(list[++idx].name, "div");
assertEqual(list[idx].value, "Enter alias.");
assertAttribute(list[idx].attributes, "class", "helpText");
// desc / textarea
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testDesc");
assertAttribute(list[idx].attributes, "class", "component require");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testDescControl");
assertEqual(list[++idx].name, "textarea");
assertAttribute(list[idx].attributes, "id", "testDescControl");
assertAttribute(list[idx].attributes, "class", "textarea");
assertAttribute(list[idx].attributes, "name", "desc");
assertAttribute(list[idx].attributes, "cols", "30");
assertAttribute(list[idx].attributes, "rows", "3");
// pushdate / date
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testPushdate");
assertAttribute(list[idx].attributes, "class", "component require");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testPushdateControl");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testPushdateControl");
assertAttribute(list[idx].attributes, "class", "date");
assertAttribute(list[idx].attributes, "type", "text");
assertAttribute(list[idx].attributes, "name", "pushdate");
// isonline / checkbox
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testIsonline");
assertAttribute(list[idx].attributes, "class", "component optional");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testIsonlineControl");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testIsonlineControl");
assertAttribute(list[idx].attributes, "type", "checkbox");
assertAttribute(list[idx].attributes, "class", "checkbox");
assertAttribute(list[idx].attributes, "name", "isonline");
assertAttribute(list[idx].attributes, "value", "1");
// category / select
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testCategory");
assertAttribute(list[idx].attributes, "class", "component optional");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testCategoryControl");
assertEqual(list[++idx].name, "select");
assertAttribute(list[idx].attributes, "id", "testCategoryControl");
assertAttribute(list[idx].attributes, "class", "select");
assertAttribute(list[idx].attributes, "name", "category");
assertAttribute(list[idx].attributes, "size", "1");
assertEqual(list[++idx].name, "option");
assertAttribute(list[idx].attributes, "value", "cat0");
assertEqual(list[++idx].name, "option");
assertAttribute(list[idx].attributes, "value", "cat1");
assertEqual(list[++idx].name, "option");
assertAttribute(list[idx].attributes, "value", "cat2");
assertEqual(list[++idx].name, "option");
assertAttribute(list[idx].attributes, "value", "cat3");
// fieldset
assertEqual(list[++idx].name, "fieldset");
assertEqual(list[++idx].name, "legend");
assertEqual(list[idx].value, "a fieldset");
// fileupload
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testFileupload");
assertAttribute(list[idx].attributes, "class", "component optional");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testFileuploadControl");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testFileuploadControl");
assertAttribute(list[idx].attributes, "class", "file");
assertAttribute(list[idx].attributes, "type", "file");
assertAttribute(list[idx].attributes, "accept", "application/msword");
assertAttribute(list[idx].attributes, "name", "fileupload");
// imageupload
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testImageupload");
assertAttribute(list[idx].attributes, "class", "component optional");
assertEqual(list[++idx].name, "label");
assertAttribute(list[idx].attributes, "for", "testImageuploadControl");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testImageuploadControl");
assertAttribute(list[idx].attributes, "class", "image");
assertAttribute(list[idx].attributes, "type", "file");
assertAttribute(list[idx].attributes, "name", "imageupload");
// submit
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testSubmit");
assertAttribute(list[idx].attributes, "class", "component");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testSubmitControl");
assertAttribute(list[idx].attributes, "class", "submit");
assertAttribute(list[idx].attributes, "name", "submit");
assertAttribute(list[idx].attributes, "value", "Submit this form");
assertAttribute(list[idx].attributes, "type", "submit");
// cancel
assertEqual(list[++idx].name, "div");
assertAttribute(list[idx].attributes, "id", "testCancel");
assertAttribute(list[idx].attributes, "class", "component");
assertEqual(list[++idx].name, "input");
assertAttribute(list[idx].attributes, "id", "testCancelControl");
assertAttribute(list[idx].attributes, "class", "button");
assertAttribute(list[idx].attributes, "name", "cancel");
assertAttribute(list[idx].attributes, "value", "Cancel edit");
assertAttribute(list[idx].attributes, "type", "button");
return;
}
/**
* Test the form validation mechanism
*/
var testFormValidate = function() {
var reqData = getRequestData();
// default userinput values that should validate
var tracker = form.validate(reqData);
assertFalse(tracker.hasError());
// now try invalid values in userinput:
reqData["alias"] = "a";
reqData["desc"] = "";
reqData["pushdate"] = "17.5.2007";
reqData["category"] = "invalidOption";
tracker = form.validate(reqData);
assertTrue(tracker.hasError());
assertEqual(tracker.errors["alias"], "Alias is too short.");
assertEqual(tracker.errors["desc"], "Please enter text into this field.");
assertEqual(tracker.errors["pushdate"], "This date cannot be parsed.");
assertEqual(tracker.errors["category"], "Please select a valid option.");
// reset to default userinput:
reqData = getRequestData();
// require a smaller image:
form.components.uploadfieldset.components.imageupload.require("maxwidth", 100, "Maximum width exceeded.");
tracker = form.validate(reqData);
assertTrue(tracker.hasError());
assertEqual(tracker.errors["imageupload"], "Maximum width exceeded.");
// undo image restriction:
form.components.uploadfieldset.components.imageupload.require("maxwidth", 200, "Maximum width exceeded.");
tracker = form.validate(reqData);
assertFalse(tracker.hasError());
return;
};
/**
* Test the form rendering mechanism in the case of an error
*/
var testFormRenderWithError = function() {
var reqData = getRequestData();
reqData["alias"] = "a";
var tracker = form.validate(reqData);
var html = new jala.HtmlDocument(form.renderAsString());
var list = html.getAll("*");
assertEqual(list[4].name, "div");
assertEqual(list[4].value, "Alias is too short.");
assertAttribute(list[4].attributes, "class", "errorText");
};
/**
* Test the form save mechanism
*/
var testFormSave = function() {
var dataObj = form.getDataObject();
var reqData = getRequestData();
var tracker = form.validate(reqData);
assertFalse(tracker.hasError());
form.save();
assertEqual(dataObj.alias, "aliasValue");
assertEqual(dataObj.getProperty("desc"), "descriptionValue");
assertEqual(dataObj.pushdate.toString(), new Date(2007, 4, 17, 11, 32, 0).toString());
assertEqual(dataObj.isonline, 1);
assertEqual(dataObj.getProperty("category"), "cat2");
return;
}
/**
* Helper function to dump an html element to the response
* @param {Object} el
*/
var debugElement = function(el) {
res.write("<b>" + el.name + "</b> (" + el.value + ")<br/>");
if (el.attributes) {
var attrList = el.attributes;
for (var i=0; i<attrList.length; i++) {
res.write(attrList[i].name + " = " + attrList[i].value + "<br/>");
}
}
};
/**
* Helper function to assert that a given attribute exists
* in an element
* @param {Array} attrList Array with attribute objects
* @param {String} name Name of attribute
* @param {String} value Value of attribute
*/
var assertAttribute = function(attrList, name, value) {
for (var i=0; i<attrList.length; i++) {
if (attrList[i].name == name) {
if (attrList[i].value != value) {
throw new jala.Test.TestException("",
"assertAttribute: Expected value of attribute \"" + name + "\" to be equal to \"" + value + "\" (but it is \"" + attrList[i].value + "\" instead).");
}
return;
}
}
throw new jala.Test.TestException("", "assertAttribute: Attribute " + name + " not included in attributes.");
};
var DataObject = function() {
var props = {};
this.setProperty = function (name, value) {
props[name] = value;
};
this.getProperty = function(name) {
return props[name];
};
return this;
};
var getRequestData = function() {
var fileupload = "Form.fileupload.doc";
var imageupload = "Form.imageupload.jpg";
return {
alias: "aliasValue",
desc: "descriptionValue",
pushdate: "17.5.2007 11:32",
category: "cat2",
isonline: "1",
test_submit: "Submit",
imageupload: new Packages.helma.util.MimePart(
imageupload,
jala.Test.getTestFile(imageupload).toByteArray(),
"image/jpeg"
),
fileupload: new Packages.helma.util.MimePart(
fileupload,
jala.Test.getTestFile(fileupload).toByteArray(),
"application/msword"
)
};
};
var getConfig = function() {
return {
name: "test",
className: "form",
components:[
{
// name: "alias", deliberately left out, should construct name from label
label: "Alias",
help: "Enter alias.",
minlength: 4,
maxlength: 10,
require: true,
messages: {
require: "Alias is required.",
maxlength: "Alias is too long.",
minlength: "Alias is too short."
}
},
{
name: "desc",
type: "textarea",
rows: 3,
cols: 30,
require: true,
getter: function(name) {
return this.getProperty(name);
},
setter: function(name, val) {
return this.setProperty(name, val);
}
},
{
name: "pushdate",
type: "date",
dateFormat: "d.M.yyyy H:m",
require: true
},
{
name: "isonline",
type: "checkbox"
},
{ name: "category",
type: "select",
options: function() {
var arr = [];
for (var i=0; i<4; i++) {
arr[arr.length] = {
value: "cat" + i,
display: "Category " + i
};
}
return arr;
},
getter: function(name) {
return this.getProperty("category");
},
setter: function(name, value) {
this.setProperty("category", value);
}
},
{
name: "uploadfieldset",
type: "fieldset",
legend: "a fieldset",
components:[
{
name: "fileupload",
type: "file",
maxlength: 500000,
contenttype: "application/msword",
},
{
name: "imageupload",
type: "image",
minwidth: 10,
maxwidth: 200,
minheight: 10,
maxheight: 200
}
]
},
{
name: "submit",
type: "submit",
value: "Submit this form"
},
{
name: "cancel",
type: "button",
value: "Cancel edit"
}
]};
};