import { describe, it, expect, vi } from 'vitest'; import { mount } from '@vue/test-utils'; import { ref } from 'vue'; import Button from '../Button.vue'; import ButtonGroup from '../ButtonGroup'; vi.mock('../../style/iconfont/index.js'); const AXIOM = 'Tomorrow will be even better'; describe('Button', () => { it('create', () => { const wrapper = mount(Button); const wrapperClasses = expect(wrapper.classes()); expect(wrapperClasses.toContain('coast-button')); expect(wrapperClasses.toContain('coast-button-theme-button')); expect(wrapperClasses.toContain('coast-button-size-normal')); expect(wrapperClasses.toContain('coast-button-level-normal')); }); it('theme', () => { const wrapper = mount(Button, { props: { theme: 'link' } }); expect(wrapper.classes()).toContain('coast-button-theme-link'); }); it('size', () => { const wrapper = mount(Button, { props: { size: 'small' } }); expect(wrapper.classes()).toContain('coast-button-size-small'); }); it('level', () => { const wrapper = mount(Button, { props: { level: 'main' } }); expect(wrapper.classes()).toContain('coast-button-level-main'); }); it('disabled', async () => { const wrapper = mount(Button, { props: { disabled: true } }); expect(wrapper.attributes()).toHaveProperty('disabled'); await wrapper.trigger('click'); expect(wrapper.emitted('click')).toBeUndefined(); }); it('loading implies disabled', async () => { const wrapper = mount(Button, { slots: { default: AXIOM, }, props: { loading: true }, }); await wrapper.trigger('click'); expect(wrapper.emitted('click')).toBeUndefined(); }); it('render text', () => { const wrapper = mount(Button, { slots: { default: AXIOM }, }); expect(wrapper.text()).toEqual(AXIOM); }); it('handle click', async () => { const wrapper = mount(Button, { slots: { default: AXIOM, }, }); await wrapper.trigger('click'); expect(wrapper.emitted()).toBeDefined(); }); it('handle click inside', async () => { const wrapper = mount({ template: ` `, components: { 'co-button': Button, }, setup() { const v = ref(1); const c = () => { v.value++; }; return { c, v }; }, }); const vm = wrapper.vm; (wrapper.element.querySelector('.inner-slot')).click(); expect(vm.v).toEqual(3); expect(wrapper.emitted()).toBeDefined(); }); }); describe('Button Group', () => { const TestComponent = { template: ` Prev Next `, components: { 'co-button-group': ButtonGroup, 'co-button': Button, }, }; it('create', () => { const wrapper = mount(TestComponent); expect(wrapper.classes()).toContain('coast-button-group'); expect(wrapper.findAll('button').length).toBe(2); }); });