Skip to content

Commit 95fef68

Browse files
committed
Finish basic implementation
1 parent f25e969 commit 95fef68

File tree

11 files changed

+123
-47
lines changed

11 files changed

+123
-47
lines changed

Diff for: src/components/App.js

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ class App extends Component {
2323
<PasswordHelper />
2424

2525
<RubiksCube />
26-
2726
<WidgetContainer />
2827
</div>
2928
)

Diff for: src/components/Widget.js

+23-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
11
import React from 'react'
22

3-
export default (props) => (
4-
<div>
5-
{props.value}
6-
</div>
7-
)
3+
class Widget extends React.Component {
4+
handleInputChange = (event) => {
5+
this.props.onChange(event.target.value)
6+
}
7+
8+
render() {
9+
return (
10+
<div>
11+
<input value={this.props.value} onChange={this.handleInputChange} />
12+
<button onClick={this.props.onReverse}>
13+
Reverse
14+
</button>
15+
</div>
16+
)
17+
}
18+
}
19+
20+
Widget.defaultProps = {
21+
onChange() {},
22+
onReverse() {},
23+
}
24+
25+
export default Widget

Diff for: src/components/Widget.test.js

+25-4
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,30 @@ const factory = (props = {}) => (
99
)
1010

1111
describe('<Widget />', () => {
12-
it('should render "value"', () => {
13-
const value = 'balloon'
14-
const wrapper = shallow(factory({ value }))
15-
expect(wrapper.text()).toBe(value)
12+
fdescribe('<input />', () => {
13+
it('should set value', () => {
14+
const value = 'balloon'
15+
const wrapper = shallow(factory({ value }))
16+
const comp = wrapper.find('input')
17+
expect(comp.prop('value')).toBe(value)
18+
})
19+
20+
it('should trigger "onChange"', () => {
21+
const onChange = jest.fn()
22+
const wrapper = shallow(factory({ onChange }))
23+
const comp = wrapper.find('input')
24+
comp.simulate('change', { target: { value: 'boo!' } })
25+
expect(onChange).toHaveBeenCalledWith('boo!')
26+
})
27+
})
28+
29+
describe('<button />', () => {
30+
it('should trigger "onReverse"', () => {
31+
const onReverse = jest.fn()
32+
const wrapper = shallow(factory({ onReverse }))
33+
const comp = wrapper.find('button')
34+
comp.simulate('click')
35+
expect(onReverse).toHaveBeenCalled()
36+
})
1637
})
1738
})

Diff for: src/containers/WidgetContainer.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
import React from 'react'
22
import { connect } from 'react-redux'
33
import Widget from '../components/Widget'
4+
import { actions } from '../redux/modules/value'
45

56
const WidgetContainer = (props) => (
67
<Widget
7-
value={props.user}
8-
/>
8+
value={props.value}
9+
onChange={props.onChange}
10+
onReverse={props.onReverse}
11+
/>
912
)
1013

11-
const mapStateToProps = (state) => ({
12-
user: state.root.user,
14+
const mapPropsToState = (state) => ({
15+
value: state.value,
1316
})
1417

15-
export default connect(mapStateToProps)(WidgetContainer)
18+
const mapDispatchToProps = {
19+
onChange: actions.change,
20+
onReverse: actions.reverse,
21+
}
22+
23+
export default connect(mapPropsToState, mapDispatchToProps)(WidgetContainer)

Diff for: src/containers/WidgetContainer.test.js

+21-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,26 @@ const factory = (props = {}) => (
99
)
1010

1111
describe('<WidgetContainer />', () => {
12-
it('should render', () => {
13-
shallow(factory())
12+
it('should map "value"', () => {
13+
const value = 'xyz'
14+
const wrapper = shallow(factory({ value }))
15+
const comp = wrapper.find('Widget')
16+
expect(comp.prop('value')).toBe(value)
17+
})
18+
19+
it('should relay "onChange"', () => {
20+
const onChange = jest.fn()
21+
const wrapper = shallow(factory({ onChange }))
22+
const comp = wrapper.find('Widget')
23+
comp.simulate('change', 'blue')
24+
expect(onChange).toHaveBeenCalledWith('blue')
25+
})
26+
27+
it('should relay "onReverse"', () => {
28+
const onReverse = jest.fn()
29+
const wrapper = shallow(factory({ onReverse }))
30+
const comp = wrapper.find('Widget')
31+
comp.simulate('reverse')
32+
expect(onReverse).toHaveBeenCalled()
1433
})
1534
})

Diff for: src/helpers.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import * as helpers from './helpers'
22

33
describe('helpers', () => {
44
it('should reverse a string', () => {
5-
expect(helpers.reverse('aloha')).toBe('ahola')
5+
expect(helpers.reverse('blue')).toBe('eulb')
66
})
77
})

Diff for: src/redux/modules/string.js

-20
This file was deleted.

Diff for: src/redux/modules/string.test.js

-8
This file was deleted.

Diff for: src/redux/modules/value.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import * as helpers from '../../helpers'
2+
3+
const CHANGE = 'value.CHANGE'
4+
const REVERSE = 'value.REVERSE'
5+
6+
export const actions = {
7+
change: (value) => ({ type: CHANGE, value }),
8+
reverse: () => ({ type: REVERSE }),
9+
}
10+
11+
export const reducer = (state = '', action) => {
12+
switch (action.type) {
13+
case CHANGE:
14+
return action.value
15+
16+
case REVERSE:
17+
return helpers.reverse(state)
18+
19+
default:
20+
return state
21+
}
22+
}

Diff for: src/redux/modules/value.test.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { reducer, actions } from './value'
2+
3+
describe('actions/reducer', () => {
4+
it('should handle CHANGE', () => {
5+
const action = actions.change('donk')
6+
expect(reducer('', action)).toEqual('donk')
7+
})
8+
9+
it('should handle REVERSE', () => {
10+
const action = actions.reverse()
11+
expect(reducer('aloha', action)).toEqual('ahola')
12+
})
13+
})

Diff for: src/redux/reducer.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { combineReducers } from 'redux'
22
import { reducer as root } from './modules/root'
3+
import { reducer as value } from './modules/value'
34

4-
export default combineReducers({ root })
5+
export default combineReducers({
6+
root,
7+
value,
8+
})

0 commit comments

Comments
 (0)