ajv/spec/async_schemas.spec.js

119 lines
2.7 KiB
JavaScript

'use strict';
var jsonSchemaTest = require('json-schema-test')
, Promise = require('./promise')
, getAjvInstances = require('./ajv_async_instances')
, Ajv = require('./ajv')
, suite = require('./browser_test_suite')
, after = require('./after_test');
var instances = getAjvInstances({ $data: true });
instances.forEach(addAsyncFormatsAndKeywords);
jsonSchemaTest(instances, {
description: 'asynchronous schemas tests of ' + instances.length + ' ajv instances with different options',
suites: {
'async schemas':
typeof window == 'object'
? suite(require('./async/{**/,}*.json', {mode: 'list'}))
: './async/{**/,}*.json'
},
async: true,
asyncValid: 'data',
assert: require('./chai').assert,
Promise: Promise,
afterError: after.error,
// afterEach: after.each,
cwd: __dirname,
hideFolder: 'async/',
timeout: 90000
});
function addAsyncFormatsAndKeywords (ajv) {
ajv.addFormat('english_word', {
async: true,
validate: checkWordOnServer
});
ajv.addKeyword('idExists', {
async: true,
type: 'number',
validate: checkIdExists,
errors: false
});
ajv.addKeyword('idExistsWithError', {
async: true,
type: 'number',
validate: checkIdExistsWithError,
errors: true
});
ajv.addKeyword('idExistsCompiled', {
async: true,
type: 'number',
compile: compileCheckIdExists
});
}
function checkWordOnServer(str) {
return str == 'tomorrow' ? Promise.resolve(true)
: str == 'manana' ? Promise.resolve(false)
: Promise.reject(new Error('unknown word'));
}
function checkIdExists(schema, data) {
switch (schema.table) {
case 'users': return check([1, 5, 8]);
case 'posts': return check([21, 25, 28]);
default: throw new Error('no such table');
}
function check(IDs) {
return Promise.resolve(IDs.indexOf(data) >= 0);
}
}
function checkIdExistsWithError(schema, data) {
var table = schema.table;
switch (table) {
case 'users': return check(table, [1, 5, 8]);
case 'posts': return check(table, [21, 25, 28]);
default: throw new Error('no such table');
}
function check(_table, IDs) {
if (IDs.indexOf(data) >= 0)
return Promise.resolve(true);
var error = {
keyword: 'idExistsWithError',
message: 'id not found in table ' + _table
};
return Promise.reject(new Ajv.ValidationError([error]));
}
}
function compileCheckIdExists(schema) {
switch (schema.table) {
case 'users': return compileCheck([1, 5, 8]);
case 'posts': return compileCheck([21, 25, 28]);
default: throw new Error('no such table');
}
function compileCheck(IDs) {
return function (data) {
return Promise.resolve(IDs.indexOf(data) >= 0);
};
}
}