@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
170 lines (140 loc) • 5.95 kB
text/typescript
import { describe, it, expect, vi } from 'vitest'
import { mount } from '@vue/test-utils'
import DatametriaSidebar from '../DatametriaSidebar.vue'
describe('DatametriaSidebar', () => {
it('renders correctly', () => {
const wrapper = mount(DatametriaSidebar)
expect(wrapper.find('.dm-sidebar').exists()).toBe(true)
})
it('applies position classes', () => {
const wrapperLeft = mount(DatametriaSidebar, { props: { position: 'left' } })
expect(wrapperLeft.find('.dm-sidebar--left').exists()).toBe(true)
const wrapperRight = mount(DatametriaSidebar, { props: { position: 'right' } })
expect(wrapperRight.find('.dm-sidebar--right').exists()).toBe(true)
})
it('applies variant classes', () => {
const variants = ['light', 'dark', 'primary'] as const
variants.forEach(variant => {
const wrapper = mount(DatametriaSidebar, { props: { variant } })
expect(wrapper.find(`.dm-sidebar--${variant}`).exists()).toBe(true)
})
})
it('renders header slot', () => {
const wrapper = mount(DatametriaSidebar, {
slots: { header: '<div class="test-header">Header</div>' }
})
expect(wrapper.find('.test-header').exists()).toBe(true)
expect(wrapper.find('.dm-sidebar__header').exists()).toBe(true)
})
it('renders default slot content', () => {
const wrapper = mount(DatametriaSidebar, {
slots: { default: '<div class="test-content">Content</div>' }
})
expect(wrapper.find('.test-content').exists()).toBe(true)
expect(wrapper.find('.dm-sidebar__content').exists()).toBe(true)
})
it('renders footer slot', () => {
const wrapper = mount(DatametriaSidebar, {
slots: { footer: '<div class="test-footer">Footer</div>' }
})
expect(wrapper.find('.test-footer').exists()).toBe(true)
expect(wrapper.find('.dm-sidebar__footer').exists()).toBe(true)
})
it('shows toggle button when collapsible', () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true },
slots: { header: 'Header' }
})
expect(wrapper.find('.dm-sidebar__toggle').exists()).toBe(true)
})
it('hides toggle button when not collapsible', () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: false },
slots: { header: 'Header' }
})
expect(wrapper.find('.dm-sidebar__toggle').exists()).toBe(false)
})
it('toggles open state when toggle button clicked', async () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: true },
slots: { header: 'Header' }
})
expect(wrapper.vm.isOpen).toBe(true)
expect(wrapper.find('.dm-sidebar--collapsed').exists()).toBe(false)
await wrapper.find('.dm-sidebar__toggle').trigger('click')
expect(wrapper.vm.isOpen).toBe(false)
expect(wrapper.find('.dm-sidebar--collapsed').exists()).toBe(true)
await wrapper.find('.dm-sidebar__toggle').trigger('click')
expect(wrapper.vm.isOpen).toBe(true)
})
it('emits toggle event with correct value', async () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: true },
slots: { header: 'Header' }
})
await wrapper.find('.dm-sidebar__toggle').trigger('click')
expect(wrapper.emitted('toggle')).toBeTruthy()
expect(wrapper.emitted('toggle')?.[0]).toEqual([false])
await wrapper.find('.dm-sidebar__toggle').trigger('click')
expect(wrapper.emitted('toggle')?.[1]).toEqual([true])
})
it('emits open event when opening', async () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: false },
slots: { header: 'Header' }
})
await wrapper.find('.dm-sidebar__toggle').trigger('click')
expect(wrapper.emitted('open')).toBeTruthy()
})
it('emits close event when closing', async () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: true },
slots: { header: 'Header' }
})
await wrapper.find('.dm-sidebar__toggle').trigger('click')
expect(wrapper.emitted('close')).toBeTruthy()
})
it('respects defaultOpen prop', () => {
const wrapperOpen = mount(DatametriaSidebar, { props: { defaultOpen: true } })
expect(wrapperOpen.vm.isOpen).toBe(true)
const wrapperClosed = mount(DatametriaSidebar, { props: { defaultOpen: false } })
expect(wrapperClosed.vm.isOpen).toBe(false)
})
it('updates isOpen when defaultOpen prop changes', async () => {
const wrapper = mount(DatametriaSidebar, { props: { defaultOpen: true } })
expect(wrapper.vm.isOpen).toBe(true)
await wrapper.setProps({ defaultOpen: false })
expect(wrapper.vm.isOpen).toBe(false)
})
it('has correct aria attributes', () => {
const wrapper = mount(DatametriaSidebar, {
props: { ariaLabel: 'Test sidebar', defaultOpen: true }
})
const sidebar = wrapper.find('.dm-sidebar')
expect(sidebar.attributes('role')).toBe('complementary')
expect(sidebar.attributes('aria-label')).toBe('Test sidebar')
expect(sidebar.attributes('aria-expanded')).toBe('true')
})
it('exposes toggle method', () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: true }
})
expect(wrapper.vm.isOpen).toBe(true)
wrapper.vm.toggle()
expect(wrapper.vm.isOpen).toBe(false)
wrapper.vm.toggle()
expect(wrapper.vm.isOpen).toBe(true)
})
it('applies collapsed class when closed and collapsible', () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: false }
})
expect(wrapper.find('.dm-sidebar--collapsed').exists()).toBe(true)
})
it('does not apply collapsed class when open', () => {
const wrapper = mount(DatametriaSidebar, {
props: { collapsible: true, defaultOpen: true }
})
expect(wrapper.find('.dm-sidebar--collapsed').exists()).toBe(false)
})
})