From 7c974e65e5878fc367c1a8801dd1fa0dbee36999 Mon Sep 17 00:00:00 2001 From: Alexey Kucherenko Date: Thu, 25 Apr 2019 20:07:55 +0300 Subject: [PATCH 1/2] added tests --- .editorconfig | 13 + .eslintrc | 52 +++ .gitattributes | 5 + .gitignore | 18 ++ .travis.yml | 11 + package.json | 39 ++- spec/helpers/reporter.js | 9 + spec/support/jasmine.json | 11 + spec/tests/qewd-transform-json.spec.js | 428 +++++++++++++++++++++++++ 9 files changed, 577 insertions(+), 9 deletions(-) create mode 100644 .editorconfig create mode 100644 .eslintrc create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 spec/helpers/reporter.js create mode 100644 spec/support/jasmine.json create mode 100644 spec/tests/qewd-transform-json.spec.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f693d5f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = 0 +trim_trailing_whitespace = false diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..7fdd08e --- /dev/null +++ b/.eslintrc @@ -0,0 +1,52 @@ +{ + "parserOptions": { + "ecmaVersion": 2018 + }, + "extends": "eslint:recommended", + "env": { + "jasmine": true, + "node": true, + "es6": true + }, + "rules": { + "no-bitwise": 2, + "camelcase": 0, + "curly": 0, + "guard-for-in": 2, + "wrap-iife": [ + 2, + "any" + ], + "no-use-before-define": [ + 2, + { + "functions": false + } + ], + "new-cap": 2, + "no-caller": 2, + "no-empty": 2, + "no-new": 2, + "quotes": [ + 2, + "single" + ], + "no-undef": 2, + "no-unused-vars": 2, + "operator-linebreak": [ + "error", + "before" + ], + "comma-style": [ + 2, + "last" + ], + "semi": [ + 2, + "always" + ] + }, + "globals": { + "expectAsync": true + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b7ca95b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# JS files must always use LF for tools to work +*.js eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33d8e18 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Mac OS X +.DS_Store + +# Env vars +.env* +!.env.example + +# Node.js +npm-debug.log +node_modules +yarn.lock + +# Sublime Text +*.sublime-* + +# Coverage +.nyc_output +coverage diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..76b93f1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - '11' + - '10' + - '9' + - '8' +script: + - npm run test +after_success: + - npm run coverage + - npm run coveralls diff --git a/package.json b/package.json index 30eed6c..b1d0371 100644 --- a/package.json +++ b/package.json @@ -3,20 +3,41 @@ "version": "1.10.1", "description": "Module for transforming JSON via a template", "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, + "author": "Rob Tweed, M/Gateway Developments Ltd", + "license": "Apache-2.0", "repository": { "type": "git", "url": "git+https://github.com/robtweed/qewd-transform-json.git" }, - "dependencies": { - "traverse": "" - }, - "author": "Rob Tweed, M/Gateway Developments Ltd", - "license": "Apache-2.0", "bugs": { "url": "https://github.com/robtweed/qewd-transform-json/issues" }, - "homepage": "https://github.com/robtweed/qewd-transform-json#readme" + "homepage": "https://github.com/robtweed/qewd-transform-json#readme", + "scripts": { + "lint": "eslint spec --fix", + "test": "jasmine --config=spec/support/jasmine.json", + "coverage": "nyc --reporter=html --reporter=text jasmine --config=spec/support/jasmine.json", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "pre-commit": [ + "lint", + "test" + ], + "nyc": { + "all": true, + "include": [ + "lib/**/*.js" + ] + }, + "dependencies": { + "traverse": "^0.6.6" + }, + "devDependencies": { + "coveralls": "^3.0.3", + "eslint": "^5.16.0", + "jasmine": "^3.4.0", + "jasmine-spec-reporter": "^4.2.1", + "nyc": "^14.0.0", + "pre-commit": "^1.2.2" + } } diff --git a/spec/helpers/reporter.js b/spec/helpers/reporter.js new file mode 100644 index 0000000..c9b655f --- /dev/null +++ b/spec/helpers/reporter.js @@ -0,0 +1,9 @@ +var SpecReporter = require('jasmine-spec-reporter').SpecReporter; + +jasmine.getEnv().clearReporters(); +jasmine.getEnv().addReporter(new SpecReporter({ + spec: { + displayPending: true, + displayStacktrace: true + } +})); diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json new file mode 100644 index 0000000..aeb20e7 --- /dev/null +++ b/spec/support/jasmine.json @@ -0,0 +1,11 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "tests/**/*[sS]pec.js" + ], + "helpers": [ + "helpers/**/*.js" + ], + "stopSpecOnExpectationFailure": false, + "random": false +} diff --git a/spec/tests/qewd-transform-json.spec.js b/spec/tests/qewd-transform-json.spec.js new file mode 100644 index 0000000..601f947 --- /dev/null +++ b/spec/tests/qewd-transform-json.spec.js @@ -0,0 +1,428 @@ +'use strict'; + +const transform = require('../../').transform; + +describe('tests/qewd-transform-json:', () => { + it('transform string interpolation (curly brackets)', () => { + const expected = { + foo: 'quux' + }; + + const template = { + foo: '{{bar}}' + }; + const data = { + bar: 'quux' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (square brackets)', () => { + const expected = { + foo: 'quux' + }; + + const template = { + foo: '{{["bar"]}}' + }; + const data = { + bar: 'quux' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (errors)', () => { + const expected = { + foo: '' + }; + + const template = { + foo: '{{a.b.c}}' + }; + const data = {}; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (undefined)', () => { + const expected = { + foo: '' + }; + + const template = { + foo: '{{bar}}' + }; + const data = {}; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (null)', () => { + const expected = { + foo: '' + }; + + const template = { + foo: '{{bar}}' + }; + const data = { + bar: null + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (number)', () => { + const expected = { + foo: 5 + }; + + const template = { + foo: '{{bar}}' + }; + const data = { + bar: 5 + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (before + number)', () => { + const expected = { + foo: 'before5' + }; + + const template = { + foo: 'before{{bar}}' + }; + const data = { + bar: 5 + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (after + number)', () => { + const expected = { + foo: '5after' + }; + + const template = { + foo: '{{bar}}after' + }; + const data = { + bar: 5 + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform string interpolation (object)', () => { + const expected = { + foo: { + a: 'b' + } + }; + + const template = { + foo: '{{bar}}' + }; + const data = { + bar: { + a: 'b' + } + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform node function', () => { + const expected = { + foo: 'quux' + }; + + const template = { + foo: (x) => x.bar + }; + const data = { + bar: 'quux' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform node function ()', () => { + const expected = {}; + + const template = { + foo: () => '' + }; + const data = { + bar: 'quux' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform array', () => { + const expected = { + foo: [ + { value: 'value1' }, + { value: 'value2' } + ] + }; + + const template = { + foo: [ + '{{bar}}', + { + value: '{{baz}}' + } + ] + }; + const data = { + bar: [ + { baz: 'value1' }, + { baz: 'value2' } + ] + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + xit('transform array (as is)', () => { + const expected = { + foo: [ + { baz: 'value1' }, + { baz: 'value2' } + ] + }; + + const template = { + foo: [ + '{{bar}}' + ] + }; + const data = { + bar: [ + { baz: 'value1' }, + { baz: 'value2' } + ] + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform with array (data not array)', () => { + const expected = { + foo: [] + }; + + const template = { + foo: [ + '{{bar}}', + { + value: '{{baz}}' + } + ] + }; + const data = { + bar: 'not array' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('transform with helpers', () => { + const expected = { + foo: 'quux' + }; + + const template = { + foo: '=> fn()' + }; + const data = {}; + const helpers = { + fn: () => 'quux' + }; + const actual = transform(template, data, helpers); + + expect(actual).toEqual(expected); + }); + + it('transform with helpers ()', () => { + const expected = {}; + + const template = { + foo: '=> fn()' + }; + const data = {}; + const helpers = { + fn: () => '' + }; + const actual = transform(template, data, helpers); + + expect(actual).toEqual(expected); + }); + + it('transform with helpers (args: true)', () => { + const expected = { + foo: true + }; + + const template = { + foo: '=> fn(true)' + }; + const data = {}; + const helpers = { + fn: (x) => x + }; + const actual = transform(template, data, helpers); + + expect(actual).toEqual(expected); + }); + + it('transform with helpers (args: false)', () => { + const expected = { + foo: false + }; + + const template = { + foo: '=> fn(false)' + }; + const data = {}; + const helpers = { + fn: (x) => x + }; + const actual = transform(template, data, helpers); + + expect(actual).toEqual(expected); + }); + + it('transform with helpers (args: "string value")', () => { + const expected = { + foo: 'quux' + }; + + const template = { + foo: '=> fn("quux")' + }; + const data = {}; + const helpers = { + fn: (x) => x + }; + const actual = transform(template, data, helpers); + + expect(actual).toEqual(expected); + }); + + it('transform with helpers (args: \'string value\')', () => { + const expected = { + foo: 'quux' + }; + + const template = { + foo: '=> fn(\'quux\')' + }; + const data = {}; + const helpers = { + fn: (x) => x + }; + const actual = transform(template, data, helpers); + + expect(actual).toEqual(expected); + }); + + describe('#built-in helpers', () => { + it('either', () => { + const expected = { + foo: 'value', + bar: 'zyx' + }; + + const template = { + foo: '=> either(baz, "abc")', + bar: '=> either(quux, "zyx")', + }; + const data = { + baz: 'value' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('getDate', () => { + const template = { + foo: '=> getDate()', + bar: '=> getDate(2019-02-02T01:02:03.000Z)', + }; + const data = {}; + + const actual = transform(template, data); + const now = new Date().getTime(); + + expect(actual.foo.getTime()).toBe(now); + expect(actual.bar.getTime()).toBe(1549069323000); + }); + + it('getTime', () => { + const expected = { + foo: '', + bar: 1546300800000 + }; + + const template = { + foo: '=> getTime()', + bar: '=> getTime(2019-01-01T00:00:00.000Z)', + }; + const data = { + baz: 'value' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + + it('now', () => { + const template = { + foo: '=> now()', + }; + const data = {}; + const actual = transform(template, data); + + expect(actual.foo).toMatch(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/); + }); + + it('removePrefix', () => { + const expected = { + foo: 'test' + }; + const template = { + foo: '=> removePrefix(test, "Practitioner/")', + }; + const data = { + test: 'Practitioner/test' + }; + const actual = transform(template, data); + + expect(actual).toEqual(expected); + }); + }); +}); From 1a788180d12282a819a2d6f7e524e6037a83123e Mon Sep 17 00:00:00 2001 From: Alexey Kucherenko Date: Thu, 25 Apr 2019 20:51:20 +0300 Subject: [PATCH 2/2] misc --- package.json | 3 ++ spec/tests/qewd-transform-json.spec.js | 46 +++++++++++++------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index b1d0371..57ea632 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,9 @@ "all": true, "include": [ "lib/**/*.js" + ], + "exclude": [ + "lib/test.js" ] }, "dependencies": { diff --git a/spec/tests/qewd-transform-json.spec.js b/spec/tests/qewd-transform-json.spec.js index 601f947..7274b37 100644 --- a/spec/tests/qewd-transform-json.spec.js +++ b/spec/tests/qewd-transform-json.spec.js @@ -204,29 +204,29 @@ describe('tests/qewd-transform-json:', () => { expect(actual).toEqual(expected); }); - xit('transform array (as is)', () => { - const expected = { - foo: [ - { baz: 'value1' }, - { baz: 'value2' } - ] - }; - - const template = { - foo: [ - '{{bar}}' - ] - }; - const data = { - bar: [ - { baz: 'value1' }, - { baz: 'value2' } - ] - }; - const actual = transform(template, data); - - expect(actual).toEqual(expected); - }); + // xit('transform array (as is)', () => { + // const expected = { + // foo: [ + // { baz: 'value1' }, + // { baz: 'value2' } + // ] + // }; + + // const template = { + // foo: [ + // '{{bar}}' + // ] + // }; + // const data = { + // bar: [ + // { baz: 'value1' }, + // { baz: 'value2' } + // ] + // }; + // const actual = transform(template, data); + + // expect(actual).toEqual(expected); + // }); it('transform with array (data not array)', () => { const expected = {