import { describe, it, expect, beforeAll, afterEach, vi } from 'vitest' import Button from '../../src/bootstrap/button' import { clearFixture, getFixture } from '../helpers/fixture' describe('Button', () => { let fixtureEl: HTMLElement beforeAll(() => { fixtureEl = getFixture() }) afterEach(() => { clearFixture() }) it('should accept element as CSS selector or DOM element', () => { fixtureEl.innerHTML = '' const buttonEl = fixtureEl.querySelector('[data-bs-toggle="button"]')! const buttonBySelector = new Button('[data-bs-toggle="button"]') const buttonByElement = new Button(buttonEl) expect(buttonBySelector._element).toBe(buttonEl) expect(buttonByElement._element).toBe(buttonEl) }) describe('VERSION', () => { it('should return plugin version', () => { expect(typeof Button.VERSION).toBe('string') }) }) describe('DATA_KEY', () => { it('should return plugin data key', () => { expect(Button.DATA_KEY).toBe('bs.button') }) }) describe('data-api', () => { it('should toggle active class on click', () => { fixtureEl.innerHTML = ['', ''].join('') const btn = fixtureEl.querySelector('.btn') as HTMLElement const divTest = fixtureEl.querySelector('.test') as HTMLElement const btnTestParent = fixtureEl.querySelector('.testParent') as HTMLElement expect(btn.classList.contains('active')).toBe(false) btn.click() expect(btn.classList.contains('active')).toBe(true) btn.click() expect(btn.classList.contains('active')).toBe(false) divTest.click() expect(btnTestParent.classList.contains('active')).toBe(true) }) }) describe('toggle', () => { it('should toggle aria-pressed', () => { fixtureEl.innerHTML = '' const btnEl = fixtureEl.querySelector('.btn')! const button = new Button(btnEl) expect(btnEl.getAttribute('aria-pressed')).toBe('false') expect(btnEl.classList.contains('active')).toBe(false) button.toggle() expect(btnEl.getAttribute('aria-pressed')).toBe('true') expect(btnEl.classList.contains('active')).toBe(true) }) }) describe('dispose', () => { it('should dispose a button', () => { fixtureEl.innerHTML = '' const btnEl = fixtureEl.querySelector('.btn')! const button = new Button(btnEl) expect(Button.getInstance(btnEl)).not.toBeNull() button.dispose() expect(Button.getInstance(btnEl)).toBeNull() }) }) describe('data-tblr-toggle', () => { it('should toggle active class via data-tblr-toggle', () => { fixtureEl.innerHTML = '' const btn = fixtureEl.querySelector('.btn') as HTMLElement expect(btn.classList.contains('active')).toBe(false) btn.click() expect(btn.classList.contains('active')).toBe(true) btn.click() expect(btn.classList.contains('active')).toBe(false) }) it('should toggle active on child click with data-tblr-toggle', () => { fixtureEl.innerHTML = '' const inner = fixtureEl.querySelector('.inner') as HTMLElement const btn = fixtureEl.querySelector('.btn') as HTMLElement inner.click() expect(btn.classList.contains('active')).toBe(true) }) }) describe('data-api edge cases', () => { it('should do nothing when closest returns null', () => { fixtureEl.innerHTML = '