From 174d9e7429a0f7a45538e56a594ce627239d80c3 Mon Sep 17 00:00:00 2001
From: toasted-nutbread <toasted-nutbread@users.noreply.github.com>
Date: Mon, 17 Feb 2020 14:20:22 -0500
Subject: Add some basic unit tests for JSON schemas

---
 test/test-schema.js | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 236 insertions(+)
 create mode 100644 test/test-schema.js

(limited to 'test')

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();
-- 
cgit v1.2.3