mirror of https://gitee.com/bigwinds/arangodb
116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
'use strict';
|
|
|
|
/*
|
|
* Created by raisch on 3/17/15.
|
|
*/
|
|
|
|
/*jshint mocha:true, node:true, bitwise:true, camelcase:false, curly:true, undef:false, unused:false, eqeqeq:true, shadow:true */
|
|
/* global suite, test */
|
|
|
|
//@formatter:off
|
|
var Joi = require('joi'),
|
|
convert = require('../src/index'),
|
|
assert = require('assert'),
|
|
jsonSchema = require('json-schema'),
|
|
_ = require('lodash');
|
|
//@formatter:on
|
|
|
|
/**
|
|
* Throws if schema !== expected or if schema fails to jsonSchema.validate()
|
|
* @param {object} schema
|
|
* @param {object} expected
|
|
*/
|
|
assert.validate = function (schema, expected) {
|
|
var result = jsonSchema.validate(schema);
|
|
assert.deepEqual(schema, expected);
|
|
if ('object' === typeof result && Array.isArray(result.errors) && 0 === result.errors.length) {
|
|
return;
|
|
}
|
|
throw new Error('json-schema validation failed: %s', result.errors.join(','));
|
|
};
|
|
|
|
/**
|
|
* Removes null values from all arrays.
|
|
* @param {object} obj - transformable object
|
|
* @returns {*}
|
|
*/
|
|
var removeNullsFromArrays = function (obj) {
|
|
var result;
|
|
if (_.isArray(obj)) {
|
|
result = [];
|
|
for (var i = 0, len = obj.length; i < len; i++) {
|
|
var val = obj[i];
|
|
if (null !== val) {
|
|
result.push(removeNullsFromArrays(val));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
else if (_.isObject(obj)) {
|
|
result = {};
|
|
_.keys(obj).forEach(function (key) {
|
|
result[key] = removeNullsFromArrays(obj[key]);
|
|
});
|
|
return result;
|
|
}
|
|
else {
|
|
return obj;
|
|
}
|
|
};
|
|
|
|
suite('transform', function () {
|
|
|
|
test('object defaults', function () {
|
|
var joi = Joi.object(),
|
|
transformer = function (obj) {
|
|
obj.additionalProperties = true;
|
|
return obj;
|
|
},
|
|
schema = convert(joi, transformer),
|
|
expected = {
|
|
type: 'object',
|
|
properties: {},
|
|
additionalProperties: true // false
|
|
};
|
|
assert.validate(schema, expected);
|
|
});
|
|
|
|
test('complicated', function () {
|
|
|
|
var joi = Joi.object({
|
|
name: Joi.string().required(),
|
|
options: Joi.alternatives()
|
|
.when('name', {
|
|
is: 'foo',
|
|
then: Joi.alternatives().try([
|
|
Joi.object({
|
|
name: Joi.string().allow([null, '', 'foo']).required(),
|
|
size: Joi.string().valid('2x4').required(),
|
|
value: Joi.string().required()
|
|
}),
|
|
Joi.object({
|
|
name: Joi.string().valid('foo').required(),
|
|
size: Joi.string().valid('4x8').required(),
|
|
value: Joi.number().min(11).max(20).required()
|
|
})
|
|
])
|
|
})
|
|
.when('name', {
|
|
is: 'bar',
|
|
then: Joi.string().regex(/^[a-z]+$/)
|
|
})
|
|
.when('name', {
|
|
is: 'baz',
|
|
then: Joi.string().regex(/^[A-Z]+$/)
|
|
})
|
|
.required()
|
|
}),
|
|
schema = convert(joi, removeNullsFromArrays),
|
|
expected = require('./fixtures/transform.json');
|
|
|
|
|
|
assert.validate(schema, expected);
|
|
});
|
|
|
|
});
|