Skip to content
This repository was archived by the owner on Jan 27, 2019. It is now read-only.

Commit adf65d2

Browse files
committed
Add tests
1 parent 5c2aab4 commit adf65d2

File tree

10 files changed

+1841
-103
lines changed

10 files changed

+1841
-103
lines changed

__mocks__/fileMock.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = 'test-file-stub'

jest-preprocess.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const babelOptions = {
2+
presets: [
3+
'@babel/react',
4+
[
5+
'@babel/env',
6+
{
7+
targets: {
8+
node: 'current',
9+
},
10+
},
11+
],
12+
],
13+
plugins: [
14+
'@babel/plugin-proposal-optional-chaining',
15+
'@babel/plugin-proposal-class-properties',
16+
'babel-plugin-remove-graphql-queries',
17+
],
18+
}
19+
20+
module.exports = require('babel-jest').createTransformer(babelOptions)

jest.config.js

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module.exports = {
2+
transform: {
3+
'^.+\\.jsx?$': '<rootDir>/jest-preprocess.js',
4+
},
5+
testRegex: '/.*(__tests__\\/.*)|(.*(test|spec))\\.jsx?$',
6+
moduleNameMapper: {
7+
'.+\\.(css|styl|less|sass|scss)$': 'identity-obj-proxy',
8+
'.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
9+
'<rootDir>/__mocks__/fileMock.js',
10+
},
11+
testPathIgnorePatterns: ['node_modules', '.cache'],
12+
transformIgnorePatterns: ['node_modules/(?!(gatsby)/)'],
13+
globals: {
14+
__PATH_PREFIX__: '',
15+
},
16+
setupFiles: ['<rootDir>/loadershim.js'],
17+
testURL: 'http://localhost/',
18+
}

loadershim.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
global.___loader = {
2+
enqueue: jest.fn(),
3+
}

package.json

+14-2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,24 @@
1919
"build": "gatsby build",
2020
"develop": "gatsby develop",
2121
"format": "prettier --write '**/*.js'",
22-
"test": "echo \"Error: no test specified\" && exit 1",
22+
"test": "jest",
2323
"deploy": "gatsby build --prefix-paths && gh-pages -d public"
2424
},
2525
"devDependencies": {
26+
"@babel/core": "^7.0.0-beta.55",
27+
"@babel/plugin-proposal-class-properties": "^7.0.0-beta.55",
28+
"@babel/plugin-proposal-optional-chaining": "^7.0.0-beta.55",
29+
"@babel/preset-env": "^7.0.0-beta.55",
30+
"@babel/preset-react": "^7.0.0-beta.55",
31+
"babel-core": "^7.0.0-bridge.0",
32+
"babel-jest": "^23.4.2",
33+
"babel-loader": "^7.1.5",
2634
"gh-pages": "^1.2.0",
27-
"prettier": "^1.13.7"
35+
"identity-obj-proxy": "^3.0.0",
36+
"jest": "^23.4.2",
37+
"prettier": "^1.13.7",
38+
"react-test-renderer": "^16.4.1",
39+
"react-testing-library": "^4.1.5"
2840
},
2941
"repository": {
3042
"type": "git",
+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import React from 'react'
2+
import { render, cleanup, fireEvent } from 'react-testing-library'
3+
import { Provider } from 'unstated'
4+
import CounterContainer from '../../state/CounterContainer'
5+
import Counter from '../counter'
6+
7+
afterEach(cleanup)
8+
9+
test('Counter corectly triggers changes in counterContainer', async () => {
10+
const counterContainer = new CounterContainer()
11+
const { container, getByText } = render(
12+
<Provider inject={[counterContainer]}>
13+
<Counter />
14+
</Provider>
15+
)
16+
17+
await fireEvent(
18+
getByText('+'),
19+
new MouseEvent('click', {
20+
bubbles: true,
21+
cancelable: true,
22+
})
23+
)
24+
expect(counterContainer.state.count).toBe(1)
25+
26+
await fireEvent(
27+
getByText('-'),
28+
new MouseEvent('click', {
29+
bubbles: true,
30+
cancelable: true,
31+
})
32+
)
33+
expect(counterContainer.state.count).toBe(0)
34+
})
35+
36+
test('Counter corectly triggers methods of counterContainer', async () => {
37+
const counterContainer = new CounterContainer()
38+
counterContainer.increment = jest.fn()
39+
counterContainer.decrement = jest.fn()
40+
41+
const { container, getByText } = render(
42+
<Provider inject={[counterContainer]}>
43+
<Counter />
44+
</Provider>
45+
)
46+
47+
await fireEvent(
48+
getByText('+'),
49+
new MouseEvent('click', {
50+
bubbles: true,
51+
cancelable: true,
52+
})
53+
)
54+
55+
expect(counterContainer.increment).toHaveBeenCalledTimes(1)
56+
57+
await fireEvent(
58+
getByText('-'),
59+
new MouseEvent('click', {
60+
bubbles: true,
61+
cancelable: true,
62+
})
63+
)
64+
65+
expect(counterContainer.decrement).toHaveBeenCalledTimes(1)
66+
})

src/components/counter.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import React from 'react'
2+
import { Subscribe } from 'unstated'
3+
import CounterContainer from '../state/CounterContainer'
4+
5+
const Counter = () => (
6+
<Subscribe to={[CounterContainer]}>
7+
{counter => (
8+
<div
9+
style={{
10+
margin: '20px 0 0 0',
11+
padding: '10px 15px',
12+
border: '1px solid black',
13+
display: 'flex',
14+
justifyContent: 'space-around',
15+
}}
16+
>
17+
<button onClick={() => counter.decrement()}>-</button>
18+
<span>Count: {counter.state.count}</span>
19+
<button onClick={() => counter.increment()}>+</button>
20+
</div>
21+
)}
22+
</Subscribe>
23+
)
24+
25+
export default Counter

src/components/layout.js

+2-19
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import React from 'react'
22
import PropTypes from 'prop-types'
33
import Helmet from 'react-helmet'
44
import { StaticQuery, graphql } from 'gatsby'
5-
import { Subscribe } from 'unstated'
6-
import CounterContainer from '../state/CounterContainer'
5+
import Counter from './counter'
76

87
import Header from './header'
98
import './layout.css'
@@ -39,23 +38,7 @@ const Layout = ({ children, data }) => (
3938
>
4039
{children}
4140

42-
<Subscribe to={[CounterContainer]}>
43-
{counter => (
44-
<div
45-
style={{
46-
margin: '20px 0 0 0',
47-
padding: '10px 15px',
48-
border: '1px solid black',
49-
display: 'flex',
50-
justifyContent: 'space-around',
51-
}}
52-
>
53-
<button onClick={() => counter.decrement()}>-</button>
54-
<span>Count: {counter.state.count}</span>
55-
<button onClick={() => counter.increment()}>+</button>
56-
</div>
57-
)}
58-
</Subscribe>
41+
<Counter />
5942
</div>
6043
</>
6144
)}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react'
2+
import { render, cleanup } from 'react-testing-library'
3+
import CounterContainer from '../CounterContainer'
4+
5+
afterEach(cleanup)
6+
7+
test('CounterContainer counts correctly', async () => {
8+
const counterContainer = new CounterContainer()
9+
expect(counterContainer.state.count).toBe(0)
10+
11+
await counterContainer.increment()
12+
expect(counterContainer.state.count).toBe(1)
13+
14+
await counterContainer.decrement()
15+
expect(counterContainer.state.count).toBe(0)
16+
})

0 commit comments

Comments
 (0)