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

90 lines
2.5 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-07-07 17:40:25 +08:00
import { expect, it, describe } from 'vitest';
import React, { forwardRef, useRef, useEffect, Fragment } from 'react';
import { render } from '@testing-library/react';
2022-07-07 17:40:25 +08:00
import { shared } from '../src/index';
import cloneElement from './libs/rax-clone-element';
import createPortal from './libs/rax-create-portal';
import unmountComponentAtNode from './libs/rax-unmount-component-at-node';
2022-07-07 17:40:25 +08:00
describe('shared', () => {
it('base', () => {
expect(typeof shared.Element).toBe('function');
expect(Object.keys(shared.Host).includes('owner')).toBeTruthy();
let node = {};
let instance = {
test: Math.random(),
};
shared.Instance.set(node, instance);
expect(shared.Instance.get(node).test).toBe(instance.test);
2022-07-07 17:40:25 +08:00
expect(shared.flattenChildren).instanceOf(Function);
});
it('create-portal', () => {
const div = document.createElement('div');
document.body.appendChild(div);
const Portal = ({ children }) => {
return createPortal(children, div);
};
const App = () => {
return (<div>
<Portal>portal</Portal>
</div>);
};
render(<App />);
expect(div.childNodes.length).toBe(1);
});
it('unmountComponentAtNode', () => {
const Hello = forwardRef<any, any>(({ name }, ref) => {
return <div><span ref={ref}>{ name }</span></div>;
});
const Hello2 = forwardRef<any, any>(({ name }, ref) => {
const refin = useRef();
const hello = <Hello name={name} ref={refin} />;
useEffect(() => {
expect(refin.current).toBeUndefined();
}, []);
let ele = cloneElement(hello, {
name: `2-${name}`,
ref,
});
return ele;
});
const App = () => {
const parent = useRef<any>();
const ref = useRef<any>();
useEffect(() => {
ref.current.textContent = '123-by-ref';
unmountComponentAtNode(ref.current);
expect(parent.current.textContent).toBe('》《');
}, []);
return (<div ref={parent}>
<Hello2 name="123" ref={ref} />
</div>);
};
render(<App />);
});
it('flattenChildren null', () => {
// @ts-ignore e
expect(shared.flattenChildren(null)).toBe(null);
});
it('flattenChildren common', () => {
expect(shared.flattenChildren(<>div</>)).toStrictEqual(<Fragment>div</Fragment>);
});
it('flattenChildren array', () => {
const children = [[[<>div</>]]];
expect(shared.flattenChildren(children)).toStrictEqual(<Fragment>div</Fragment>);
});
2022-07-07 17:40:25 +08:00
});