UNPKG

@mozaic-ds/vue

Version:

Mozaic-Vue is the Vue.js implementation of ADEO Design system

146 lines (115 loc) 4.45 kB
import { mount } from '@vue/test-utils'; import { describe, it, expect } from 'vitest'; import MLoader from './MLoader.vue'; describe('MLoader component', () => { it('should render correctly with the given props', () => { const wrapper = mount(MLoader, { props: { size: 's', appearance: 'accent', }, }); expect(wrapper.exists()).toBe(true); const loaderElement = wrapper.find('.mc-loader'); expect(loaderElement.exists()).toBe(true); expect(loaderElement.classes()).toContain('mc-loader--s'); expect(loaderElement.classes()).toContain('mc-loader--accent'); const svg = wrapper.find('svg.mc-loader__icon'); expect(svg.exists()).toBe(true); const circle = wrapper.find('circle.mc-loader__path'); expect(circle.exists()).toBe(true); }); it('changes class based on size prop', async () => { const wrapper = mount(MLoader, { props: { size: 's', }, }); let loader = wrapper.find('.mc-loader'); expect(loader.classes()).toContain('mc-loader--s'); await wrapper.setProps({ size: 'l' }); loader = wrapper.find('.mc-loader'); expect(loader.classes()).toContain('mc-loader--l'); }); it('changes class based on appearance prop', async () => { const wrapper = mount(MLoader, { props: { appearance: 'accent', }, }); let loader = wrapper.find('.mc-loader'); expect(loader.classes()).toContain('mc-loader--accent'); await wrapper.setProps({ appearance: 'inverse' }); loader = wrapper.find('.mc-loader'); expect(loader.classes()).toContain('mc-loader--inverse'); }); it('renders the loader text when text prop is provided', () => { const wrapper = mount(MLoader, { props: { text: 'Loading...', }, }); const textElement = wrapper.find('.mc-loader__text'); expect(textElement.exists()).toBe(true); expect(textElement.text()).toBe('Loading...'); }); it('does not render the loader text when text prop is not provided', () => { const wrapper = mount(MLoader); const textElement = wrapper.find('.mc-loader__text'); expect(textElement.exists()).toBe(false); }); it('sets the correct viewBox based on size prop', async () => { const wrapper = mount(MLoader, { props: { size: 's', }, }); const svg = wrapper.find('svg.mc-loader__icon'); expect(svg.attributes('viewBox')).toBe('0 0 24 24'); await wrapper.setProps({ size: 'l' }); expect(svg.attributes('viewBox')).toBe('0 0 64 64'); }); it('sets the correct circle radius based on size prop', async () => { const wrapper = mount(MLoader, { props: { size: 's', }, }); const circle = wrapper.find('circle.mc-loader__path'); expect(circle.attributes('r')).toBe('6'); await wrapper.setProps({ size: 'l' }); expect(circle.attributes('r')).toBe('19'); }); it('applies mc-loader--text-visible class when text prop is provided', () => { const wrapper = mount(MLoader, { props: { text: 'Loading data...' }, }); const loader = wrapper.find('.mc-loader'); expect(loader.classes()).toContain('mc-loader--text-visible'); }); it('does not apply mc-loader--text-visible class when no text is provided', () => { const wrapper = mount(MLoader); const loader = wrapper.find('.mc-loader'); expect(loader.classes()).not.toContain('mc-loader--text-visible'); }); it('uses default props correctly (appearance=standard, size=m)', () => { const wrapper = mount(MLoader); const loader = wrapper.find('.mc-loader'); expect(loader.classes()).not.toContain('mc-loader--standard'); expect(loader.classes()).not.toContain('mc-loader--m'); const svg = wrapper.find('svg.mc-loader__icon'); expect(svg.attributes('viewBox')).toBe('0 0 32 32'); const circle = wrapper.find('circle.mc-loader__path'); expect(circle.attributes('r')).toBe('9'); }); it('sets correct viewBox for xs size', async () => { const wrapper = mount(MLoader, { props: { size: 'xs' } }); const svg = wrapper.find('svg.mc-loader__icon'); expect(svg.attributes('viewBox')).toBe('0 0 20 20'); }); it('sets correct circle radius for xs size', async () => { const wrapper = mount(MLoader, { props: { size: 'xs' } }); const circle = wrapper.find('circle.mc-loader__path'); expect(circle.attributes('r')).toBe('6'); }); });