From 6078b3be519f2da49d16706ecfddfe3c59af9cbb Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 26 May 2017 18:28:09 -0500 Subject: [PATCH] [tests] move to jest instead of mocha and update npm scripts. add tests for xy-chart chartUtils. --- .eslintrc | 5 +- .gitignore | 1 + package.json | 25 +++- packages/data-table/package.json | 6 +- packages/data-table/test/.eslintrc | 5 - packages/data-table/test/Table.test.js | 7 ++ packages/data-table/test/Table_test.jsx | 10 -- packages/data-table/test/mocha.opts | 3 - packages/xy-chart/package.json | 6 +- packages/xy-chart/src/utils/chartUtils.js | 16 +-- packages/xy-chart/test/XAxis.test.js | 7 ++ packages/xy-chart/test/chartUtils.test.js | 133 ++++++++++++++++++++++ 12 files changed, 190 insertions(+), 34 deletions(-) delete mode 100644 packages/data-table/test/.eslintrc create mode 100644 packages/data-table/test/Table.test.js delete mode 100644 packages/data-table/test/Table_test.jsx delete mode 100644 packages/data-table/test/mocha.opts create mode 100644 packages/xy-chart/test/XAxis.test.js create mode 100644 packages/xy-chart/test/chartUtils.test.js diff --git a/.eslintrc b/.eslintrc index 51dc43ce..64f3c591 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,9 +6,12 @@ "jsx-a11y", "import" ], - "rules": {}, + "rules": { + "react/jsx-filename-extension": 0, + }, "env": { "browser": true, "node": true, + "jest": true, }, } diff --git a/.gitignore b/.gitignore index ed942aa6..132fbc0f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ _gh-pages node_modules *.log /.eslintcache +coverage diff --git a/package.json b/package.json index 3a6da5b5..35fc3c4f 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "lint": "eslint --ignore-path=.eslintignore --ext .js,.jsx ./packages/", "publish": "npm run lint && lerna run test && lerna publish && lerna run gh-pages", - "test": "lerna run test" + "test": "lerna exec npm install && jest" }, "repository": "https://github.com/williaster/data-ui.git", "keywords": [ @@ -21,24 +21,39 @@ "author": "Chris Williams ", "license": "MIT", "devDependencies": { + "babel-jest": "^20.0.3", "babel-polyfill": "^6.23.0", "babel-register": "^6.24.1", - "chai": "^3.5.0", - "chai-enzyme": "^0.5.2", - "enzyme": "^2.7.0", "eslint": "^3.19.0", "eslint-config-airbnb": "^14.1.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-jsx-a11y": "^4.0.0", "eslint-plugin-react": "^6.10.3", + "jest": "^20.0.3", "lerna": "^2.0.0-rc.2", - "mocha": "^3.2.0", "react": "~15.4.2", + "react-addons-test-utils": "^15.5.1", "react-dom": "~15.4.2" }, "peerDependencies": { "lerna": "2.0.0-rc.2", "react": "~15.4.2", "react-dom": "~15.4.2" + }, + "jest": { + "projects": [ + "/packages/*" + ], + "collectCoverage": true, + "coverageDirectory": "/coverage", + "coveragePathIgnorePatterns": [ + "/node_modules/" + ], + "coverageReporters": [ + "text", + "lcov" + ] } } + + diff --git a/packages/data-table/package.json b/packages/data-table/package.json index 6e23deaa..f1ea9c32 100644 --- a/packages/data-table/package.json +++ b/packages/data-table/package.json @@ -7,8 +7,7 @@ "build": "webpack -p --env build && npm run copy-styles", "copy-styles": "cp ./node_modules/react-virtualized/styles.css ./build/styles.css", "dev": "webpack --progress --colors --watch --env dev", - "mocha": "mocha --opts ./test/mocha.opts", - "test": "npm run mocha ./test" + "test": "jest --colors --verbose --coverage" }, "repository": "https://github.com/williaster/data-ui", "keywords": [ @@ -26,11 +25,14 @@ }, "devDependencies": { "babel-core": "^6.24.1", + "babel-jest": "^20.0.3", "babel-loader": "^6.4.1", "babel-plugin-syntax-jsx": "^6.18.0", "babel-preset-airbnb": "^2.2.3", "css-loader": "^0.28.0", + "jest": "^20.0.3", "react": "~15.4.2", + "react-addons-test-utils": "^15.5.1", "react-dom": "~15.4.2", "webpack": "^2.4.1" }, diff --git a/packages/data-table/test/.eslintrc b/packages/data-table/test/.eslintrc deleted file mode 100644 index 04cfba7c..00000000 --- a/packages/data-table/test/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "import/no-extraneous-dependencies": 0 - } -} diff --git a/packages/data-table/test/Table.test.js b/packages/data-table/test/Table.test.js new file mode 100644 index 00000000..6316d0d4 --- /dev/null +++ b/packages/data-table/test/Table.test.js @@ -0,0 +1,7 @@ +import Table from '../src/components/Table'; + +describe('', () => { + test('it should be defined', () => { + expect(Table).toBeDefined(); + }); +}); diff --git a/packages/data-table/test/Table_test.jsx b/packages/data-table/test/Table_test.jsx deleted file mode 100644 index c644caf8..00000000 --- a/packages/data-table/test/Table_test.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import { describe, it } from 'mocha'; -import { expect } from 'chai'; -import Table from '../src/components/Table'; - -describe('Table', () => { - it('is valid element', () => { - expect(React.isValidElement(
)).to.equal(true); - }); -}); diff --git a/packages/data-table/test/mocha.opts b/packages/data-table/test/mocha.opts deleted file mode 100644 index 186d8a7a..00000000 --- a/packages/data-table/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---require babel-polyfill ---compilers js:babel-register,jsx:babel-register ---recursive diff --git a/packages/xy-chart/package.json b/packages/xy-chart/package.json index 9eff98dc..e912d27e 100644 --- a/packages/xy-chart/package.json +++ b/packages/xy-chart/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "webpack -p --env build", "dev": "webpack --progress --colors --watch --env dev", - "test": "echo \"Error: no test specified\" && exit 0" + "test": "jest --colors --verbose --coverage" }, "repository": "https://github.com/williaster/data-ui", "keywords": [ @@ -34,12 +34,16 @@ "prop-types": "^15.5.10" }, "devDependencies": { + "babel-jest": "^20.0.3", "babel-core": "^6.24.1", "babel-loader": "^6.4.1", "babel-plugin-syntax-jsx": "^6.18.0", "babel-preset-airbnb": "^2.2.3", + "enzyme": "^2.8.2", + "jest": "^20.0.3", "react": "~15.4.2", "react-dom": "~15.4.2", + "react-addons-test-utils": "^15.5.1", "webpack": "^2.4.1" }, "peerDependencies": { diff --git a/packages/xy-chart/src/utils/chartUtils.js b/packages/xy-chart/src/utils/chartUtils.js index beb66c86..84542400 100644 --- a/packages/xy-chart/src/utils/chartUtils.js +++ b/packages/xy-chart/src/utils/chartUtils.js @@ -53,12 +53,14 @@ export function collectDataFromChildSeries(children) { const dataByIndex = {}; const dataBySeriesType = {}; Children.forEach(children, (Child, i) => { - const name = componentName(Child); - const { data } = Child.props; - if (data && isSeries(name)) { - dataByIndex[i] = data; - allData = allData.concat(data); - dataBySeriesType[name] = (dataBySeriesType[name] || []).concat(data); + if (Child && Child.props && Child.props.data) { + const name = componentName(Child); + const { data } = Child.props; + if (data && isSeries(name)) { + dataByIndex[i] = data; + allData = allData.concat(data); + dataBySeriesType[name] = (dataBySeriesType[name] || []).concat(data); + } } }); return { dataByIndex, allData, dataBySeriesType }; @@ -73,7 +75,7 @@ export function getScaleForAccessor({ ...rest }) { let domain; - if (type === 'band') { + if (type === 'band' || type === 'ordinal') { domain = allData.map(accessor); } if (type === 'linear' || type === 'time') { diff --git a/packages/xy-chart/test/XAxis.test.js b/packages/xy-chart/test/XAxis.test.js new file mode 100644 index 00000000..e157d238 --- /dev/null +++ b/packages/xy-chart/test/XAxis.test.js @@ -0,0 +1,7 @@ +import { XAxis } from '../src/'; + +describe('', () => { + test('it should be defined', () => { + expect(XAxis).toBeDefined(); + }); +}); diff --git a/packages/xy-chart/test/chartUtils.test.js b/packages/xy-chart/test/chartUtils.test.js new file mode 100644 index 00000000..25110511 --- /dev/null +++ b/packages/xy-chart/test/chartUtils.test.js @@ -0,0 +1,133 @@ +import React from 'react'; +import { BarSeries, LineSeries } from '../src'; + +import { + callOrValue, + getScaleForAccessor, + collectDataFromChildSeries, +} from '../src/utils/chartUtils'; + +describe('collectDataFromChildSeries', () => { + const dummyProps = { xScale: () => {}, yScale: () => {}, label: 'bogus', barWidth: 0 }; + const barData = [{ x: 'bar', y: 123 }]; + const lineData = [{ x: 'line', y: 123 }]; + + const children = [ +
, + , + , + , + null, + ]; + + test('should ignore non-series children', () => { + expect( + collectDataFromChildSeries([,
]).allData, + ).toEqual([]); + }); + + const output = collectDataFromChildSeries(children); + + test('should concatenate all data', () => { + expect(output.allData).toEqual([...barData, ...lineData, ...barData]); + }); + + test('should collect data by Series type', () => { + expect(output.dataBySeriesType).toEqual({ + BarSeries: [...barData, ...barData], + LineSeries: [...lineData], + }); + }); + + test('should collect data by child index', () => { + expect(output.dataByIndex).toEqual({ + 1: barData, + 2: lineData, + 3: barData, + }); + }); +}); + +describe('callOrValue', () => { + test('should return non-functions', () => { + expect(callOrValue(123)).toEqual(123); + expect(callOrValue('123')).toEqual('123'); + expect(callOrValue(['hello'])).toEqual(['hello']); + }); + + test('should call a function', () => { + expect(callOrValue(() => 'abc')).toEqual('abc'); + }); + + test('should pass args to functions', () => { + expect(callOrValue((a, b, c) => `${a}${b}${c}`, 'x', 'y')).toEqual('xyundefined'); + }); +}); + +describe('getScaleForAccessor', () => { + const allData = [ + { date: '2016-01-05', dirtyNum: undefined, num: 124, cat: 'a' }, + { date: '2017-01-05', dirtyNum: -15, num: 500, cat: 'b' }, + { date: '2018-01-05', dirtyNum: 7, num: 50, cat: 'c' }, + { date: '2019-01-05', dirtyNum: null, num: 501, cat: 'z' }, + ]; + + test('should compute date domains', () => { + expect(getScaleForAccessor({ + allData, + accessor: d => new Date(d.date), + type: 'time', + range: [0, 100], + }).domain()).toEqual([ + new Date(allData[0].date), + new Date(allData[allData.length - 1].date), + ]); + }); + + test('should compute date strings domains', () => { + expect(getScaleForAccessor({ + allData, + accessor: d => d.date, + type: 'band', + range: [0, 100], + }).domain()).toEqual(['2016-01-05', '2017-01-05', '2018-01-05', '2019-01-05']); + }); + + test('should compute categorical domains', () => { + expect(getScaleForAccessor({ + allData, + accessor: d => d.cat, + type: 'band', + range: [0, 100], + }).domain()).toEqual(['a', 'b', 'c', 'z']); + }); + + test('should compute numeric domains including zero', () => { + expect(getScaleForAccessor({ + allData, + accessor: d => d.num, + type: 'linear', + range: [0, 100], + }).domain()).toEqual([0, 501]); + }); + + test('should compute numeric domains excluding zero', () => { + expect(getScaleForAccessor({ + allData, + accessor: d => d.num, + type: 'linear', + range: [0, 100], + includeZero: false, + }).domain()).toEqual([50, 501]); + }); + + test('should compute numeric domains with missing values', () => { + expect(getScaleForAccessor({ + allData, + accessor: d => d.dirtyNum, + type: 'linear', + range: [0, 100], + includeZero: false, + }).domain()).toEqual([-15, 7]); + }); +});