forms
Version:
An easy way to create, parse, and validate forms
462 lines (416 loc) • 15.7 kB
JavaScript
;
var validators = require('../lib/forms').validators;
var test = require('tape');
test('matchField', function (t) {
var v = validators.matchField('field1', 'f2 dnm %s'),
data = {
fields: {
field1: { data: 'one' },
field2: { data: 'two' }
}
};
t.plan(2);
v(data, data.fields.field2, function (err) {
t.equal(err, 'f2 dnm field1');
data.fields.field2.data = 'one';
v(data, data.fields.field2, function (error) {
t.equal(error, undefined);
t.end();
});
});
});
test('matchValue', function (t) {
var data = { fields: { field1: { data: 'one' } } };
t.test('passes when matching the value', function (st) {
var getter = function () { return 'one'; };
var v = validators.matchValue(getter, 'name: %s | value: %s');
st.plan(1);
v(data, data.fields.field1, function (err) {
st.equal(err, undefined);
st.end();
});
});
t.test('fails when not matching the value', function (st) {
var getter = function () { return 'NOPE FAILURE'; };
var v = validators.matchValue(getter, 'name: %s | value: %s');
st.plan(1);
v(data, data.fields.field1, function (err) {
st.equal(err, 'name: This field | value: NOPE FAILURE');
st.end();
});
});
t.test('fails when not provided a function', function (st) {
var nonFunctions = [undefined, null, 42, /a/g, 'foo', [], {}];
st.plan(nonFunctions.length);
nonFunctions.forEach(function (nonFunction) {
st['throws'](function () { validators.matchValue(nonFunction); }, TypeError, nonFunction + ' is not a function');
});
st.end();
});
t.end();
});
test('required', function (t) {
t.plan(3);
var v = validators.required();
var emptyFields = { field: { name: 'field', data: '' } };
var whitespaceFields = { field: { name: 'field', data: ' ' } };
var filledFields = { field: { name: 'field', data: 'foo' } };
v({ fields: emptyFields }, emptyFields.field, function (emptyError) {
t.equal(emptyError, 'field is required.');
v({ fields: whitespaceFields }, whitespaceFields.field, function (whitespaceError) {
t.equal(whitespaceError, 'field is required.');
v({ fields: filledFields }, filledFields.field, function (filledError) {
t.equal(filledError, undefined);
t.end();
});
});
});
});
test('requiresFieldIfEmpty', function (t) {
t.plan(4);
var v = validators.requiresFieldIfEmpty('alternate_field', 'field 1: %s field2: %s'),
empty_fields = {
field: { name: 'field', data: ' ' },
alternate_field: { name: 'alternate_field', data: '' }
},
filled_fields = {
field: { name: 'field', data: 'filled' },
alternate_field: { name: 'alternate_field', data: 'also filled' }
},
first_filled = {
field: { name: 'field', data: 'filled' },
alternate_field: { name: 'alternate_field', data: '' }
},
second_filled = {
field: { name: 'field', data: '' },
alternate_field: { name: 'alternate_field', data: 'filled' }
};
v({ fields: empty_fields }, empty_fields.field, function (emptyError) {
t.equal(emptyError, 'field 1: field field2: alternate_field');
v({ fields: filled_fields }, filled_fields.field, function (filledError) {
t.equal(filledError, undefined);
v({ fields: first_filled }, first_filled.field, function (firstFilledError) {
t.equal(firstFilledError, undefined);
v({ fields: second_filled }, second_filled.field, function (secondFilledError) {
t.equal(secondFilledError, undefined);
t.end();
});
});
});
});
});
test('min', function (t) {
t.plan(2);
validators.min(100, 'Value must be greater than or equal to %s.')('form', { data: 50 }, function (tooSmallError) {
t.equal(tooSmallError, 'Value must be greater than or equal to 100.');
validators.min(100)('form', { data: 100 }, function (err) {
t.equal(err, undefined);
t.end();
});
});
});
test('max', function (t) {
t.plan(2);
validators.max(100, 'Value must be less than or equal to %s.')('form', { data: 150 }, function (tooBigError) {
t.equal(tooBigError, 'Value must be less than or equal to 100.');
validators.max(100)('form', { data: 100 }, function (err) {
t.equal(err, undefined);
t.end();
});
});
});
test('range', function (t) {
t.plan(2);
validators.range(10, 20, 'Value must be between %s and %s.')('form', { data: 50 }, function (rangeError) {
t.equal(rangeError, 'Value must be between 10 and 20.');
validators.range(10, 20)('form', { data: 15 }, function (err) {
t.equal(err, undefined);
t.end();
});
});
});
test('regexp', function (t) {
t.plan(3);
validators.regexp(/^\d+$/)('form', { data: 'abc123' }, function (invalidError) {
t.equal(invalidError, 'Invalid format.');
validators.regexp(/^\d+$/)('form', { data: '123' }, function (noError) {
t.equal(noError, undefined);
var v = validators.regexp('^\\d+$', 'my message');
v('form', { data: 'abc123' }, function (err) {
t.equal(err, 'my message');
t.end();
});
});
});
});
test('email', function (t) {
t.plan(8);
validators.email('Email was invalid.')('form', { data: 'asdf' }, function (invalidEmailError) {
t.equal(invalidEmailError, 'Email was invalid.');
});
var v = validators.email();
v('form', { data: 'asdf@asdf.com' }, function (noError) {
t.equal(noError, undefined, 'asdf@asdf.com');
});
v('form', { data: 'a←+b@f.museum' }, function (err) {
t.equal(err, undefined, 'a←+b@f.museum');
});
v('form', { data: 'asdf(with comments)@example.com' }, function (err) {
t.error(err, 'asdf(with comments)@example.com');
});
v('form', { data: '"quoted"@example.com' }, function (err) {
t.error(err, '"quoted"@example.com');
});
v('form', { data: '"quoted spaced"@example.com' }, function (err) {
t.error(err, '"quoted spaced"@example.com');
});
v('form', { data: '"quoted@at"@example.com' }, function (err) {
t.error(err, '"quoted@at"@example.com');
});
v('form', { data: '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }, function (err) {
t.equal(err, 'Please enter a valid email address.', 'lots of a’s');
});
t.end();
});
test('url', function (t) {
t.plan(4);
validators.url(false, 'URL was invalid.')('form', { data: 'asdf.com' }, function (invalidURLError) {
t.equal(invalidURLError, 'URL was invalid.');
validators.url()('form', { data: 'http://asdf.com' }, function (err) {
t.equal(err, undefined);
});
});
validators.url(true)('form', { data: 'localhost/test.html' }, function (invalidURLError) {
t.equal(invalidURLError, 'Please enter a valid URL.');
validators.url(true)('form', { data: 'http://localhost/test.html' }, function (err) {
t.equal(err, undefined);
});
});
t.end();
});
test('date', function (t) {
t.plan(4);
validators.date('Date input must contain a valid date.')('form', { data: '02/28/2012' }, function (invalidDateError) {
t.equal(invalidDateError, 'Date input must contain a valid date.');
validators.date()('form', { data: '2012-02-28' }, function (err) {
t.equal(err, undefined);
});
});
validators.date()('form', { data: '2012.02.30' }, function (invalidDateError) {
t.equal(invalidDateError, 'Inputs of type "date" must be valid dates in the format "yyyy-mm-dd"');
validators.date()('form', { data: '2012-02-30' }, function (err) {
t.equal(err, undefined);
});
});
t.end();
});
test('minlength', function (t) {
t.plan(4);
validators.minlength(5, 'Enter at least %s characters.')('form', { data: '1234' }, function (tooShortError) {
t.equal(tooShortError, 'Enter at least 5 characters.');
validators.minlength(5)('form', { data: '12345' }, function (err) {
t.equal(err, undefined);
});
});
validators.minlength(5, 'Enter at least %s characters.')('form', { data: 12345 }, function (err) {
t.equal(err, undefined);
});
validators.minlength(5, 'Enter at least %s characters.')('form', { data: 1234 }, function (err) {
t.equal(err, 'Enter at least 5 characters.');
});
t.end();
});
test('maxlength', function (t) {
t.plan(4);
validators.maxlength(5)('form', { data: '123456' }, function (tooLongError) {
t.equal(tooLongError, 'Please enter no more than 5 characters.');
validators.maxlength(5)('form', { data: '12345' }, function (err) {
t.equal(err, undefined);
});
});
validators.maxlength(5, 'Please enter no more than 5 characters.')('form', { data: 12345 }, function (err) {
t.equal(err, undefined);
});
validators.maxlength(5, 'Please enter no more than 5 characters.')('form', { data: 123456 }, function (err) {
t.equal(err, 'Please enter no more than 5 characters.');
});
t.end();
});
test('rangelength', function (t) {
t.plan(8);
validators.rangelength(2, 4, 'Enter between %s and %s characters.')('form', { data: '12345' }, function (err) {
t.equal(err, 'Enter between 2 and 4 characters.');
});
validators.rangelength(2, 4)('form', { data: '1' }, function (err) {
t.equal(err, 'Please enter a value between 2 and 4 characters long.');
});
validators.rangelength(2, 4)('form', { data: '12' }, function (err) {
t.equal(err, undefined);
});
validators.rangelength(2, 4)('form', { data: '1234' }, function (err) {
t.equal(err, undefined);
});
validators.rangelength(2, 4, 'Enter between %s and %s characters.')('form', { data: 12345 }, function (err) {
t.equal(err, 'Enter between 2 and 4 characters.');
});
validators.rangelength(2, 4)('form', { data: 1 }, function (err) {
t.equal(err, 'Please enter a value between 2 and 4 characters long.');
});
validators.rangelength(2, 4)('form', { data: 12 }, function (err) {
t.equal(err, undefined);
});
validators.rangelength(2, 4)('form', { data: 1234 }, function (err) {
t.equal(err, undefined);
});
t.end();
});
test('color', function (t) {
t.test('valid colors', function (st) {
var v = validators.color();
var valids = ['#ABC', '#DEF123', '#ABCDEF12', '#01234567', '#890'];
st.plan(valids.length);
valids.forEach(function (color) {
v('form', { data: color }, function (err) {
st.equal(err, undefined);
});
});
st.end();
});
t.test('invalid colors', function (st) {
var invalids = ['ABC', 'DEF123', '#ABCDEG', '#0123.3', null, true, false];
st.plan(invalids.length);
var msg = 'Color inputs require hex notation.';
var v = validators.color(msg);
invalids.forEach(function (color) {
v('form', { data: color }, function (err) {
st.equal(err, msg);
});
});
st.end();
});
t.end();
});
test('alphanumeric', function (t) {
var v = validators.alphanumeric();
t.test('valid input', function (st) {
var valids = ['asdf', '278', '123abc'];
st.plan(valids.length);
valids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, undefined);
});
});
st.end();
});
t.test('valid with extra spaces', function (st) {
var almostValids = [' qwer', ' 1 ', 'abc123 '];
st.plan(almostValids.length);
almostValids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, 'Letters and numbers only.');
});
});
st.end();
});
t.test('invalid', function (st) {
var invalids = ['d%d', 'c!c', 'b_b', 'a-a'];
st.plan(invalids.length);
invalids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, 'Letters and numbers only.');
});
});
st.end();
});
t.end();
});
test('nonFormatMessage1', function (t) {
t.plan(2);
var v = validators.matchField('field1', 'f2 dnm f1'),
data = {
fields: {
field1: { data: 'one' },
field2: { data: 'two' }
}
};
v(data, data.fields.field2, function (err) {
t.equals(err, 'f2 dnm f1');
data.fields.field2.data = 'one';
v(data, data.fields.field2, function (noError) {
t.equals(noError, undefined);
t.end();
});
});
});
test('nonFormatMessage2', function (t) {
t.plan(2);
var v = validators.min(100, '1234567890');
v('form', { data: 50 }, function (tooSmallError) {
t.equals(tooSmallError, '1234567890');
validators.min(100)('form', { data: 100 }, function (err) {
t.equals(err, undefined);
t.end();
});
});
});
test('nonFormatMessage3', function (t) {
t.plan(2);
var v = validators.minlength(5, 'qwertyuiop');
v('form', { data: '1234' }, function (tooShortError) {
t.equals(tooShortError, 'qwertyuiop');
validators.minlength(5)('form', { data: '12345' }, function (err) {
t.equals(err, undefined);
t.end();
});
});
});
test('integer', function (t) {
var v = validators.integer();
t.test('valid integers', function (st) {
var valids = ['1', '10', '-1', '-10', '-10'];
st.plan(valids.length);
valids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, undefined);
});
});
st.end();
});
t.test('invalid integers', function (st) {
var invalids = ['1.5', 'one', '1,5', 'FFFFF', '+10'];
var msg = 'Please enter an integer value.';
st.plan(invalids.length);
invalids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, msg);
});
});
st.end();
});
t.end();
});
test('digits', function (t) {
var v = validators.digits();
t.test('valid digits', function (st) {
var valids = ['1', '10', '100'];
st.plan(valids.length);
valids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, undefined);
});
});
st.end();
});
t.test('invalid digits', function (st) {
var invalids = ['-1', '+10', 'one', '1.5'];
var msg = 'Numbers only.';
st.plan(invalids.length);
invalids.forEach(function (input) {
v('form', { data: input }, function (err) {
st.equal(err, msg);
});
});
st.end();
});
t.end();
});