mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2026-03-01 12:44:37 +00:00
98 lines
2.8 KiB
TypeScript
98 lines
2.8 KiB
TypeScript
import { mount } from '@vue/test-utils'
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
import OsButton from './OsButton.vue'
|
|
|
|
describe('osButton', () => {
|
|
it('renders slot content', () => {
|
|
const wrapper = mount(OsButton, {
|
|
slots: { default: 'Click me' },
|
|
})
|
|
expect(wrapper.text()).toBe('Click me')
|
|
})
|
|
|
|
it('applies default variant classes', () => {
|
|
const wrapper = mount(OsButton)
|
|
expect(wrapper.classes()).toContain('bg-[var(--color-primary)]')
|
|
})
|
|
|
|
it('applies size variant classes', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { size: 'sm' },
|
|
})
|
|
expect(wrapper.classes()).toContain('h-8')
|
|
expect(wrapper.classes()).toContain('text-sm')
|
|
})
|
|
|
|
it('applies variant classes', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { variant: 'danger' },
|
|
})
|
|
expect(wrapper.classes()).toContain('bg-[var(--color-danger)]')
|
|
})
|
|
|
|
it('applies fullWidth class', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { fullWidth: true },
|
|
})
|
|
expect(wrapper.classes()).toContain('w-full')
|
|
})
|
|
|
|
it('merges custom classes', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { class: 'my-custom-class' },
|
|
})
|
|
expect(wrapper.classes()).toContain('my-custom-class')
|
|
})
|
|
|
|
it('sets disabled attribute', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { disabled: true },
|
|
})
|
|
expect(wrapper.attributes('disabled')).toBeDefined()
|
|
})
|
|
|
|
it('sets button type', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { type: 'submit' },
|
|
})
|
|
expect(wrapper.attributes('type')).toBe('submit')
|
|
})
|
|
|
|
it('emits click event', async () => {
|
|
const wrapper = mount(OsButton)
|
|
await wrapper.trigger('click')
|
|
expect(wrapper.emitted('click')).toHaveLength(1)
|
|
})
|
|
|
|
describe('keyboard accessibility', () => {
|
|
it('renders as native button element for keyboard support', () => {
|
|
const wrapper = mount(OsButton)
|
|
// Native button elements have built-in Enter/Space key support
|
|
expect((wrapper.element as HTMLElement).tagName).toBe('BUTTON')
|
|
})
|
|
|
|
it('is focusable by default', () => {
|
|
const wrapper = mount(OsButton)
|
|
// No tabindex=-1 means button is in natural tab order
|
|
expect(wrapper.attributes('tabindex')).toBeUndefined()
|
|
})
|
|
|
|
it('remains focusable when disabled via aria', () => {
|
|
const wrapper = mount(OsButton, {
|
|
props: { disabled: true },
|
|
})
|
|
// Disabled buttons have disabled attribute which browsers handle correctly
|
|
expect(wrapper.attributes('disabled')).toBeDefined()
|
|
})
|
|
|
|
it('can receive focus programmatically', () => {
|
|
const wrapper = mount(OsButton, { attachTo: document.body })
|
|
const button = wrapper.element as HTMLButtonElement
|
|
button.focus()
|
|
expect(document.activeElement).toBe(button)
|
|
wrapper.unmount()
|
|
})
|
|
})
|
|
})
|