Skip to content

Commit

Permalink
Merge b23dc1a into ff2c769
Browse files Browse the repository at this point in the history
  • Loading branch information
Blaine Schmeisser committed May 21, 2017
2 parents ff2c769 + b23dc1a commit 6ba7199
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 1 deletion.
1 change: 1 addition & 0 deletions keywords/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module.exports = {
dynamicDefaults: require('./dynamicDefaults'),
'if': require('./if'),
prohibited: require('./prohibited'),
uniqueItemProperties: require('./uniqueItemProperties'),
deepProperties: require('./deepProperties'),
deepRequired: require('./deepRequired'),
formatMinimum: require('./formatMinimum'),
Expand Down
37 changes: 37 additions & 0 deletions keywords/uniqueItemProperties.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
'use strict';

module.exports = function defFunc(ajv) {
defFunc.definition = {
compile: function(keys, parentSchema, it) {
var equal = it.util.equal;
return function(data) {
var keyData = keys.reduce(function (props, key) {
props[key] = [];
return props;
}, {});

var foundCollision = !!data.find(function (item) {
return !!keys.find(function (key) {
var value = item[key];
var foundValue = keyData[key].find(function (storedValue) {
return equal(value, storedValue);
});
if (!foundValue) {
keyData[key].push(value);
return false;
}
return true;
});
});

return !foundCollision;
};
},
metaSchema: {
type: 'array'
}
};

ajv.addKeyword('uniqueItemProperties', defFunc.definition);
return ajv;
};
2 changes: 1 addition & 1 deletion spec/schema-tests.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var defineKeywords = require('..');
var ajvs = [
defineKeywords(getAjv(),
['switch', 'patternRequired', 'formatMinimum', 'formatMaximum',
'if', 'prohibited', 'deepRequired', 'deepProperties', 'select']),
'uniqueItemProperties', 'if', 'prohibited', 'deepRequired', 'deepProperties', 'select']),
defineKeywords(getAjv()),
defineKeywords(getAjv(true)),
defineKeywords(getAjvNoMeta()),
Expand Down
88 changes: 88 additions & 0 deletions spec/tests/uniqueItemProperties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
[
{
"description": "uniqueItemProperties keyword validation with single property",
"schema": {
"type": "array",
"uniqueItemProperties": ["id"]
},
"tests": [
{
"description": "with all unique ids",
"data": [
{ "id": 1 },
{ "id": 2 }, { "id": 3 } ], "valid": true
},
{
"description": "without unique ids",
"data": [
{ "id": 1 },
{ "id": 1 },
{ "id": 3 }
],
"valid": false
},
{
"description": "with all unique object-ids",
"data": [
{ "id": { "_id": 1, "date": 1495213151726 } },
{ "id": { "_id": 2, "date": 1495213151727 } },
{ "id": { "_id": 3, "date": 1495213151728 } }
],
"valid": true
},
{
"description": "without unique object-ids",
"data": [
{ "id": { "_id": 1, "date": 1495213151726 } },
{ "id": { "_id": 1, "date": 1495213151726 } },
{ "id": { "_id": 3, "date": 1495213151728 } }
],
"valid": false
}
]
},
{
"description": "uniqueItemProperties keyword validation with multiple properties",
"schema": {
"type": "array",
"uniqueItemProperties": ["id", "name"]
},
"tests": [
{
"description": "with all unique ids and names",
"data": [
{ "id": 1, "name": "taco" },
{ "id": 2, "name": "burrito" },
{ "id": 3, "name": "salsa" }
],
"valid": true
},
{
"description": "with unique ids but not unique names",
"data": [
{ "id": 1, "name": "taco" },
{ "id": 2, "name": "taco" },
{ "id": 3, "name": "salsa" }
],
"valid": false
}
]
},
{ "description": "uniqueItemProperties keyword validation with no properties",
"schema": {
"type": "array",
"uniqueItemProperties": []
},
"tests": [
{
"description": "with deepEqual like objects",
"data": [
{ "id": 1 },
{ "id": 1 },
{ "id": 1 }
],
"valid": true
}
]
}
]

0 comments on commit 6ba7199

Please sign in to comment.