Skip to content

Commit

Permalink
[Tests] useContext
Browse files Browse the repository at this point in the history
  • Loading branch information
Gangwani, Pawan authored and ljharb committed Mar 17, 2019
1 parent 39676a0 commit 839005c
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/enzyme-test-suite/test/ReactWrapper-spec.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1047,6 +1047,7 @@ describeWithDOM('mount', () => {
describeHooks(
{ Wrap, Wrapper },
'useCallback',
'useContext',
'useEffect',
'useLayoutEffect',
'useMemo',
Expand Down
1 change: 1 addition & 0 deletions packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1228,6 +1228,7 @@ describe('shallow', () => {
describeHooks(
{ Wrap, Wrapper },
'useCallback',
'useContext',
'useEffect',
'useLayoutEffect',
'useMemo',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {

import {
useCallback,
useContext,
useEffect,
useLayoutEffect,
useMemo,
Expand Down
122 changes: 122 additions & 0 deletions packages/enzyme-test-suite/test/shared/hooks/useContext.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,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>`);
});
});
});
}

0 comments on commit 839005c

Please sign in to comment.