Skip to content

Commit 65256f4

Browse files
committed
Add failing test for #118
1 parent 607dc96 commit 65256f4

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

test/components/connect.spec.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,65 @@ describe('React', () => {
11481148
expect(target.props.statefulValue).toEqual(1);
11491149
});
11501150

1151+
it('calls mapState and mapDispatch for impure components', () => {
1152+
const store = createStore(() => ({
1153+
foo: 'foo',
1154+
bar: 'bar'
1155+
}));
1156+
1157+
const mapStateSpy = expect.createSpy();
1158+
const mapDispatchSpy = expect.createSpy().andReturn({});
1159+
1160+
class ImpureComponent extends Component {
1161+
render() {
1162+
return <Passthrough statefulValue={this.props.value} />;
1163+
}
1164+
}
1165+
1166+
const decorator = connect(
1167+
(state, {storeGetter}) => {
1168+
mapStateSpy();
1169+
return {value: state[storeGetter.storeKey]};
1170+
},
1171+
mapDispatchSpy,
1172+
null,
1173+
{ pure: false }
1174+
);
1175+
const Decorated = decorator(ImpureComponent);
1176+
1177+
class StatefulWrapper extends Component {
1178+
state = {
1179+
storeGetter: {storeKey: 'foo'}
1180+
};
1181+
1182+
render() {
1183+
return <Decorated storeGetter={this.state.storeGetter} />;
1184+
};
1185+
}
1186+
1187+
const tree = TestUtils.renderIntoDocument(
1188+
<ProviderMock store={store}>
1189+
<StatefulWrapper />
1190+
</ProviderMock>
1191+
);
1192+
1193+
const target = TestUtils.findRenderedComponentWithType(tree, Passthrough);
1194+
const wrapper = TestUtils.findRenderedComponentWithType(tree, StatefulWrapper);
1195+
1196+
expect(mapStateSpy.calls.length).toBe(2);
1197+
expect(mapDispatchSpy.calls.length).toBe(2);
1198+
expect(target.props.statefulValue).toEqual('foo');
1199+
1200+
// Impure update
1201+
const storeGetter = wrapper.state.storeGetter;
1202+
storeGetter.storeKey = 'bar';
1203+
wrapper.setState({ storeGetter });
1204+
1205+
expect(mapStateSpy.calls.length).toBe(3);
1206+
expect(mapDispatchSpy.calls.length).toBe(3);
1207+
expect(target.props.statefulValue).toEqual('bar');
1208+
});
1209+
11511210
it('should pass state consistently to mapState', () => {
11521211
const store = createStore(stringBuilder);
11531212

0 commit comments

Comments
 (0)