express-form
Version:
Form validation and data filtering for Express
96 lines (84 loc) • 2.49 kB
JavaScript
var assert = require("assert"),
form = require("../index"),
filter = form.filter,
validate = form.validate,
express = require("express"),
http = require("http"),
app = express();
http.createServer(app).listen(3000);
// some duct-tape to make assert.response work with express 3.x
app.address = function() {
return {port: 3000};
};
app.close = function() {
process.exit(0);
};
app.configure(function() {
app.use(express.bodyParser());
});
module.exports = {
'express : middleware : valid-form': function() {
app.post(
'/user',
form(
filter("username").trim(),
validate("username").required().is(/^[a-z]+$/),
filter("password").trim(),
validate("password").required().is(/^[0-9]+$/)
),
function(req, res){
assert.strictEqual(req.form.username, "dandean");
assert.strictEqual(req.form.password, "12345");
assert.strictEqual(req.form.isValid, true);
assert.strictEqual(req.form.errors.length, 0);
res.send(JSON.stringify(req.form));
}
);
assert.response(app,
{
url: '/user',
method: 'POST',
body: JSON.stringify({
username: " dandean \n\n\t",
password: " 12345 "
}),
headers: { 'Content-Type': 'application/json' }
},
{ status: 200 }
);
},
'express : middleware : merged-data': function() {
app.post(
'/user/:id',
form(
filter("id").toInt(),
filter("stuff").toUpper(),
filter("rad").toUpper()
),
function(req, res){
// Validate filtered form data
assert.strictEqual(req.form.id, 5); // from param
assert.equal(req.form.stuff, "THINGS"); // from query param
assert.equal(req.form.rad, "COOL"); // from body
// Check that originl values are still in place
assert.ok(typeof req.params.id, "string");
assert.equal(req.query.stuff, "things");
assert.equal(req.body.rad, "cool");
res.send(JSON.stringify(req.form));
}
);
assert.response(app,
{
url: '/user/5?stuff=things&id=overridden',
method: 'POST',
body: JSON.stringify({
id: "overridden by url param",
stuff: "overridden by query param",
rad: "cool"
}),
headers: { 'Content-Type': 'application/json' }
},
{ status: 200 }
);
}
};