kt-template-admin/test/views/qqbot/modules/actions.spec.tsx

86 lines
2.3 KiB
TypeScript

/* eslint-disable vue/one-component-per-file */
import { defineComponent, h, isVNode } from 'vue';
import { describe, expect, it, vi } from 'vitest';
vi.mock('antdv-next', () => ({
Button: defineComponent({
name: 'MockButton',
setup(_, { slots }) {
return () => h('button', slots.default?.());
},
}),
Popconfirm: defineComponent({
name: 'MockPopconfirm',
setup(_, { slots }) {
return () => h('span', slots.default?.());
},
}),
Space: defineComponent({
name: 'MockSpace',
setup(_, { slots }) {
return () => h('div', slots.default?.());
},
}),
}));
describe('qqbot shared action renderer', () => {
it('renders link buttons and preserves action props', async () => {
const { renderQqbotActions } =
await import('@test-source/apps/web-antdv-next/src/views/qqbot/modules/actions');
const TestIcon = defineComponent({
name: 'TestIcon',
setup: () => () => h('i'),
});
const onEdit = vi.fn();
const onDelete = vi.fn();
const vnode = renderQqbotActions([
{
disabled: true,
icon: TestIcon,
key: 'edit',
label: '编辑',
loading: true,
onClick: onEdit,
},
{
confirmText: '确认删除吗?',
danger: true,
key: 'delete',
label: '删除',
onClick: onDelete,
},
]);
expect(isVNode(vnode)).toBe(true);
const children = vnode.children as {
default?: () => unknown[];
};
const actionNodes = children.default?.().flat() as any[];
expect(actionNodes).toHaveLength(2);
const editButton = actionNodes[0].children[0];
expect(editButton.props).toMatchObject({
disabled: true,
loading: true,
size: 'small',
type: 'link',
});
expect(isVNode(editButton.props.icon)).toBe(true);
expect(editButton.props.onClick).toBe(onEdit);
const deleteConfirm = actionNodes[1];
expect(deleteConfirm.props.title).toBe('确认删除吗?');
expect(deleteConfirm.props.onConfirm).toBe(onDelete);
const confirmSlots = deleteConfirm.children as {
default?: () => unknown;
};
const deleteButton = confirmSlots.default?.() as any;
expect(deleteButton.props.danger).toBe(true);
expect(deleteButton.props.onClick).toBeUndefined();
});
});