ajv/spec/boolean.spec.js

477 lines
12 KiB
JavaScript

'use strict';
var Ajv = require('./ajv');
require('./chai').should();
describe('boolean schemas', function() {
var ajvs;
before(function() {
ajvs = [
new Ajv,
new Ajv({allErrors: true}),
new Ajv({inlineRefs: false})
];
});
describe('top level schema', function() {
describe('schema = true', function() {
it('should validate any data as valid', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should validate any data as invalid', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var validate = ajv.compile(boolSchema);
testSchema(validate, valid);
};
}
});
describe('in properties / sub-properties', function() {
describe('schema = true', function() {
it('should be valid with any property value', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any property value', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
type: 'object',
properties: {
foo: boolSchema,
bar: {
type: 'object',
properties: {
baz: boolSchema
}
}
}
};
var validate = ajv.compile(schema);
validate({ foo: 1, bar: { baz: 1 }}) .should.equal(valid);
validate({ foo: '1', bar: { baz: '1' }}) .should.equal(valid);
validate({ foo: {}, bar: { baz: {} }}) .should.equal(valid);
validate({ foo: [], bar: { baz: [] }}) .should.equal(valid);
validate({ foo: true, bar: { baz: true }}) .should.equal(valid);
validate({ foo: false, bar: { baz: false }}) .should.equal(valid);
validate({ foo: null, bar: { baz: null }}) .should.equal(valid);
validate({ bar: { quux: 1 } }) .should.equal(true);
};
}
});
describe('in items / sub-items', function() {
describe('schema = true', function() {
it('should be valid with any item value', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any item value', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
type: 'array',
items: boolSchema
};
var validate = ajv.compile(schema);
validate([ 1 ]) .should.equal(valid);
validate([ '1' ]) .should.equal(valid);
validate([ {} ]) .should.equal(valid);
validate([ [] ]) .should.equal(valid);
validate([ true ]) .should.equal(valid);
validate([ false ]) .should.equal(valid);
validate([ null ]) .should.equal(valid);
validate([]) .should.equal(true);
schema = {
type: 'array',
items: [
true,
{
type: 'array',
items: [
true,
boolSchema
]
},
boolSchema
]
};
validate = ajv.compile(schema);
validate([ 1, [ 1, 1 ], 1 ]) .should.equal(valid);
validate([ '1', [ '1', '1' ], '1' ]) .should.equal(valid);
validate([ {}, [ {}, {} ], {} ]) .should.equal(valid);
validate([ [], [ [], [] ], [] ]) .should.equal(valid);
validate([ true, [ true, true ], true ]) .should.equal(valid);
validate([ false, [ false, false ], false ]) .should.equal(valid);
validate([ null, [ null, null ], null ]) .should.equal(valid);
validate([ 1, [ 1 ] ]) .should.equal(true);
};
}
});
describe('in dependencies and sub-dependencies', function() {
describe('schema = true', function() {
it('should be valid with any property value', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any property value', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
type: 'object',
dependencies: {
foo: boolSchema,
bar: {
type: 'object',
dependencies: {
baz: boolSchema
}
}
}
};
var validate = ajv.compile(schema);
validate({ foo: 1, bar: 1, baz: 1 }) .should.equal(valid);
validate({ foo: '1', bar: '1', baz: '1' }) .should.equal(valid);
validate({ foo: {}, bar: {}, baz: {} }) .should.equal(valid);
validate({ foo: [], bar: [], baz: [] }) .should.equal(valid);
validate({ foo: true, bar: true, baz: true }) .should.equal(valid);
validate({ foo: false, bar: false, baz: false }) .should.equal(valid);
validate({ foo: null, bar: null, baz: null }) .should.equal(valid);
validate({ bar: 1, quux: 1 }) .should.equal(true);
};
}
});
describe('in patternProperties', function () {
describe('schema = true', function() {
it('should be valid with any property matching pattern', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any property matching pattern', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
type: 'object',
patternProperties: {
'^f': boolSchema,
'r$': {
type: 'object',
patternProperties: {
'z$': boolSchema
}
}
}
};
var validate = ajv.compile(schema);
validate({ foo: 1, bar: { baz: 1 }}) .should.equal(valid);
validate({ foo: '1', bar: { baz: '1' }}) .should.equal(valid);
validate({ foo: {}, bar: { baz: {} }}) .should.equal(valid);
validate({ foo: [], bar: { baz: [] }}) .should.equal(valid);
validate({ foo: true, bar: { baz: true }}) .should.equal(valid);
validate({ foo: false, bar: { baz: false }}) .should.equal(valid);
validate({ foo: null, bar: { baz: null }}) .should.equal(valid);
validate({ bar: { quux: 1 } }) .should.equal(true);
};
}
});
describe('in propertyNames', function() {
describe('schema = true', function() {
it('should be valid with any property', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any property', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
type: 'object',
propertyNames: boolSchema
};
var validate = ajv.compile(schema);
validate({ foo: 1 }) .should.equal(valid);
validate({ bar: 1 }) .should.equal(valid);
validate({}) .should.equal(true);
};
}
});
describe('in contains', function() {
describe('schema = true', function() {
it('should be valid with any items', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any items', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
type: 'array',
contains: boolSchema
};
var validate = ajv.compile(schema);
validate([ 1 ]) .should.equal(valid);
validate([ 'foo' ]) .should.equal(valid);
validate([ {} ]) .should.equal(valid);
validate([ [] ]) .should.equal(valid);
validate([ true ]) .should.equal(valid);
validate([ false ]) .should.equal(valid);
validate([ null ]) .should.equal(valid);
validate([]) .should.equal(false);
};
}
});
describe('in not', function() {
describe('schema = true', function() {
it('should be invalid with any data', function() {
ajvs.forEach(test(true, false));
});
});
describe('schema = false', function() {
it('should be valid with any data', function() {
ajvs.forEach(test(false, true));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
not: boolSchema
};
var validate = ajv.compile(schema);
testSchema(validate, valid);
};
}
});
describe('in allOf', function() {
describe('schema = true', function() {
it('should be valid with any data', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any data', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
allOf: [
false,
boolSchema
]
};
var validate = ajv.compile(schema);
testSchema(validate, false);
schema = {
allOf: [
true,
boolSchema
]
};
validate = ajv.compile(schema);
testSchema(validate, valid);
};
}
});
describe('in anyOf', function() {
describe('schema = true', function() {
it('should be valid with any data', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any data', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
anyOf: [
false,
boolSchema
]
};
var validate = ajv.compile(schema);
testSchema(validate, valid);
schema = {
anyOf: [
true,
boolSchema
]
};
validate = ajv.compile(schema);
testSchema(validate, true);
};
}
});
describe('in oneOf', function() {
describe('schema = true', function() {
it('should be valid with any data', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any data', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
oneOf: [
false,
boolSchema
]
};
var validate = ajv.compile(schema);
testSchema(validate, valid);
schema = {
oneOf: [
true,
boolSchema
]
};
validate = ajv.compile(schema);
testSchema(validate, !valid);
};
}
});
describe('in $ref', function() {
describe('schema = true', function() {
it('should be valid with any data', function() {
ajvs.forEach(test(true, true));
});
});
describe('schema = false', function() {
it('should be invalid with any data', function() {
ajvs.forEach(test(false, false));
});
});
function test(boolSchema, valid) {
return function (ajv) {
var schema = {
$ref: '#/definitions/bool',
definitions: {
bool: boolSchema
}
};
var validate = ajv.compile(schema);
testSchema(validate, valid);
};
}
});
function testSchema(validate, valid) {
validate(1) .should.equal(valid);
validate('foo') .should.equal(valid);
validate({}) .should.equal(valid);
validate([]) .should.equal(valid);
validate(true) .should.equal(valid);
validate(false) .should.equal(valid);
validate(null) .should.equal(valid);
}
});