mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2026-05-15 04:54:12 +00:00
198 lines
5.7 KiB
TypeScript
198 lines
5.7 KiB
TypeScript
/*
|
|
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
*
|
|
* Copyright (C) 2025 Tencent.
|
|
*/
|
|
import { describe, expect, test, vi } from 'vitest';
|
|
import { mount } from '@vue/test-utils';
|
|
|
|
import ToolButton from '@editor/components/ToolButton.vue';
|
|
|
|
const provideServices = () => ({
|
|
global: {
|
|
provide: {
|
|
services: {
|
|
editorService: {},
|
|
uiService: {},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
describe('ToolButton.vue', () => {
|
|
test('display 为 false 时不渲染', () => {
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', display: false, text: 'btn' },
|
|
},
|
|
});
|
|
expect(wrapper.find('.menu-item').exists()).toBe(false);
|
|
});
|
|
|
|
test('data.type=text 时渲染文字', () => {
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'text', text: 'hello' } as any,
|
|
},
|
|
});
|
|
expect(wrapper.text()).toContain('hello');
|
|
});
|
|
|
|
test('data.type=divider 时渲染 divider', () => {
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'divider' } as any,
|
|
},
|
|
});
|
|
expect(wrapper.find('.menu-item').exists()).toBe(true);
|
|
});
|
|
|
|
test('data.type=button 点击触发 handler', async () => {
|
|
const handler = vi.fn();
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', text: 'click', handler } as any,
|
|
eventType: 'click',
|
|
},
|
|
});
|
|
await wrapper.find('.menu-item').trigger('click');
|
|
expect(handler).toHaveBeenCalled();
|
|
});
|
|
|
|
test('display 函数返回 false 时不渲染', () => {
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', display: () => false, text: 'x' } as any,
|
|
},
|
|
});
|
|
expect(wrapper.find('.menu-item').exists()).toBe(false);
|
|
});
|
|
|
|
test('disabled 函数返回 true 时不调用 handler', async () => {
|
|
const handler = vi.fn();
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', text: 'x', disabled: () => true, handler } as any,
|
|
eventType: 'click',
|
|
},
|
|
});
|
|
await wrapper.find('.menu-item').trigger('click');
|
|
expect(handler).not.toHaveBeenCalled();
|
|
});
|
|
|
|
test('eventType=mousedown 仅 mousedown 触发', async () => {
|
|
const handler = vi.fn();
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', text: 'x', handler } as any,
|
|
eventType: 'mousedown',
|
|
},
|
|
});
|
|
await wrapper.find('.menu-item').trigger('click');
|
|
expect(handler).not.toHaveBeenCalled();
|
|
await wrapper.find('.menu-item').trigger('mousedown');
|
|
expect(handler).toHaveBeenCalled();
|
|
});
|
|
|
|
test('eventType=mouseup 仅左键 mouseup 触发', async () => {
|
|
const handler = vi.fn();
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', text: 'x', handler } as any,
|
|
eventType: 'mouseup',
|
|
},
|
|
});
|
|
await wrapper.find('.menu-item').trigger('mouseup', { button: 1 });
|
|
expect(handler).not.toHaveBeenCalled();
|
|
await wrapper.find('.menu-item').trigger('mouseup', { button: 0 });
|
|
expect(handler).toHaveBeenCalled();
|
|
});
|
|
|
|
test('button 含 tooltip 时渲染 tooltip', () => {
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', text: 'x', tooltip: 'tip' } as any,
|
|
},
|
|
});
|
|
expect(wrapper.find('.menu-item').exists()).toBe(true);
|
|
expect(wrapper.text()).toContain('x');
|
|
});
|
|
|
|
test('data.type=dropdown 时渲染下拉菜单', () => {
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: {
|
|
type: 'dropdown',
|
|
text: 'menu',
|
|
items: [{ text: 'item1', handler: vi.fn() }],
|
|
} as any,
|
|
},
|
|
});
|
|
expect(wrapper.find('.menu-item').exists()).toBe(true);
|
|
expect(wrapper.find('.menubar-menu-button').exists()).toBe(true);
|
|
expect(wrapper.text()).toContain('menu');
|
|
});
|
|
|
|
test('data.type=component 时渲染对应组件', () => {
|
|
const fakeComp = {
|
|
name: 'FakeC',
|
|
props: ['v'],
|
|
template: '<div class="custom-comp">{{v}}</div>',
|
|
};
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: {
|
|
type: 'component',
|
|
component: fakeComp,
|
|
props: { v: 'hello' },
|
|
} as any,
|
|
},
|
|
});
|
|
expect(wrapper.find('.custom-comp').exists()).toBe(true);
|
|
expect(wrapper.find('.custom-comp').text()).toBe('hello');
|
|
});
|
|
|
|
test('dropdown 选中调用对应 handler', async () => {
|
|
const handler = vi.fn();
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: {
|
|
type: 'dropdown',
|
|
text: 'menu',
|
|
items: [{ text: 'item1', handler }],
|
|
} as any,
|
|
},
|
|
});
|
|
const dropdown = wrapper.findComponent({ name: 'TMagicDropdown' });
|
|
if (dropdown.exists()) {
|
|
await dropdown.vm.$emit('command', { item: { handler } });
|
|
expect(handler).toHaveBeenCalled();
|
|
}
|
|
});
|
|
|
|
test('disabled 为 boolean 时直接使用', async () => {
|
|
const handler = vi.fn();
|
|
const wrapper = mount(ToolButton as any, {
|
|
...provideServices(),
|
|
props: {
|
|
data: { type: 'button', text: 'x', disabled: true, handler } as any,
|
|
eventType: 'click',
|
|
},
|
|
});
|
|
await wrapper.find('.menu-item').trigger('click');
|
|
expect(handler).not.toHaveBeenCalled();
|
|
});
|
|
});
|