Skip to content

Commit a638ca4

Browse files
committed
test: full test
1 parent e05558a commit a638ca4

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

tests/immutable.test.tsx

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { fireEvent, render } from '@testing-library/react';
2+
import React from 'react';
3+
import { createContext, makeImmutable, responseImmutable, useContext } from '../src';
4+
import { RenderTimer, Value } from './common';
5+
6+
describe('Immutable', () => {
7+
const CountContext = createContext<number>();
8+
9+
describe('makeImmutable', () => {
10+
const Root = ({ children }: { children?: React.ReactNode; trigger?: string }) => {
11+
const [count, setCount] = React.useState(0);
12+
const [selfState, setSelfState] = React.useState(0);
13+
14+
return (
15+
<CountContext.Provider value={count}>
16+
<button id="count" onClick={() => setCount(v => v + 1)} />
17+
<button id="self" onClick={() => setSelfState(v => v + 1)} />
18+
19+
<Value id="count-value" value={count} />
20+
<Value id="self-value" value={selfState} />
21+
22+
{children}
23+
</CountContext.Provider>
24+
);
25+
};
26+
27+
const ImmutableRoot = makeImmutable(Root);
28+
29+
const Raw = () => {
30+
return (
31+
<>
32+
<Value id="value" value={useContext(CountContext)} />
33+
<RenderTimer id="raw" />
34+
</>
35+
);
36+
};
37+
38+
const ImmutableRaw = responseImmutable(Raw);
39+
40+
it('update by outside', () => {
41+
const { container, rerender } = render(
42+
<ImmutableRoot>
43+
<ImmutableRaw />
44+
</ImmutableRoot>,
45+
);
46+
47+
// Mount
48+
expect(container.querySelector('#raw')!.textContent).toEqual('1');
49+
expect(container.querySelector('#value')!.textContent).toEqual('0');
50+
51+
// Update `count`: Full Update
52+
fireEvent.click(container.querySelector('#count'));
53+
expect(container.querySelector('#count-value').textContent).toEqual('1');
54+
expect(container.querySelector('#self-value').textContent).toEqual('0');
55+
56+
expect(container.querySelector('#raw')!.textContent).toEqual('2');
57+
expect(container.querySelector('#value')!.textContent).toEqual('1');
58+
59+
// Update `selfState`: No Update
60+
fireEvent.click(container.querySelector('#self'));
61+
expect(container.querySelector('#count-value').textContent).toEqual('1');
62+
expect(container.querySelector('#self-value').textContent).toEqual('1');
63+
64+
expect(container.querySelector('#raw')!.textContent).toEqual('2');
65+
expect(container.querySelector('#value')!.textContent).toEqual('1');
66+
67+
// Update Root Props: Full Update
68+
rerender(
69+
<ImmutableRoot trigger="yes">
70+
<ImmutableRaw />
71+
</ImmutableRoot>,
72+
);
73+
expect(container.querySelector('#raw')!.textContent).toEqual('3');
74+
expect(container.querySelector('#value')!.textContent).toEqual('1');
75+
});
76+
});
77+
});

0 commit comments

Comments
 (0)