ajv/spec/errors.spec.js

103 lines
2.5 KiB
JavaScript
Raw Normal View History

'use strict';
var Ajv = require('../lib/ajv')
, should = require('chai').should();
describe('Validation errors', function () {
var ajv, fullAjv;
beforeEach(function() {
ajv = Ajv();
fullAjv = Ajv({ allErrors: true });
});
it('error should include dataPath', function() {
testSchema1({
properties: {
foo: { type: 'number' }
}
});
});
it('error should include dataPath in refs', function() {
testSchema1({
definitions: {
num: { type: 'number' }
},
properties: {
foo: { $ref: '#/definitions/num' }
}
});
});
it('errors for additionalProperties should include property in dataPath', function() {
var schema = {
properties: {
foo: {},
bar: {}
},
additionalProperties: false
};
var data = { foo: 1, bar: 2 }
, invalidData = { foo: 1, bar: 2, baz: 3, quux: 4 };
var validate = ajv.compile(schema);
shouldBeValid(validate, data);
shouldBeInvalid(validate, invalidData);
shouldBeError(validate.errors[0], 'additionalProperties', "['baz']");
var fullValidate = fullAjv.compile(schema);
shouldBeValid(fullValidate, data);
shouldBeInvalid(fullValidate, invalidData, 2);
shouldBeError(fullValidate.errors[0], 'additionalProperties', "['baz']");
shouldBeError(fullValidate.errors[1], 'additionalProperties', "['quux']");
fullValidate.errors
.filter(function(err) { return err.keyword == 'additionalProperties'; })
.map(function(err) { return err.dataPath.slice(2,-2); })
.forEach(function(p) { delete invalidData[p]; });
invalidData .should.eql({ foo: 1, bar: 2 });
});
function testSchema1(schema) {
_testSchema1(ajv, schema);
_testSchema1(fullAjv, schema)
}
function _testSchema1(ajv, schema) {
var data = { foo: 1 }
, invalidData = { foo: 'bar' };
var validate = ajv.compile(schema);
shouldBeValid(validate, data);
shouldBeInvalid(validate, invalidData);
shouldBeError(validate.errors[0], 'type', '.foo');
}
function shouldBeValid(validate, data) {
validate(data) .should.equal(true);
should.equal(validate.errors, null);
}
function shouldBeInvalid(validate, data, numErrors) {
validate(data) .should.equal(false);
validate.errors.length .should.equal(numErrors || 1);
}
function shouldBeError(error, keyword, dataPath) {
error.keyword .should.equal(keyword);
error.message .should.be.a('string');
error.dataPath .should.equal(dataPath);
}
});