amis2/packages/amis/__tests__/renderers/PopOver.test.tsx
sansiro 3afa49c3c3
chore: popOver 单测补充 (#5948)
* chore: popOver 单测补充

* 修改

* 快照修改
2022-12-22 11:06:07 +08:00

278 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 组件名称PopOver 弹出提示
* 单测内容:
* 1. 在 table 中使用
* 2. 触发方式 & 是否显示icon & 标题 & 位置 & 触发条件
* 3. offset 偏移量
* 4. 展示模式和尺寸
*/
import React from 'react';
import {
render,
fireEvent,
cleanup,
waitFor,
getByText
} from '@testing-library/react';
import '../../src';
import {render as amisRender} from '../../src';
import {wait, makeEnv} from '../helper';
import {clearStoresCache} from '../../src';
afterEach(() => {
cleanup();
clearStoresCache();
});
function formatStyleObject(style: string | null, px2number = true) {
if (!style) {
return {};
}
// 去除注释 /* xx */
style = style.replace(/\/\*[^(\*\/)]*\*\//g, '');
const res: any = {};
style.split(';').forEach((item: string) => {
if (!item || !String(item).includes(':')) return;
const [key, value] = item.split(':');
res[String(key).trim()] =
px2number && value.endsWith('px')
? Number(String(value).replace(/px$/, ''))
: String(value).trim();
});
return res;
}
test('Renderer:PopOver in table', async () => {
const {container, rerender, getByText} = render(
amisRender({
type: 'page',
data: {
rows: [
{
engine: '内容一',
hidden: '隐藏内容一'
},
{
engine: '内容二',
hidden: '隐藏内容二'
}
]
},
body: {
type: 'table',
title: '表格1',
source: '$rows',
columns: [
{
name: 'engine',
label: 'Engine',
popOver: '弹出内容:${hidden}'
}
]
}
})
);
const popOverBtn = container.querySelector(
'.cxd-Field--popOverAble .cxd-Field-popOverBtn'
)!;
expect(popOverBtn).toBeInTheDocument();
fireEvent.click(popOverBtn);
await wait(200);
expect(getByText('弹出内容:隐藏内容一')).toBeInTheDocument();
// expect(container).toMatchSnapshot();
});
test('Renderer:PopOver with trigger & showIcon & title & position & popOverEnableOn', async () => {
const {container, rerender, getByText} = render(
amisRender({
type: 'page',
data: {
rows: [
{
engine: '内容一',
version: '1.1',
hidden: '隐藏内容一'
},
{
engine: '内容二',
version: '2.1',
hidden: '隐藏内容二'
}
]
},
body: {
type: 'table',
title: '表格2',
source: '$rows',
columns: [
{
name: 'engine',
label: 'Engine',
width: 100,
popOver: {
position: 'left-top',
body: {
type: 'tpl',
tpl: '弹出内容:${hidden}'
}
},
popOverEnableOn: "this.version == '1.1'"
},
{
name: 'version',
label: 'Version',
width: 100,
popOver: {
trigger: 'hover',
position: 'right-top',
showIcon: false,
title: '标题',
body: {
type: 'tpl',
tpl: '${version}'
}
}
}
]
}
})
);
const btns = container.querySelectorAll(
'.cxd-Field--popOverAble .cxd-Field-popOverBtn'
)!;
expect(btns.length).toBe(1);
fireEvent.click(btns[0]!);
const popOverNode = container.querySelector(
'.cxd-PopOver.cxd-PopOverAble-popover.cxd-PopOver--leftTop'
)!;
expect(popOverNode).toBeInTheDocument();
expect(formatStyleObject(popOverNode!.getAttribute('style'))!.left).toEqual(
0
);
fireEvent.mouseEnter(getByText('1.1'));
await wait(200);
const popOverNode2 = container.querySelector(
'.cxd-PopOver.cxd-PopOverAble-popover.cxd-PopOver--rightTop'
)!;
expect(popOverNode2).toBeInTheDocument();
// expect(
// formatStyleObject(popOverNode2!.getAttribute('style'))!.left
// ).not.toEqual(0);
expect(getByText('标题')).toBeInTheDocument();
// expect(container).toMatchSnapshot();
});
test('Renderer:PopOver with offset', async () => {
const schema = {
name: 'static',
type: 'static',
label: '静态展示',
value: 'static',
popOver: {
body: '我是提示内容'
}
};
const {container, rerender} = render(amisRender(schema));
expect(container).toMatchSnapshot('default');
fireEvent.click(container.querySelector('.cxd-Field-popOverBtn')!);
await wait(200);
expect(container.querySelector('.cxd-PopOver')).toBeInTheDocument();
const noOffsetStyle = formatStyleObject(
container.querySelector('.cxd-PopOver')!.getAttribute('style')
);
expect(container).toMatchSnapshot('show popover no offset');
rerender(
amisRender({
...schema,
popOver: {
...schema.popOver,
offset: {
left: 101,
top: 102
}
}
})
);
await wait(300);
expect(container).toMatchSnapshot('show popover with offset');
const offsetStyle = formatStyleObject(
container.querySelector('.cxd-PopOver')!.getAttribute('style')
);
expect(offsetStyle.left - noOffsetStyle.left).toEqual(101);
expect(offsetStyle.top - noOffsetStyle.top).toEqual(102);
});
test('Renderer:PopOver with mode & size', async () => {
const {container, rerender, baseElement} = render(
amisRender({
name: 'static',
type: 'static',
label: '静态展示',
value: 'static',
popOver: {
mode: 'dialog',
size: 'xl',
body: {
type: 'tpl',
tpl: '弹框内容'
}
}
})
);
fireEvent.click(container.querySelector('.cxd-Field-popOverBtn')!);
await wait(200);
expect(
baseElement.querySelector('.cxd-Modal.cxd-Modal--xl')
).toBeInTheDocument();
fireEvent.click(baseElement.querySelector('.cxd-Modal-close')!);
await wait(300);
rerender(
amisRender({
name: 'static',
type: 'static',
label: '静态展示',
value: 'static',
popOver: {
mode: 'drawer',
size: 'sm',
body: {
type: 'tpl',
tpl: '弹框内容'
}
}
})
);
fireEvent.click(container.querySelector('.cxd-Field-popOverBtn')!);
await wait(200);
expect(
baseElement.querySelector('.cxd-Drawer.cxd-Drawer--sm')
).toBeInTheDocument();
});