From b97f80e4d94e6ed5abe8a6dadb1629712192783c Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 8 Feb 2020 14:10:53 -0500 Subject: Setup GitHub actions --- .github/workflows/nodejs.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/nodejs.yml (limited to '.github') diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 00000000..7c800f85 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,24 @@ +name: Node.js CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build --if-present + - run: npm test + env: + CI: true -- cgit v1.2.3 From f019ab741abdc5ddcb9e5c483d86494c7929d8df Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sun, 16 Feb 2020 21:38:37 -0500 Subject: Update workflow definition --- .github/workflows/ci.yml | 23 +++++++++++++++++++++++ .github/workflows/nodejs.yml | 24 ------------------------ 2 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/nodejs.yml (limited to '.github') diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..40bc005d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,23 @@ +name: CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: '12.x' + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build --if-present + - name: Run tests + run: npm test + env: + CI: true diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml deleted file mode 100644 index 7c800f85..00000000 --- a/.github/workflows/nodejs.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Node.js CI - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [10.x, 12.x] - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm ci - - run: npm run build --if-present - - run: npm test - env: - CI: true -- cgit v1.2.3 From 174d9e7429a0f7a45538e56a594ce627239d80c3 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Mon, 17 Feb 2020 14:20:22 -0500 Subject: Add some basic unit tests for JSON schemas --- .github/workflows/ci.yml | 8 +- package.json | 5 +- test/test-schema.js | 236 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 245 insertions(+), 4 deletions(-) create mode 100644 test/test-schema.js (limited to '.github') 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(); -- cgit v1.2.3