tv4-formats
Version:
Common JSON Schema string format constraints in the form of tv4 validator callbacks
228 lines (180 loc) • 8.21 kB
JavaScript
describe('tv4-formats', function () {
'use strict';
var assert = require('assert'),
formats = require('../index.js');
describe('date', function () {
it('is defined', function () {
assert.strictEqual(typeof formats.date, 'function');
});
it('returns no error for a valid ISO 8601 date', function () {
assert.strictEqual(formats.date('2014-02-11'), null);
});
it('complains about 30th of February, mentioning the expected format', function () {
assert(/YYYY-MM-DD/.test(formats.date('2014-02-30')));
});
it('complains when the date format is wrong', function () {
assert(formats.date('11.02.2014').length > 0);
});
it('complains when it\'s not a date at all', function () {
assert(formats.date('BOO!').length > 0);
});
});
describe('date-time', function () {
it('is defined', function () {
assert.strictEqual(typeof formats['date-time'], 'function');
});
it('returns no error for a valid ISO 8601 UTC date and time with a TZ offset 1', function () {
assert.strictEqual(formats['date-time']('2014-02-11T15:19:59+00:00'), null);
});
it('returns no error for a valid ISO 8601 UTC date and time with a TZ offset 2', function () {
assert.strictEqual(formats['date-time']('2014-02-11T15:19:59+0000'), null);
});
it('returns no error for a valid ISO 8601 UTC date and time with a TZ offset 3', function () {
assert.strictEqual(formats['date-time']('2014-02-11T15:19:59+00'), null);
});
it('returns no error for a valid ISO 8601 UTC date and time with no TZ offset', function () {
assert.strictEqual(formats['date-time']('2014-02-11T15:19:59Z'), null);
});
it('returns no error for a valid ISO 8601 UTC date-time with a TZ offset and fractional seconds', function () {
assert.strictEqual(formats['date-time']('2014-02-11T15:19:59.000+00:00'), null);
});
it('it complains on garbage', function () {
assert(formats['date-time']('jsdfhdfsb hjsbdfhbdhbbfd hjsdb').length > 0);
});
it('complains on a date-time in a wrong format 1', function () {
assert(formats['date-time']('2014-02-11 16:31:14').length > 0);
});
it('complains on a date-time in a wrong format 2', function () {
assert(formats['date-time']('2013-W06-5T09:30:26 Z').length > 0);
});
it('complains on a date-time in a wrong format 3', function () {
assert(formats['date-time']('2013-06-05T09:30:26-00000').length > 0);
});
it('complains on a date-time in a wrong format 4', function () {
assert(formats['date-time']('2013-06-05T09:30:26+000:0').length > 0);
});
});
describe('email', function () {
it('is defined', function () {
assert.strictEqual(typeof formats.email, 'function');
});
it('validates positively', function () {
assert.strictEqual(formats.email('ivan.krechetov+special-tag@gmail.com'), null);
});
it('validates negatively', function () {
assert(formats.email('#not_an_email').length > 0);
});
});
describe('uri', function () {
it('is defined', function () {
assert.strictEqual(typeof formats.uri, 'function');
});
it('validates positively', function () {
assert.strictEqual(formats.uri('http://krechetov.net/'), null);
});
it('accepts just a name', function () {
assert.strictEqual(formats.uri('foobar'), null);
});
it('accepts an absolute path', function () {
assert.strictEqual(formats.uri('/var/log/nginx/access.log'), null);
});
it('accepts a ./ relative path', function () {
assert.strictEqual(formats.uri('./export.xml'), null);
});
it('accepts a ../ relative path', function () {
assert.strictEqual(formats.uri('../export.xml'), null);
});
it('validates negatively', function () {
assert(formats.uri('+41 43 000 00 00 Grüezi').length > 0);
});
});
describe('url', function () {
it('is defined', function () {
assert.strictEqual(typeof formats.url, 'function');
});
it('validates positively 1', function () {
assert.strictEqual(formats.url('https://ikr.su/'), null);
});
it('validates positively 2', function () {
assert.strictEqual(formats.url('http://localhost:3000/'), null);
});
it('validates negatively 1', function () {
assert(formats.url('http://asdf:3000/').length > 0);
});
it('validates negatively 2', function () {
assert(formats.url('#clearly# :not: a URL').length > 0);
});
});
describe('credit-card-number', function () {
it('is defined', function () {
assert.strictEqual(typeof formats['credit-card-number'], 'function');
});
it('validates positively', function () {
assert.strictEqual(formats['credit-card-number']('4242424242424242'), null);
});
it('validates negatively on garbage', function () {
assert(formats['credit-card-number']('MA CC NUM').length > 0);
});
it('validates negatively on a number violating the checksum', function () {
assert(formats['credit-card-number']('1000000000000000').length > 0);
});
});
describe('duration', function () {
it('is defined', function () {
assert.strictEqual(typeof formats.duration, 'function');
});
[
'P1Y', 'P2M', 'P3W', 'P4D', // days
'PT1H', 'PT2M', 'PT3S', // times
'P3Y6M4DT12H30M5S', 'P23DT23H', 'P1Y3WT24H', // combined
'P0.5Y', 'P0,5Y', 'PT0.5H' // fractions
].forEach(function (validDuration) {
it('validates valid "' + validDuration + '" duration positively', function () {
assert.strictEqual(formats.duration(validDuration), null);
});
});
[
'P1', '2M', 'PW', 'P4D2', 'PT1Y', 'P2S', 'P3Y6M4D12H30M5S', 'PT0.5'
].forEach(function (invalidDuration) {
it('validates invalid "' + invalidDuration + '" duration negatively', function () {
assert(formats.duration(invalidDuration).length);
});
});
});
describe('time-offset', function () {
it('is defined', function () {
assert.strictEqual(typeof formats['time-offset'], 'function');
});
[
'P1Y', '-P1Y3WT24H', 'P0.5Y', '-P0,5Y', 'PT0.5H'
].forEach(function (validTimeOffset) {
it('validates valid "' + validTimeOffset + '" time offset positively', function () {
assert.strictEqual(formats['time-offset'](validTimeOffset), null);
});
});
[
'P1', '-PW', 'P4D2', '-P3Y6M4D12H30M5S'
].forEach(function (invalidTimeOffset) {
it('validates invalid "' + invalidTimeOffset + '" time offset negatively', function () {
assert(formats.duration(invalidTimeOffset).length);
});
});
});
describe('guid', function () {
it('is defined', function () {
assert.strictEqual(typeof formats.guid, 'function');
});
it('validates positively', function () {
assert.strictEqual(formats.guid('34f8216d-b4b2-5d4d-b46b-ba1466ea3ab9'), null);
});
it('validates negatively 1', function () {
assert(formats.guid('34f8216d-xxxx-5d4d-b46b-ba1466ea3ab9').length > 0);
});
it('validates negatively 2', function () {
assert(formats.guid('ikr@ikr.su').length > 0);
});
it('accepts optional curlies', function () {
assert.strictEqual(formats.guid('{7e39b1e6-23d1-11e6-8456-e75e8e0d2af6}'), null);
});
});
});