460 lines
15 KiB
JavaScript
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"
|
|
}
|
|
]};
|
|
};
|
|
|