aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-02-17 14:20:22 -0500
committertoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-02-17 14:20:22 -0500
commit174d9e7429a0f7a45538e56a594ce627239d80c3 (patch)
tree449c6132dc792ef7c7fbbe51775dae9616a7cbdb
parent0f46e3a093e7f0c07ad310d8c17e2582bdfd2741 (diff)
Add some basic unit tests for JSON schemas
-rw-r--r--.github/workflows/ci.yml8
-rw-r--r--package.json5
-rw-r--r--test/test-schema.js236
3 files changed, 245 insertions, 4 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 40bc005d..c65d254b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,7 +17,11 @@ jobs:
run: npm ci
- name: Build
run: npm run build --if-present
- - name: Run tests
- run: npm test
+ - name: Lint
+ run: npm run test-lint
+ env:
+ CI: true
+ - name: Tests
+ run: npm run test-code
env:
CI: true
diff --git a/package.json b/package.json
index 8e71de59..b486c25d 100644
--- a/package.json
+++ b/package.json
@@ -6,8 +6,9 @@
"test": "test"
},
"scripts": {
- "test": "npm run test-lint",
- "test-lint": "eslint ."
+ "test": "npm run test-lint && npm run test-code",
+ "test-lint": "eslint .",
+ "test-code": "node ./test/test-schema.js"
},
"repository": {
"type": "git",
diff --git a/test/test-schema.js b/test/test-schema.js
new file mode 100644
index 00000000..2f294e43
--- /dev/null
+++ b/test/test-schema.js
@@ -0,0 +1,236 @@
+const fs = require('fs');
+const path = require('path');
+const assert = require('assert');
+
+const jsonSchemaFileName = path.join(__dirname, '../ext/bg/js/json-schema.js');
+const jsonSchemaFileSource = fs.readFileSync(jsonSchemaFileName, {encoding: 'utf8'});
+const JsonSchema = Function(`'use strict';${jsonSchemaFileSource};return JsonSchema;`)();
+
+
+function testValidate1() {
+ const schema = {
+ allOf: [
+ {
+ type: 'number'
+ },
+ {
+ anyOf: [
+ {minimum: 10, maximum: 100},
+ {minimum: -100, maximum: -10}
+ ]
+ },
+ {
+ oneOf: [
+ {multipleOf: 3},
+ {multipleOf: 5}
+ ]
+ },
+ {
+ not: [
+ {multipleOf: 20}
+ ]
+ }
+ ]
+ };
+
+ const schemaValidate = (value, schema) => {
+ try {
+ JsonSchema.validate(value, schema);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ };
+
+ const jsValidate = (value) => {
+ return (
+ typeof value === 'number' &&
+ (
+ (value >= 10 && value <= 100) ||
+ (value >= -100 && value <= -10)
+ ) &&
+ (
+ (
+ (value % 3 )=== 0 ||
+ (value % 5) === 0
+ ) &&
+ (value % 15) !== 0
+ ) &&
+ (value % 20) !== 0
+ );
+ };
+
+ for (let i = -111; i <= 111; i++) {
+ const actual = schemaValidate(i, schema);
+ const expected = jsValidate(i);
+ assert.strictEqual(actual, expected);
+ }
+}
+
+
+function testGetValidValueOrDefault1() {
+ // Test value defaulting on objects with additionalProperties=false
+ const schema = {
+ type: 'object',
+ required: ['test'],
+ properties: {
+ test: {
+ type: 'string',
+ default: 'default'
+ }
+ },
+ additionalProperties: false
+ };
+
+ const testData = [
+ [
+ void(0),
+ {test: 'default'}
+ ],
+ [
+ null,
+ {test: 'default'}
+ ],
+ [
+ 0,
+ {test: 'default'}
+ ],
+ [
+ '',
+ {test: 'default'}
+ ],
+ [
+ [],
+ {test: 'default'}
+ ],
+ [
+ {},
+ {test: 'default'}
+ ],
+ [
+ {test: 'value'},
+ {test: 'value'}
+ ],
+ [
+ {test2: 'value2'},
+ {test: 'default'}
+ ],
+ [
+ {test: 'value', test2: 'value2'},
+ {test: 'value'}
+ ]
+ ];
+
+ for (const [value, expected] of testData) {
+ const actual = JsonSchema.getValidValueOrDefault(schema, value);
+ assert.deepStrictEqual(actual, expected);
+ }
+}
+
+function testGetValidValueOrDefault2() {
+ // Test value defaulting on objects with additionalProperties=true
+ const schema = {
+ type: 'object',
+ required: ['test'],
+ properties: {
+ test: {
+ type: 'string',
+ default: 'default'
+ }
+ },
+ additionalProperties: true
+ };
+
+ const testData = [
+ [
+ {},
+ {test: 'default'}
+ ],
+ [
+ {test: 'value'},
+ {test: 'value'}
+ ],
+ [
+ {test2: 'value2'},
+ {test: 'default', test2: 'value2'}
+ ],
+ [
+ {test: 'value', test2: 'value2'},
+ {test: 'value', test2: 'value2'}
+ ]
+ ];
+
+ for (const [value, expected] of testData) {
+ const actual = JsonSchema.getValidValueOrDefault(schema, value);
+ assert.deepStrictEqual(actual, expected);
+ }
+}
+
+function testGetValidValueOrDefault3() {
+ // Test value defaulting on objects with additionalProperties={schema}
+ const schema = {
+ type: 'object',
+ required: ['test'],
+ properties: {
+ test: {
+ type: 'string',
+ default: 'default'
+ }
+ },
+ additionalProperties: {
+ type: 'number',
+ default: 10
+ }
+ };
+
+ const testData = [
+ [
+ {},
+ {test: 'default'}
+ ],
+ [
+ {test: 'value'},
+ {test: 'value'}
+ ],
+ [
+ {test2: 'value2'},
+ {test: 'default', test2: 10}
+ ],
+ [
+ {test: 'value', test2: 'value2'},
+ {test: 'value', test2: 10}
+ ],
+ [
+ {test2: 2},
+ {test: 'default', test2: 2}
+ ],
+ [
+ {test: 'value', test2: 2},
+ {test: 'value', test2: 2}
+ ],
+ [
+ {test: 'value', test2: 2, test3: null},
+ {test: 'value', test2: 2, test3: 10}
+ ],
+ [
+ {test: 'value', test2: 2, test3: void(0)},
+ {test: 'value', test2: 2, test3: 10}
+ ]
+ ];
+
+ for (const [value, expected] of testData) {
+ const actual = JsonSchema.getValidValueOrDefault(schema, value);
+ assert.deepStrictEqual(actual, expected);
+ }
+}
+
+
+function main() {
+ testValidate1();
+ testGetValidValueOrDefault1();
+ testGetValidValueOrDefault2();
+ testGetValidValueOrDefault3();
+}
+
+
+main();