UNPKG

@datametria/vue-components

Version:

DATAMETRIA Vue.js 3 Component Library with Multi-Brand Theming - 51 components + 10 composables with theming support, WCAG 2.2 AA, dark mode, responsive system

204 lines (170 loc) 6.57 kB
import { describe, it, expect, vi } from 'vitest' import { mount } from '@vue/test-utils' import DatametriaNavbar from '../DatametriaNavbar.vue' describe('DatametriaNavbar', () => { describe('Renderização', () => { it('renderiza corretamente', () => { const wrapper = mount(DatametriaNavbar) expect(wrapper.find('.dm-navbar').exists()).toBe(true) }) it('renderiza brand text', () => { const wrapper = mount(DatametriaNavbar, { props: { brand: 'DATAMETRIA' } }) expect(wrapper.text()).toContain('DATAMETRIA') }) it('renderiza slot brand customizado', () => { const wrapper = mount(DatametriaNavbar, { slots: { brand: '<div class="custom-brand">Custom</div>' } }) expect(wrapper.find('.custom-brand').exists()).toBe(true) }) it('renderiza slot menu', () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div class="menu-items">Items</div>' } }) expect(wrapper.find('.menu-items').exists()).toBe(true) }) it('renderiza slot actions', () => { const wrapper = mount(DatametriaNavbar, { slots: { actions: '<button>Login</button>' } }) expect(wrapper.find('.dm-navbar__actions').exists()).toBe(true) }) }) describe('Variants', () => { it('aplica variant light por padrão', () => { const wrapper = mount(DatametriaNavbar) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--light') }) it('aplica variant dark', () => { const wrapper = mount(DatametriaNavbar, { props: { variant: 'dark' } }) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--dark') }) it('aplica variant primary', () => { const wrapper = mount(DatametriaNavbar, { props: { variant: 'primary' } }) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--primary') }) it('aplica variant transparent', () => { const wrapper = mount(DatametriaNavbar, { props: { variant: 'transparent' } }) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--transparent') }) }) describe('Props', () => { it('aceita sticky', () => { const wrapper = mount(DatametriaNavbar, { props: { sticky: true } }) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--sticky') }) it('aceita transparent', () => { const wrapper = mount(DatametriaNavbar, { props: { transparent: true } }) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--transparent') }) it('aceita bordered', () => { const wrapper = mount(DatametriaNavbar, { props: { bordered: true } }) expect(wrapper.find('.dm-navbar').classes()).toContain('dm-navbar--bordered') }) it('aceita ariaLabel customizado', () => { const wrapper = mount(DatametriaNavbar, { props: { ariaLabel: 'Custom navigation' } }) expect(wrapper.find('nav').attributes('aria-label')).toBe('Custom navigation') }) }) describe('Mobile Menu', () => { it('mostra toggle quando há slot menu', () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) expect(wrapper.find('.dm-navbar__toggle').exists()).toBe(true) }) it('não mostra toggle quando não há slot menu', () => { const wrapper = mount(DatametriaNavbar) expect(wrapper.find('.dm-navbar__toggle').exists()).toBe(false) }) it('abre menu ao clicar no toggle', async () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) const toggle = wrapper.find('.dm-navbar__toggle') await toggle.trigger('click') expect(wrapper.find('.dm-navbar__menu').classes()).toContain('dm-navbar__menu--open') }) it('fecha menu ao clicar novamente no toggle', async () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) const toggle = wrapper.find('.dm-navbar__toggle') await toggle.trigger('click') await toggle.trigger('click') expect(wrapper.find('.dm-navbar__menu').classes()).not.toContain('dm-navbar__menu--open') }) }) describe('Acessibilidade', () => { it('tem role navigation', () => { const wrapper = mount(DatametriaNavbar) expect(wrapper.find('nav').attributes('role')).toBe('navigation') }) it('tem aria-label padrão', () => { const wrapper = mount(DatametriaNavbar) expect(wrapper.find('nav').attributes('aria-label')).toBe('Main navigation') }) it('toggle tem aria-expanded', () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) expect(wrapper.find('.dm-navbar__toggle').attributes('aria-expanded')).toBe('false') }) it('toggle atualiza aria-expanded quando aberto', async () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) await wrapper.find('.dm-navbar__toggle').trigger('click') expect(wrapper.find('.dm-navbar__toggle').attributes('aria-expanded')).toBe('true') }) it('toggle tem aria-controls', () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) expect(wrapper.find('.dm-navbar__toggle').attributes('aria-controls')).toBe('navbar-menu') }) it('menu tem id correto', () => { const wrapper = mount(DatametriaNavbar, { slots: { menu: '<div>Menu</div>' } }) expect(wrapper.find('.dm-navbar__menu').attributes('id')).toBe('navbar-menu') }) }) describe('Validação', () => { it('valida variant inválido em desenvolvimento', () => { const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) const originalEnv = process.env.NODE_ENV process.env.NODE_ENV = 'development' mount(DatametriaNavbar, { props: { variant: 'invalid' as any } }) expect(consoleSpy).toHaveBeenCalledWith( expect.stringContaining('[DatametriaNavbar] Invalid variant "invalid"') ) process.env.NODE_ENV = originalEnv consoleSpy.mockRestore() }) }) describe('CSS Variables', () => { it('usa CSS Variables padronizadas', () => { const wrapper = mount(DatametriaNavbar) expect(wrapper.find('.dm-navbar').exists()).toBe(true) }) }) })