-
-
Notifications
You must be signed in to change notification settings - Fork 2k
/
useContext.jsx
122 lines (104 loc) · 3.2 KB
/
useContext.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import React from 'react';
import { expect } from 'chai';
import {
describeIf,
itIf,
} from '../../_helpers';
import {
useContext,
useState,
createContext,
} from '../../_helpers/react-compat';
export default function describeUseContext({
hasHooks,
Wrap,
isShallow,
}) {
describeIf(hasHooks, 'hooks: useContext', () => {
describe('simple example', () => {
const initialTitle = 'initialTitle';
const TitleContext = createContext && createContext(initialTitle);
function UiComponent() {
const title = useContext(TitleContext);
return (
<div>
{title}
</div>
);
}
const customTitle = 'CustomTitle';
function App() {
return (
<TitleContext.Provider value={customTitle}>
<UiComponent />
</TitleContext.Provider>
);
}
it('render ui component with initial context value', () => {
const wrapper = Wrap(<UiComponent />);
expect(wrapper.text()).to.equal(initialTitle);
});
// TODO: useContext: enable when shallow dive supports createContext
itIf(!isShallow, 'render ui component with value from outer provider', () => {
const wrapper = Wrap(<App />);
const subWrapper = isShallow ? wrapper.dive().dive() : wrapper;
expect(subWrapper.text()).to.equal(customTitle);
});
});
// TODO: useContext: enable when shallow dive supports createContext
describeIf(!isShallow, 'useContext: with Setting', () => {
const initialState = 10;
const context = createContext && createContext(null);
function MyGrandChild() {
const myContextVal = useContext(context);
const increment = () => {
myContextVal.setState(myContextVal.state + 1);
};
return (
<div>
<button type="button" onClick={increment}>increment</button>
<span className="grandChildState">
{myContextVal.state}
</span>
</div>
);
}
function MyChild() {
return (
<div>
<MyGrandChild />
</div>
);
}
function App() {
const [state, setState] = useState(initialState);
return (
<context.Provider value={{ state, setState }}>
<div>
<MyChild />
</div>
</context.Provider>
);
}
it('test render, get and set context value ', () => {
const wrapper = Wrap(<App />);
function getChild() {
const child = wrapper.find(MyChild);
return isShallow ? child.dive() : child;
}
function getGrandChild() {
const grandchild = getChild().find(MyGrandChild);
return isShallow ? grandchild.dive() : grandchild;
}
expect(getGrandChild().find('.grandChildState').debug()).to.equal(`<span className="grandChildState">
${String(initialState)}
</span>`);
getGrandChild().find('button').props().onClick();
wrapper.update();
expect(getGrandChild().find('.grandChildState').debug()).to.equal(`<span className="grandChildState">
${String(initialState + 1)}
</span>`);
});
});
});
}