From 7ad851241cdf07918a48cb00a4dfcb0f1d8c77c8 Mon Sep 17 00:00:00 2001 From: LIUCHAO <50739490+Tsong-LC@users.noreply.github.com> Date: Sun, 10 Jul 2022 18:40:10 +0800 Subject: [PATCH] refactor(components): [dialog] use JSX in Unit test (#8270) * refactor(components): [dialog] use JSX in Unit test * fix(components): [dialog] fix type error --- .../{dialog.test.ts => dialog.test.tsx} | 310 ++++++++---------- 1 file changed, 141 insertions(+), 169 deletions(-) rename packages/components/dialog/__tests__/{dialog.test.ts => dialog.test.tsx} (63%) diff --git a/packages/components/dialog/__tests__/dialog.test.ts b/packages/components/dialog/__tests__/dialog.test.tsx similarity index 63% rename from packages/components/dialog/__tests__/dialog.test.ts rename to packages/components/dialog/__tests__/dialog.test.tsx index 780c924ec4..2f1a78d748 100644 --- a/packages/components/dialog/__tests__/dialog.test.ts +++ b/packages/components/dialog/__tests__/dialog.test.tsx @@ -7,16 +7,10 @@ import { Delete } from '@element-plus/icons-vue' import Dialog from '../src/dialog.vue' const AXIOM = 'Rem is the best girl' -const defaultSlots = { default: () => AXIOM } describe('Dialog.vue', () => { test('render test', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - }, - }) + const wrapper = mount({AXIOM}) await nextTick() await rAF() @@ -26,44 +20,56 @@ describe('Dialog.vue', () => { test('dialog should have a title and header when it has been given', async () => { const HEADER = 'I am header' - let wrapper = mount(Dialog, { - slots: { - ...defaultSlots, - header: () => HEADER, - }, - props: { - modelValue: true, - }, - }) + const wrapper = mount( + HEADER, + }} + > + {AXIOM} + + ) + await nextTick() expect(wrapper.find('.el-dialog__header').text()).toBe(HEADER) - wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - title: HEADER, - modelValue: true, - }, - }) + mount( + + {AXIOM} + + ) await nextTick() expect(wrapper.find('.el-dialog__header').text()).toBe(HEADER) }) test('dialog header should have slot props', async () => { - const wrapper = mount(Dialog, { - slots: { - ...defaultSlots, - header: ` - - `, - }, - props: { - modelValue: true, - }, - }) + const wrapper = mount( + void + }) => ( + + ) + await nextTick() const headerButton = wrapper.find('button') expect(headerButton.attributes()['data-title-id']).toBeTruthy() @@ -77,28 +83,24 @@ describe('Dialog.vue', () => { }) test('dialog should have a footer when footer has been given', async () => { - const wrapper = mount(Dialog, { - slots: { - ...defaultSlots, - footer: () => AXIOM, - }, - props: { - modelValue: true, - }, - }) + const wrapper = mount( + AXIOM }}> + {AXIOM} + + ) + await nextTick() expect(wrapper.find('.el-dialog__footer').exists()).toBe(true) expect(wrapper.find('.el-dialog__footer').text()).toBe(AXIOM) }) test('should append dialog to body when appendToBody is true', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - appendToBody: true, - modelValue: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) + await nextTick() expect( document.body.firstElementChild!.classList.contains('el-overlay') @@ -107,47 +109,37 @@ describe('Dialog.vue', () => { }) test('should center dialog', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - center: true, - modelValue: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) + await nextTick() expect(wrapper.find('.el-dialog--center').exists()).toBe(true) }) test('should show close button', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - }, - }) + const wrapper = mount({AXIOM}) + await nextTick() expect(wrapper.find('.el-dialog__close').exists()).toBe(true) }) test('should hide close button when showClose = false', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - showClose: false, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) + await nextTick() expect(wrapper.find('.el-dialog__headerbtn').exists()).toBe(false) }) test('should close dialog when click on close button', async () => { - const wrapper = mount(Dialog, { - props: { - modelValue: true, - }, - slots: defaultSlots, - }) + const wrapper = mount({AXIOM}) + await nextTick() await wrapper.find('.el-dialog__headerbtn').trigger('click') expect(wrapper.vm.visible).toBe(false) @@ -155,24 +147,19 @@ describe('Dialog.vue', () => { describe('mask related', () => { test('should not have overlay mask when mask is false', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modal: false, - modelValue: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) + await nextTick() expect(wrapper.find('.el-overlay').exists()).toBe(false) }) test('should close the modal when clicking on mask when `closeOnClickModal` is true', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - }, - }) + const wrapper = mount({AXIOM}) + await nextTick() expect(wrapper.find('.el-overlay').exists()).toBe(true) expect(wrapper.find('.el-overlay-dialog').exists()).toBe(true) @@ -185,13 +172,12 @@ describe('Dialog.vue', () => { describe('life cycles', () => { test('should call before close', async () => { const beforeClose = vi.fn() - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - beforeClose, - modelValue: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) + await nextTick() await wrapper.find('.el-dialog__headerbtn').trigger('click') expect(beforeClose).toHaveBeenCalled() @@ -202,13 +188,11 @@ describe('Dialog.vue', () => { .fn() .mockImplementation((hide: (cancel: boolean) => void) => hide(true)) - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - beforeClose, - modelValue: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) await nextTick() await wrapper.find('.el-dialog__headerbtn').trigger('click') expect(beforeClose).toHaveBeenCalled() @@ -216,14 +200,11 @@ describe('Dialog.vue', () => { }) test('should open and close with delay', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - openDelay: 200, - closeDelay: 200, - modelValue: false, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) expect(wrapper.vm.visible).toBe(false) @@ -233,13 +214,11 @@ describe('Dialog.vue', () => { }) test('should destroy on close', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - destroyOnClose: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) expect(wrapper.vm.visible).toBe(true) await nextTick() await rAF() @@ -260,15 +239,16 @@ describe('Dialog.vue', () => { let visible = true const onClose = vi.fn() const onClosed = vi.fn() - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: visible, - 'onUpdate:modelValue': (val: boolean) => (visible = val), - onClose, - onClosed, - }, - }) + const wrapper = mount( + (visible = val)} + onClose={onClose} + onClosed={onClosed} + > + {AXIOM} + + ) expect(wrapper.vm.visible).toBe(true) await nextTick() @@ -285,13 +265,11 @@ describe('Dialog.vue', () => { }) test('closeIcon', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - closeIcon: markRaw(Delete), - }, - }) + const wrapper = mount( + + {AXIOM} + + ) await nextTick() await rAF() const closeIcon = wrapper.find('svg') @@ -301,13 +279,11 @@ describe('Dialog.vue', () => { }) test('should render draggable prop', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - draggable: true, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) await nextTick() await rAF() @@ -319,13 +295,11 @@ describe('Dialog.vue', () => { describe('accessibility', () => { test('title attribute should set aria-label', async () => { const title = 'Hello World' - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - title, - }, - }) + const wrapper = mount( + + {AXIOM} + + ) await nextTick() const dialog = wrapper.find('[role="dialog"]') expect(dialog.attributes()['aria-label']).toBe(title) @@ -333,19 +307,22 @@ describe('Dialog.vue', () => { }) test('missing title attribute should point to header slot content', async () => { - const wrapper = mount(Dialog, { - slots: { - ...defaultSlots, - header: ` - - `, - }, - props: { - modelValue: true, - }, - }) + const wrapper = mount( +
, + }} + > + {AXIOM} +
+ ) await nextTick() const dialog = wrapper.find('[role="dialog"]') const dialogTitle = wrapper.find('.el-dialog__title') @@ -356,12 +333,7 @@ describe('Dialog.vue', () => { }) test('aria-describedby should point to modal body', async () => { - const wrapper = mount(Dialog, { - slots: defaultSlots, - props: { - modelValue: true, - }, - }) + const wrapper = mount({AXIOM}) await nextTick() const dialog = wrapper.find('[role="dialog"]') const dialogBody = wrapper.find('.el-dialog__body')