2026-05-14 15:26:22 +08:00

114 lines
3.0 KiB
TypeScript

/*
* Tencent is pleased to support the open source community by making TMagicEditor available.
*
* Copyright (C) 2025 Tencent.
*/
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { defineComponent, h } from 'vue';
import { mount } from '@vue/test-utils';
import AddButton from '@editor/layouts/page-bar/AddButton.vue';
const editorService = {
get: vi.fn(),
add: vi.fn(),
};
const uiService = {
get: vi.fn(() => true),
};
vi.mock('@editor/hooks/use-services', () => ({
useServices: () => ({ editorService, uiService }),
}));
vi.mock('@editor/utils/editor', () => ({
generatePageNameByApp: vi.fn(() => 'page_xxx'),
}));
vi.mock('@tmagic/design', () => ({
TMagicPopover: defineComponent({
name: 'FakeTMagicPopover',
setup(_p, { slots }) {
return () => h('div', { class: 'fake-popover' }, [slots.reference?.(), slots.default?.()]);
},
}),
}));
vi.mock('@editor/components/Icon.vue', () => ({
default: defineComponent({
name: 'FakeIcon',
props: ['icon'],
setup() {
return () => h('i', { class: 'fake-icon' });
},
}),
}));
vi.mock('@editor/components/ToolButton.vue', () => ({
default: defineComponent({
name: 'FakeToolButton',
props: ['data'],
setup(props) {
return () =>
h(
'button',
{
class: 'tool-btn',
onClick: () => (props.data as any).handler?.(),
},
(props.data as any).text,
);
},
}),
}));
beforeEach(() => {
vi.clearAllMocks();
uiService.get.mockReturnValue(true);
});
describe('AddButton.vue', () => {
test('显示按钮渲染并支持新增页面', async () => {
editorService.get.mockReturnValue({ items: [] });
const wrapper = mount(AddButton);
const btns = wrapper.findAll('.tool-btn');
expect(btns.length).toBe(2);
await btns[0].trigger('click');
expect(editorService.add).toHaveBeenCalled();
const args = editorService.add.mock.calls[0][0];
expect(args.type).toBe('page');
expect(args.name).toBe('page_xxx');
});
test('点击新增页面片', async () => {
editorService.get.mockReturnValue({ items: [] });
const wrapper = mount(AddButton);
const btns = wrapper.findAll('.tool-btn');
await btns[1].trigger('click');
const args = editorService.add.mock.calls[0][0];
expect(args.type).toBe('page-fragment');
});
test('root 不存在抛错且 add 不会被调用', async () => {
editorService.get.mockReturnValue(null);
const errorHandler = vi.fn();
const wrapper = mount(AddButton, {
global: {
config: {
errorHandler,
},
},
});
await wrapper.findAll('.tool-btn')[0].trigger('click');
expect(errorHandler).toHaveBeenCalled();
expect(editorService.add).not.toHaveBeenCalled();
});
test('showAddPageButton 为 false 时不渲染按钮', () => {
uiService.get.mockReturnValue(false);
const wrapper = mount(AddButton);
expect(wrapper.find('.tool-btn').exists()).toBe(false);
});
});