express-form
Version:
Form validation and data filtering for Express
199 lines (185 loc) • 6.39 kB
JavaScript
var assert = require("assert")
, form = require("../index")
, field = form.field;
module.exports = {
"field : arrays": function () {
// Array transformations.
var request = {
body: {
field1: "",
field2: "Hello!",
field3: ["Alpacas?", "Llamas!!?", "Vicunas!", "Guanacos!!!"]
}
};
form(
field("fieldx").array(),
field("field1").array(),
field("field2").array(),
field("field3").array()
)(request, {});
assert.strictEqual(Array.isArray(request.form.fieldx), true);
assert.strictEqual(request.form.fieldx.length, 0);
assert.strictEqual(Array.isArray(request.form.field1), true);
assert.strictEqual(request.form.field1.length, 0);
assert.strictEqual(request.form.field2[0], "Hello!");
assert.strictEqual(request.form.field2.length, 1);
assert.strictEqual(request.form.field3[0], "Alpacas?");
assert.strictEqual(request.form.field3[1], "Llamas!!?");
assert.strictEqual(request.form.field3[2], "Vicunas!");
assert.strictEqual(request.form.field3[3], "Guanacos!!!");
assert.strictEqual(request.form.field3.length, 4);
// No array flag!
var request = { body: { field: ["red", "blue"] } };
form(field("field"))(request, {});
assert.strictEqual(request.form.field, "red");
// Iterate and filter array.
var request = { body: { field: ["david", "stephen", "greg"] } };
form(field("field").array().toUpper())(request, {});
assert.strictEqual(request.form.field[0], "DAVID");
assert.strictEqual(request.form.field[1], "STEPHEN");
assert.strictEqual(request.form.field[2], "GREG");
assert.strictEqual(request.form.field.length, 3);
// Iterate and validate array
var request = { body: { field: [1, 2, "f"] } };
form(field("field").array().isInt())(request, {});
assert.equal(request.form.errors.length, 1);
assert.equal(request.form.errors[0], "field is not an integer");
},
"field : nesting": function () {
// Nesting with dot notation
var request = {
body: {
field: {
nest: "wow",
child: "4",
gb: {
a: "a",
b: "aaaa",
c: {
fruit: "deeper",
must: {
go: "deeperrrr"
}
}
}
}
}
};
form(
field("field.nest").toUpper(),
field("field.child").toUpper(),
field("field.gb.a").toUpper(),
field("field.gb.b").toUpper(),
field("field.gb.c.fruit").toUpper(),
field("field.gb.c.must.go").toUpper()
)(request, {});
assert.strictEqual(request.form.field.nest, "WOW");
assert.strictEqual(request.form.field.child, "4");
assert.strictEqual(request.form.field.gb.a, "A");
assert.strictEqual(request.form.field.gb.b, "AAAA");
assert.strictEqual(request.form.field.gb.c.fruit, "DEEPER");
assert.strictEqual(request.form.field.gb.c.must.go, "DEEPERRRR");
// Nesting with square-bracket notation
var request = {
body: {
field: {
nest: "wow",
child: "4",
gb: {
a: "a",
b: "aaaa",
c: {
fruit: "deeper",
must: {
go: "deeperrrr"
}
}
}
}
}
};
form(
field("field[nest]").toUpper(),
field("field[child]").toUpper(),
field("field[gb][a]").toUpper(),
field("field[gb][b]").toUpper(),
field("field[gb][c][fruit]").toUpper(),
field("field[gb][c][must][go]").toUpper()
)(request, {});
assert.strictEqual(request.form.field.nest, "WOW");
assert.strictEqual(request.form.field.child, "4");
assert.strictEqual(request.form.field.gb.a, "A");
assert.strictEqual(request.form.field.gb.b, "AAAA");
assert.strictEqual(request.form.field.gb.c.fruit, "DEEPER");
assert.strictEqual(request.form.field.gb.c.must.go, "DEEPERRRR");
},
"field : filter/validate combo ordering": function () {
// Can arrange filter and validate procs in any order.
var request = {
body: {
field1: " whatever ",
field2: " some thing "
}
};
form(
field("field1").trim().toUpper().maxLength(5),
field("field2").minLength(12).trim()
)(request, {});
assert.strictEqual(request.form.field1, "WHATEVER");
assert.strictEqual(request.form.field2, "some thing");
assert.equal(request.form.errors.length, 1);
assert.equal(request.form.errors[0], "field1 is too long");
},
"field : autoTrim": function () {
// Auto-trim declared fields.
form.configure({ autoTrim: true });
var request = { body: { field: " whatever " } };
form(field("field"))(request, {});
assert.strictEqual(request.form.field, "whatever");
form.configure({ autoTrim: false });
},
"field : passThrough": function () {
// request.form gets all values from sources.
form.configure({ passThrough: true });
var request = {
body: {
field1: "fdsa",
field2: "asdf"
}
};
form(field("field1"))(request, {});
assert.strictEqual(request.form.field1, "fdsa");
assert.strictEqual(request.form.field2, "asdf");
// request.form only gets declared fields.
form.configure({ passThrough: false });
var request = { body: {
field1: "fdsa",
field2: "asdf"
} };
form(field("field1"))(request, {});
assert.strictEqual(request.form.field1, "fdsa");
assert.strictEqual(typeof request.form.field2, "undefined");
},
"form : getErrors() gives full map": function() {
var request = {
body: {
field0: "win",
field1: "fail",
field2: "fail",
field3: "fail"
}
};
form(
field("field0").equals("win"),
field("field1").isEmail(),
field("field2").isEmail().isUrl(),
field("field3").isEmail().isUrl().isIP()
)(request, {});
assert.equal(request.form.isValid, false);
assert.equal(request.form.errors.length, 6);
assert.equal(typeof request.form.getErrors().field0, "undefined");
assert.equal(request.form.getErrors().field1.length, 1);
assert.equal(request.form.getErrors().field2.length, 2);
assert.equal(request.form.getErrors().field3.length, 3);
}
}