1
0
Fork 0
arangodb/js/node/node_modules/joi-to-json-schema/test/transformer_test.js

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);
});
});