Skip to content

Commit 1380e71

Browse files
committed
Merge pull request formatjs#293 from ericf/functional-tests
Basic Functional Tests
2 parents 709ec34 + 2fd2e58 commit 1380e71

File tree

8 files changed

+178
-12
lines changed

8 files changed

+178
-12
lines changed

.babelrc

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"plugins": [
3+
"transform-es2015-modules-commonjs"
4+
],
5+
"ignore": [
6+
"dist/*.js",
7+
"lib/index.js",
8+
"locale-data/*.js"
9+
]
10+
}

.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
coverage/**/*.js
12
dist/**/*.js
23
examples/**/node_modules/**/*.js
34
examples/**/build/**/*.js

.istanbul.yml

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
instrumentation:
22
excludes:
3+
- dist/*
4+
- lib/*
35
- locale-data/*
46
- src/en.js

package.json

+14-12
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@
4343
"babel-cli": "^6.2.0",
4444
"babel-eslint": "^5.0.0-beta4",
4545
"babel-plugin-react-intl": "^2.0.0",
46+
"babel-plugin-transform-es2015-modules-commonjs": "^6.4.0",
4647
"babel-plugin-transform-es3-member-expression-literals": "^6.3.13",
4748
"babel-plugin-transform-es3-property-literals": "^6.3.13",
4849
"babel-plugin-transform-object-rest-spread": "^6.1.18",
4950
"babel-polyfill": "^6.3.14",
5051
"babel-preset-es2015": "^6.1.18",
51-
"babel-preset-es2015-rollup": "^1.0.0",
52+
"babel-preset-es2015-rollup": "^1.1.1",
5253
"babel-preset-react": "^6.1.18",
5354
"babel-register": "^6.2.0",
5455
"babelify": "^7.2.0",
@@ -71,30 +72,31 @@
7172
"react-addons-test-utils": "^0.14.3",
7273
"react-dom": "^0.14.2",
7374
"rimraf": "^2.4.2",
74-
"rollup": "^0.24.1",
75-
"rollup-plugin-babel": "^2.3.3",
76-
"rollup-plugin-commonjs": "^2.1.0",
75+
"rollup": "^0.25.0",
76+
"rollup-plugin-babel": "^2.3.9",
77+
"rollup-plugin-commonjs": "^2.2.0",
7778
"rollup-plugin-memory": "^1.0.0",
78-
"rollup-plugin-npm": "^1.1.0",
79+
"rollup-plugin-npm": "^1.3.0",
7980
"rollup-plugin-replace": "^1.1.0",
8081
"rollup-plugin-uglify": "^0.1.0",
8182
"serialize-javascript": "^1.1.1",
8283
"superagent": "^1.5.0"
8384
},
8485
"scripts": {
85-
"lint": "eslint src/ test/ scripts/ examples/",
8686
"clean": "rimraf src/en.js coverage/ dist/ lib/ locale-data/",
8787
"build:data": "babel-node scripts/build-data",
8888
"build:lib": "babel-node scripts/build-lib",
8989
"build:dist:dev": "NODE_ENV=development babel-node scripts/build-dist",
9090
"build:dist:prod": "NODE_ENV=production babel-node scripts/build-dist",
9191
"build:dist": "npm run build:dist:dev && npm run build:dist:prod",
9292
"build": "npm run build:data && npm run build:lib && npm run build:dist",
93-
"test:unit": "mocha --compilers js:babel-register --require babel-polyfill --require intl --recursive test/unit/",
94-
"test:unit:cov": "babel-node $(npm bin)/isparta cover --report text --report html node_modules/mocha/bin/_mocha -- --require babel-polyfill --require intl --recursive test/unit/",
95-
"test:unit:watch": "npm run test:unit -- --watch --reporter min",
96-
"test": "npm run test:unit",
97-
"test:cov": "npm run test:unit:cov",
98-
"prepublish": "npm run lint && npm run clean && npm run build && npm test"
93+
"lint": "eslint .",
94+
"test": "mocha --compilers js:babel-register --require babel-polyfill --require intl --recursive test/",
95+
"test:cov": "babel-node $(npm bin)/isparta cover --report text --report html node_modules/mocha/bin/_mocha -- --require babel-polyfill --require intl --recursive test/",
96+
"test:watch": "npm run test -- --watch --reporter min",
97+
"pretest": "npm run lint",
98+
"pretest:cov": "npm run lint",
99+
"preversion": "npm run clean && npm run build && npm run test",
100+
"prepublish": "npm run clean && npm run build"
99101
}
100102
}

test/functional/build.js

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import expect from 'expect';
2+
import * as ReactIntl from '../../src/';
3+
4+
export default function (buildPath) {
5+
describe('build', () => {
6+
it('evaluates', () => {
7+
expect(require(buildPath)).toExist();
8+
});
9+
10+
it('has all React Intl exports', () => {
11+
const ReactIntlBuild = require(buildPath);
12+
13+
Object.keys(ReactIntl).forEach((name) => {
14+
expect(ReactIntlBuild[name]).toBeA(typeof ReactIntl[name]);
15+
});
16+
});
17+
});
18+
}

test/functional/format.js

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import expect from 'expect';
2+
import expectJSX from 'expect-jsx';
3+
import React from 'react';
4+
import {createRenderer} from 'react-addons-test-utils';
5+
6+
expect.extend(expectJSX);
7+
8+
export default function (ReactIntl) {
9+
describe('format', () => {
10+
const {
11+
IntlProvider,
12+
FormattedDate,
13+
FormattedTime,
14+
FormattedRelative,
15+
FormattedNumber,
16+
FormattedMessage,
17+
} = ReactIntl;
18+
19+
let renderer;
20+
let intlProvider;
21+
22+
beforeEach(() => {
23+
renderer = createRenderer();
24+
intlProvider = new IntlProvider({locale: 'en'}, {});
25+
});
26+
27+
it('formats dates', () => {
28+
const date = new Date();
29+
const el = <FormattedDate value={date} month="numeric" />;
30+
31+
renderer.render(el, intlProvider.getChildContext());
32+
expect(renderer.getRenderOutput()).toEqualJSX(
33+
<span>{date.getMonth() + 1}</span>
34+
);
35+
});
36+
37+
it('formats times', () => {
38+
const date = new Date();
39+
const el = <FormattedTime value={date} />;
40+
41+
const hours = date.getHours();
42+
const minutes = date.getMinutes();
43+
44+
renderer.render(el, intlProvider.getChildContext());
45+
expect(renderer.getRenderOutput()).toEqualJSX(
46+
<span>
47+
{`${hours > 12 ? (hours % 12) : hours}:${minutes} ${hours < 12 ? 'AM' : 'PM'}`}
48+
</span>
49+
);
50+
});
51+
52+
it('formats dates relative to "now"', () => {
53+
const now = Date.now();
54+
const el = <FormattedRelative value={now - 1000} initialNow={now} />;
55+
56+
renderer.render(el, intlProvider.getChildContext());
57+
expect(renderer.getRenderOutput()).toEqualJSX(
58+
<span>1 second ago</span>
59+
);
60+
});
61+
62+
it('formats numbers with thousands separators', () => {
63+
const el = <FormattedNumber value={1000} />;
64+
65+
renderer.render(el, intlProvider.getChildContext());
66+
expect(renderer.getRenderOutput()).toEqualJSX(
67+
<span>1,000</span>
68+
);
69+
});
70+
71+
it('formats numbers with decimal separators', () => {
72+
const el = <FormattedNumber value={0.1} minimumFractionDigits={2} />;
73+
74+
renderer.render(el, intlProvider.getChildContext());
75+
expect(renderer.getRenderOutput()).toEqualJSX(
76+
<span>0.10</span>
77+
);
78+
});
79+
80+
it('pluralizes labels in strings', () => {
81+
const el = (
82+
<FormattedMessage
83+
id="num_emails"
84+
defaultMessage="You have {emails, plural, one {# email} other {# emails}}."
85+
values={{
86+
emails: 1000,
87+
}}
88+
/>
89+
);
90+
91+
renderer.render(el, intlProvider.getChildContext());
92+
expect(renderer.getRenderOutput()).toEqualJSX(
93+
<span>You have 1,000 emails.</span>
94+
);
95+
});
96+
});
97+
}

test/functional/index.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import buildTests from './build';
2+
import formatTests from './format';
3+
4+
const builds = {
5+
'ES' : '../../lib/index.es.js',
6+
'CJS' : '../../lib/index.js',
7+
'UMD-dev' : '../../dist/react-intl.js',
8+
'UMD-prod': '../../dist/react-intl.min.js',
9+
};
10+
11+
Object.keys(builds).forEach((name) => {
12+
describe(name, () => {
13+
buildTests(builds[name]);
14+
formatTests(require(builds[name]));
15+
});
16+
});

test/functional/locale-data.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import * as p from 'path';
2+
import expect from 'expect';
3+
import {sync as globSync} from 'glob';
4+
5+
describe('locale data', () => {
6+
it('has generated locale data modules with correct shape', () => {
7+
const localeDataFiles = globSync('./locale-data/*.js');
8+
9+
expect(localeDataFiles.length).toBeGreaterThan(0);
10+
localeDataFiles.forEach((filename) => {
11+
const localeData = require(p.resolve(filename));
12+
13+
expect(localeData).toBeAn('array');
14+
localeData.forEach((locale) => {
15+
expect(locale).toBeAn('object');
16+
expect(locale.locale).toExist();
17+
});
18+
});
19+
});
20+
});

0 commit comments

Comments
 (0)