ice/packages/rax-compat/tests/hooks.test.tsx

169 lines
3.7 KiB
TypeScript
Raw Permalink Normal View History

Feat/define data loader (#643) * feat: modify dataLoader * feat: add type * feat: add DataLoaderConfig * feat: modify getData to defineDataLoader * chore: remove defineDataLoader * fix: fetcher shoule return promise * fix: loader may be undefined * fix: err loader config * chore: modify example of pha * feat: modify getData * chore: modify type and mofiy options of init * feat: modify fetcher to dataLoaderFetcher and add dataLoaderImport to entry * chore: modify defaultDataLoaderFetcher * chore: load data by route id * feat: modify serverDataLoader and staticDataLoader * feat: add fetcher when route change * fix: deal with window undefined * chore: modify type * feat: try get data from cache * feat: support useData * feat: add defineStaticDataLoader and defineServerDataLoader * chore: modify getData of example * fix: should load data * fix: fix ssg err * fix: fix dataloader for ssg * test: modify env of test * fix: shoule clear cache when route changed * fix: fix renderMode and add defult remder mode * fix: add window * test: add jsdom * test: modify getData to dataLoader * test: modify test of clientApp * test: clear window after each test * test: remove only * test: remove only * chore: modify appear * fix: Try get data from cache when CSR * chore: update lock * chore: remove unused * refactor: data loader (#685) * refactor: set global fetcher * refactor: set global fetcher * fix: should not build react in data loader * fix: test * test: modify test Co-authored-by: 水澜 <shuilan.cj@taobao.com> Co-authored-by: ZeroLing <i@zeroling.com>
2022-11-14 15:59:22 +08:00
/**
* @vitest-environment jsdom
*/
2022-06-28 17:41:05 +08:00
import { expect, it, describe, vi } from 'vitest';
import React from 'react';
import { render, renderHook } from '@testing-library/react';
2022-06-28 17:41:05 +08:00
import {
useState,
useEffect,
useLayoutEffect,
createContext,
useContext,
useCallback,
2022-06-28 17:41:05 +08:00
useRef,
} from '../src/hooks';
describe('hooks', () => {
it('useState', () => {
function App() {
const [state] = useState({ text: 'text' });
2022-06-28 17:41:05 +08:00
expect(state.text).toBe('text');
return <div>{state.text}</div>;
}
render(<App />);
});
2022-07-07 17:56:01 +08:00
it('useState reset value', () => {
2022-07-07 17:09:21 +08:00
function App() {
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
setTimeout(() => {
setLoading(false);
expect(loading).toBe(false);
}, 1);
Feat/define data loader (#643) * feat: modify dataLoader * feat: add type * feat: add DataLoaderConfig * feat: modify getData to defineDataLoader * chore: remove defineDataLoader * fix: fetcher shoule return promise * fix: loader may be undefined * fix: err loader config * chore: modify example of pha * feat: modify getData * chore: modify type and mofiy options of init * feat: modify fetcher to dataLoaderFetcher and add dataLoaderImport to entry * chore: modify defaultDataLoaderFetcher * chore: load data by route id * feat: modify serverDataLoader and staticDataLoader * feat: add fetcher when route change * fix: deal with window undefined * chore: modify type * feat: try get data from cache * feat: support useData * feat: add defineStaticDataLoader and defineServerDataLoader * chore: modify getData of example * fix: should load data * fix: fix ssg err * fix: fix dataloader for ssg * test: modify env of test * fix: shoule clear cache when route changed * fix: fix renderMode and add defult remder mode * fix: add window * test: add jsdom * test: modify getData to dataLoader * test: modify test of clientApp * test: clear window after each test * test: remove only * test: remove only * chore: modify appear * fix: Try get data from cache when CSR * chore: update lock * chore: remove unused * refactor: data loader (#685) * refactor: set global fetcher * refactor: set global fetcher * fix: should not build react in data loader * fix: test * test: modify test Co-authored-by: 水澜 <shuilan.cj@taobao.com> Co-authored-by: ZeroLing <i@zeroling.com>
2022-11-14 15:59:22 +08:00
// Expect useEffect to execute once
// eslint-disable-next-line
2022-07-07 17:09:21 +08:00
}, []);
return <div>{loading ? 'loading...' : 'load end'}</div>;
}
render(<App />);
});
it('useState can be function', () => {
function App() {
const [value] = useState(() => 'useState');
useEffect(() => {
setTimeout(() => {
expect(value).toBe('useState');
}, 1);
// Expect useEffect to execute once
// eslint-disable-next-line
}, []);
return <div>{value}</div>;
}
render(<App />);
});
it('useState update value', () => {
const { result, rerender } = renderHook(() => useState(0));
expect(result.current[0]).toEqual(0);
result.current[1](1);
rerender();
expect(result.current[0]).toEqual(1);
result.current[1]((count) => {
expect(count).toEqual(1);
return count + 10;
});
rerender();
expect(result.current[0]).toEqual(11);
});
2022-06-28 17:41:05 +08:00
it('useEffect', () => {
let useEffectFunc = vi.spyOn({
func: () => {
expect(useEffectFunc).toHaveBeenCalled();
},
}, 'func');
2022-06-28 17:41:05 +08:00
function App() {
2022-07-04 11:24:05 +08:00
useEffect(useEffectFunc, []);
2022-06-28 17:41:05 +08:00
return <div>useEffect</div>;
}
render(<App />);
});
it('useLayoutEffect', () => {
let useEffectFunc = vi.spyOn({
func: () => {
expect(useEffectFunc).toHaveBeenCalled();
},
}, 'func');
2022-06-28 17:41:05 +08:00
function App() {
2022-07-04 11:24:05 +08:00
useLayoutEffect(useEffectFunc, []);
2022-06-28 17:41:05 +08:00
return <div>useEffect</div>;
}
render(<App />);
});
it('useContext', () => {
const Context = createContext({
theme: 'dark',
2022-06-28 17:41:05 +08:00
});
function App() {
const context = useContext(Context);
return <div>{context.theme}</div>;
}
const wrapper = render(<App />);
wrapper.findAllByText('dark').then((res) => {
expect(res.length).toBe(1);
});
2022-06-28 17:41:05 +08:00
});
it('useRef', () => {
function TextInputWithFocusButton() {
const inputEl = useRef(null);
useEffect(() => {
expect(inputEl.current).instanceOf(Element);
});
2022-06-28 17:41:05 +08:00
return (
<>
<input ref={inputEl} type="text" />
</>
2022-06-28 17:41:05 +08:00
);
}
render(<TextInputWithFocusButton />);
});
it('useState x useCallback', () => {
function TextInputWithFocusButton() {
let count = useRef(0);
const [isPassed, setPassed] = useState(false);
const setPassedFalse = useCallback(() => {
setPassed(false);
}, []);
useEffect(() => {
setPassed(true);
}, []);
useEffect(() => {
count.current++;
if (count.current < 10) {
if (count.current % 2) {
expect(isPassed).toBeFalsy();
setPassed(true);
} else {
expect(isPassed).toBeTruthy();
setPassedFalse();
}
}
}, [isPassed, setPassedFalse]);
return <div />;
}
render(<TextInputWithFocusButton />);
});
2022-06-28 17:41:05 +08:00
});