sirenlint
Version:
A lint tool for validating Siren (http://sirenspec.org).
555 lines (459 loc) • 13.4 kB
JavaScript
var test = require('tape');
var ERRORS = require('../errors');
var WARNINGS = require('../warnings');
var validate = require('../validate');
function errors(results) {
return results.filter(function(r) {
return r instanceof validate.ValidationError;
});
}
function warnings(results) {
return results.filter(function(r) {
return r instanceof validate.ValidationWarning;
});
}
test('invalid json', function(t) {
var invalid = '{"}';
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message.split(',')[0], ERRORS.INVALID_JSON);
t.deepEqual(results[0].segments, []);
t.equal(results[0].value, invalid);
t.end();
});
test('root class is not array', function(t) {
var invalid = JSON.stringify({
class: true,
links: [{ rel: ['self'], href: '' }]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.CLASSES_NOT_ARRAY);
t.deepEqual(results[0].segments, ['class']);
t.equal(results[0].value, true);
t.end();
});
test('root class has invalid item', function(t) {
var invalid = JSON.stringify({
class: ['a', 'b', 3],
links: [{ rel: ['self'], href: '' }]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.CLASS_NOT_STRING);
t.deepEqual(results[0].segments, ['class', 2]);
t.equal(results[0].value, 3);
t.end();
});
test('root properties is not an object', function(t) {
var invalid = JSON.stringify({
properties: [12345],
links: [{ rel: ['self'], href: '' }]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.PROPERTIES_NOT_OBJECT);
t.deepEqual(results[0].segments, ['properties']);
t.deepEqual(results[0].value, [12345]);
t.end();
});
test('root sub-entities is an array', function(t) {
var invalid = JSON.stringify({
entities: {},
links: [ { rel: ['self'], href: '' } ]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.SUB_ENTITIES_NOT_ARRAY);
t.deepEqual(results[0].segments, ['entities']);
t.deepEqual(results[0].value, {});
t.end();
});
test('root sub-entity is missing rel attribute', function(t) {
var invalid = JSON.stringify({
entities: [
{ rel: ['self'] }, {}
],
links: [ { rel: ['self'], href: '' } ]
});
var results = validate(invalid);
results = errors(validate(invalid));
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.SUB_ENTITY_MISSING_REL);
t.deepEqual(results[0].segments, ['entities', 1]);
t.deepEqual(results[0].value, {});
t.end();
});
test('root links attribute is not an array', function(t) {
var invalid = JSON.stringify({
links: {}
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINKS_NOT_ARRAY);
t.deepEqual(results[0].segments, ['links']);
t.deepEqual(results[0].value, {});
t.end();
});
test('root links item has invalid class', function(t) {
var invalid = JSON.stringify({
links: [{
class: 0,
rel: ['self'],
href: 'http://example.com'
}]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.CLASSES_NOT_ARRAY);
t.deepEqual(results[0].segments, ['links', 0, 'class']);
t.equal(results[0].value, 0);
t.end();
});
test('root links item is missing rel', function(t) {
var invalid = JSON.stringify({
links: [{
href: 'http://example.com'
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_MISSING_REL);
t.deepEqual(results[0].segments, ['links', 0]);
t.deepEqual(results[0].value, { href: 'http://example.com' });
t.end();
});
test('root links item rel is not an array', function(t) {
var invalid = JSON.stringify({
links: [{
href: 'http://example.com',
rel: null
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_RELS_NOT_ARRAY);
t.deepEqual(results[0].segments, ['links', 0, 'rel']);
t.deepEqual(results[0].value, { href: 'http://example.com', rel: null });
t.end();
});
test('root links item rel item is not a string', function(t) {
var invalid = JSON.stringify({
links: [{
href: 'http://example.com',
rel: ['self', 0]
}]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_REL_NOT_STRING);
t.deepEqual(results[0].segments, ['links', 0, 'rel', 1]);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root links item href is missing', function(t) {
var invalid = JSON.stringify({
links: [{
rel: ['self']
}]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_MISSING_HREF);
t.deepEqual(results[0].segments, ['links', 0]);
t.deepEqual(results[0].value, { rel: ['self'] });
t.end();
});
test('root links item href is not a string', function(t) {
var invalid = JSON.stringify({
links: [{
href: null,
rel: ['self']
}]
});
var results = validate(invalid);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_HREF_NOT_STRING);
t.deepEqual(results[0].segments, ['links', 0, 'href']);
t.equal(results[0].value, null);
t.end();
});
test('root links item type is not a string', function(t) {
var invalid = JSON.stringify({
links: [{
type: 0,
rel: ['self'],
href: ''
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_TYPE_NOT_STRING);
t.deepEqual(results[0].segments, ['links', 0, 'type']);
t.equal(results[0].value, 0);
t.end();
});
test('root links item title is not a string', function(t) {
var invalid = JSON.stringify({
links: [{
title: 0,
rel: ['self'],
href: ''
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_TITLE_NOT_STRING);
t.deepEqual(results[0].segments, ['links', 0, 'title']);
t.equal(results[0].value, 0);
t.end();
});
test('root is missing self link', function(t) {
var invalid = JSON.stringify({
links: [{
rel: ['item'],
href: ''
}]
});
var results = validate(invalid);
results = warnings(results);
t.equal(results.length, 1);
t.equal(results[0].message, WARNINGS.MISSING_SELF_LINK);
t.deepEqual(results[0].segments, ['links']);
t.end();
});
test('root actions attribute is not an array', function(t) {
var invalid = JSON.stringify({
actions: {}
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTIONS_NOT_ARRAY);
t.deepEqual(results[0].segments, ['actions']);
t.deepEqual(results[0].value, {});
t.end();
});
test('root action is missing name', function(t) {
var invalid = JSON.stringify({
actions: [{
href: ''
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_MISSING_NAME);
t.deepEqual(results[0].segments, ['actions', 0]);
t.deepEqual(results[0].value, { href: '' });
t.end();
});
test('root action name is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 0,
href: ''
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_NAME_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'name']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action method is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
method: 0,
href: ''
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_METHOD_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'method']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action is missing href', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip'
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_MISSING_HREF);
t.deepEqual(results[0].segments, ['actions', 0]);
t.deepEqual(results[0].value, { name: 'zip' });
t.end();
});
test('root action href is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: 0
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_HREF_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'href']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action title is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
title: 0
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_TITLE_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'title']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action type is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
type: 0
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_TYPE_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'type']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action fields is not an array', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
fields: 0
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_FIELDS_NOT_ARRAY);
t.deepEqual(results[0].segments, ['actions', 0, 'fields']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action field is missing name', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
fields: [{}]
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_FIELD_MISSING_NAME);
t.deepEqual(results[0].segments, ['actions', 0, 'fields', 0]);
t.deepEqual(results[0].value, {});
t.end();
});
test('root action field name is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
fields: [{ name: 0 }]
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_FIELD_NAME_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'fields', 0, 'name']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action field title is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
fields: [{ name: 'a', title: 0 }]
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_FIELD_TITLE_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'fields', 0, 'title']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action field type is not a string', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
fields: [{ name: 'a', type: 0 }]
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.ACTION_FIELD_TYPE_NOT_STRING);
t.deepEqual(results[0].segments, ['actions', 0, 'fields', 0, 'type']);
t.deepEqual(results[0].value, 0);
t.end();
});
test('root action field type is unknown', function(t) {
var invalid = JSON.stringify({
actions: [{
name: 'zip',
href: '',
fields: [{ name: 'a', type: 'mystery' }]
}],
links: [{ rel: ['self'], href: '' }]
});
var results = validate(invalid);
results = warnings(results);
t.equal(results.length, 1);
t.equal(results[0].message, WARNINGS.UNKNOWN_FIELD);
t.deepEqual(results[0].segments, ['actions', 0, 'fields', 0, 'type']);
t.deepEqual(results[0].value, 'mystery');
t.end();
});
test('root links item rel is empty', function(t) {
var invalid = JSON.stringify({
links: [{
href: 'http://example.com',
rel: []
}]
});
var results = validate(invalid);
results = errors(results);
t.equal(results.length, 1);
t.equal(results[0].message, ERRORS.LINK_REL_IS_EMPTY);
t.deepEqual(results[0].segments, ['links', 0, 'rel']);
t.deepEqual(results[0].value, []);
t.end();
});