UNPKG

@birhaus/test-utils

Version:

BIRHAUS v3.0 Radical Minimalist Testing Framework - Glass morphism validators, generous spacing tests, and v3 component validation utilities

1 lines 32.9 kB
{"version":3,"sources":["../../src/accessibility/AccessibilityValidator.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BIRHAUS Accessibility Validator\n * \n * Comprehensive accessibility testing utilities implementing BIRHAUS Principle #6:\n * \"Accessibility = dignity\"\n * \n * Features:\n * - WCAG AA+ compliance validation\n * - Spanish-first accessibility testing\n * - Color contrast analysis\n * - Keyboard navigation testing\n * - Screen reader compatibility\n * - Focus management validation\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// Accessibility testing APIs often use 'any' for flexibility\n\nimport { axe, toHaveNoViolations } from 'jest-axe'\n// import { screen, within } from '@testing-library/react' // Available for future test extensions\n// import userEvent from '@testing-library/user-event' // Available for future keyboard interaction tests\n\n// Extend Jest matchers\nexpect.extend(toHaveNoViolations)\n\nexport interface AccessibilityViolation {\n type: 'contrast' | 'keyboard' | 'aria' | 'structure' | 'focus' | 'spanish'\n element: Element\n severity: 'minor' | 'moderate' | 'serious' | 'critical'\n message: string\n messageEs: string\n wcagLevel: 'A' | 'AA' | 'AAA'\n wcagCriterion: string\n suggestions: string[]\n birhausPrinciple: number\n}\n\nexport interface AccessibilityTestOptions {\n // WCAG compliance level\n level?: 'A' | 'AA' | 'AAA'\n \n // Test configuration\n includeColorContrast?: boolean\n includeKeyboardNav?: boolean\n includeFocusManagement?: boolean\n includeAriaLabels?: boolean\n includeSpanishLabels?: boolean\n \n // Custom rules\n customRules?: {\n [key: string]: any\n }\n \n // Selectors\n interactiveElements?: string\n spanishElements?: string\n}\n\nexport class AccessibilityValidator {\n private options: Required<AccessibilityTestOptions>\n \n constructor(options: AccessibilityTestOptions = {}) {\n this.options = {\n level: 'AA',\n includeColorContrast: true,\n includeKeyboardNav: true,\n includeFocusManagement: true,\n includeAriaLabels: true,\n includeSpanishLabels: true,\n customRules: {},\n interactiveElements: 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [tabindex]',\n spanishElements: '[data-label-es], [aria-label*=\"es\"], [lang=\"es\"]',\n ...options\n }\n }\n \n /**\n * Run comprehensive accessibility validation\n */\n async validateAll(container: HTMLElement = document.body): Promise<AccessibilityViolation[]> {\n const violations: AccessibilityViolation[] = []\n \n // Run axe-core accessibility tests\n const axeViolations = await this.validateWithAxe(container)\n violations.push(...axeViolations)\n \n // Run custom BIRHAUS accessibility tests\n if (this.options.includeColorContrast) {\n violations.push(...this.validateColorContrast(container))\n }\n \n if (this.options.includeKeyboardNav) {\n violations.push(...await this.validateKeyboardNavigation(container))\n }\n \n if (this.options.includeFocusManagement) {\n violations.push(...this.validateFocusManagement(container))\n }\n \n if (this.options.includeAriaLabels) {\n violations.push(...this.validateAriaLabels(container))\n }\n \n if (this.options.includeSpanishLabels) {\n violations.push(...this.validateSpanishLabels(container))\n }\n \n return violations\n }\n \n /**\n * Validate using axe-core accessibility engine\n */\n private async validateWithAxe(container: HTMLElement): Promise<AccessibilityViolation[]> {\n const violations: AccessibilityViolation[] = []\n \n try {\n const results = await axe(container, {\n rules: {\n // Enable specific WCAG rules based on level\n 'color-contrast': { enabled: this.options.level !== 'A' },\n 'color-contrast-enhanced': { enabled: this.options.level === 'AAA' },\n ...this.options.customRules\n }\n })\n \n results.violations.forEach((violation: any) => {\n violation.nodes.forEach((node: any) => {\n const element = document.querySelector(node.target[0]) as Element\n if (element) {\n violations.push({\n type: this.getViolationType(violation.id),\n element,\n severity: violation.impact as any || 'moderate',\n message: violation.description,\n messageEs: this.translateViolation(violation.description),\n wcagLevel: this.getWcagLevel(violation.tags),\n wcagCriterion: violation.id,\n suggestions: violation.nodes[0]?.failureSummary ? [violation.nodes[0].failureSummary] : [],\n birhausPrinciple: 6\n })\n }\n })\n })\n } catch (error) {\n console.error('Axe accessibility test failed:', error)\n }\n \n return violations\n }\n \n /**\n * Validate color contrast ratios (WCAG AA+ requirement)\n */\n private validateColorContrast(container: HTMLElement): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = []\n const elements = container.querySelectorAll('*')\n \n elements.forEach(element => {\n const style = getComputedStyle(element)\n const textColor = style.color\n const backgroundColor = style.backgroundColor\n \n if (textColor && backgroundColor && this.hasText(element)) {\n const contrast = this.calculateContrastRatio(textColor, backgroundColor)\n const requiredContrast = this.getRequiredContrast(element)\n \n if (contrast < requiredContrast) {\n violations.push({\n type: 'contrast',\n element: element as Element,\n severity: contrast < requiredContrast * 0.7 ? 'serious' : 'moderate',\n message: `Color contrast ratio ${contrast.toFixed(2)}:1 is below WCAG ${this.options.level} requirement of ${requiredContrast}:1`,\n messageEs: `Contraste de color ${contrast.toFixed(2)}:1 está por debajo del requisito WCAG ${this.options.level} de ${requiredContrast}:1`,\n wcagLevel: this.options.level,\n wcagCriterion: 'color-contrast',\n suggestions: [\n 'Increase color contrast between text and background',\n 'Use darker text colors or lighter background colors',\n 'Test with BIRHAUS financial theme for compliant colors',\n 'Consider using semantic color tokens from theme'\n ],\n birhausPrinciple: 6\n })\n }\n }\n })\n \n return violations\n }\n \n /**\n * Validate keyboard navigation (WCAG requirement)\n */\n // eslint-disable-next-line max-lines-per-function -- Keyboard navigation validation requires comprehensive testing\n public async validateKeyboardNavigation(container: HTMLElement): Promise<AccessibilityViolation[]> {\n const violations: AccessibilityViolation[] = []\n // const _user = userEvent.setup() // Reserved for future keyboard interaction tests\n const interactiveElements = container.querySelectorAll(this.options.interactiveElements)\n \n for (const element of Array.from(interactiveElements)) {\n try {\n // Test if element can receive focus\n if (!this.isFocusable(element)) {\n violations.push({\n type: 'keyboard',\n element: element as Element,\n severity: 'serious',\n message: 'Interactive element cannot be focused with keyboard',\n messageEs: 'Elemento interactivo no puede recibir foco con teclado',\n wcagLevel: 'A',\n wcagCriterion: 'keyboard-accessible',\n suggestions: [\n 'Add tabindex=\"0\" to make element focusable',\n 'Ensure element is not disabled when it should be interactive',\n 'Use semantic HTML elements (button, a, input) instead of divs',\n 'Add proper ARIA roles for custom interactive elements'\n ],\n birhausPrinciple: 6\n })\n }\n \n // Test if element has visible focus indicator\n (element as HTMLElement).focus()\n const focusedStyle = getComputedStyle(element)\n const hasFocusIndicator = this.hasFocusIndicator(element, focusedStyle)\n \n if (!hasFocusIndicator) {\n violations.push({\n type: 'focus',\n element: element as Element,\n severity: 'moderate',\n message: 'Element lacks visible focus indicator',\n messageEs: 'Elemento carece de indicador visual de foco',\n wcagLevel: 'AA',\n wcagCriterion: 'focus-visible',\n suggestions: [\n 'Add focus:ring-2 focus:ring-blue-500 classes',\n 'Use BIRHAUS focus styles from design tokens',\n 'Ensure focus outline is visible against background',\n 'Test focus indicators with high contrast mode'\n ],\n birhausPrinciple: 6\n })\n }\n \n } catch (error) {\n console.warn('Keyboard navigation test failed for element:', element)\n }\n }\n \n return violations\n }\n \n /**\n * Validate focus management\n */\n private validateFocusManagement(container: HTMLElement): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = []\n \n // Check for focus traps in modals/dialogs\n const dialogs = container.querySelectorAll('[role=\"dialog\"], [role=\"alertdialog\"], [data-birhaus-component=\"dialog\"]')\n \n dialogs.forEach(dialog => {\n const focusableElements = this.getFocusableElements(dialog)\n \n if (focusableElements.length === 0) {\n violations.push({\n type: 'focus',\n element: dialog,\n severity: 'serious',\n message: 'Dialog contains no focusable elements',\n messageEs: 'Diálogo no contiene elementos que puedan recibir foco',\n wcagLevel: 'A',\n wcagCriterion: 'focus-management',\n suggestions: [\n 'Add at least one focusable element (button, input, etc.)',\n 'Use BirhausDialog which includes proper focus management',\n 'Ensure close button is focusable',\n 'Add tabindex=\"-1\" to dialog container if needed'\n ],\n birhausPrinciple: 6\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate ARIA labels and roles\n */\n private validateAriaLabels(container: HTMLElement): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = []\n const interactiveElements = container.querySelectorAll(this.options.interactiveElements)\n \n interactiveElements.forEach(element => {\n const hasAccessibleName = this.hasAccessibleName(element)\n \n if (!hasAccessibleName) {\n violations.push({\n type: 'aria',\n element: element as Element,\n severity: 'serious',\n message: 'Interactive element lacks accessible name',\n messageEs: 'Elemento interactivo carece de nombre accesible',\n wcagLevel: 'A',\n wcagCriterion: 'name-role-value',\n suggestions: [\n 'Add aria-label attribute with descriptive text',\n 'Add aria-labelledby pointing to a label element',\n 'Use semantic HTML with proper text content',\n 'For BIRHAUS components, use labelEs and labelEn props'\n ],\n birhausPrinciple: 6\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate Spanish-first accessibility (BIRHAUS Principle #7)\n */\n private validateSpanishLabels(container: HTMLElement): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = []\n const birhausComponents = container.querySelectorAll('[data-birhaus-component]')\n \n birhausComponents.forEach(element => {\n const hasSpanishLabel = this.hasSpanishAccessibilityLabel(element)\n \n if (!hasSpanishLabel) {\n violations.push({\n type: 'spanish',\n element: element as Element,\n severity: 'moderate',\n message: 'BIRHAUS component lacks Spanish accessibility labels',\n messageEs: 'Componente BIRHAUS carece de etiquetas de accesibilidad en español',\n wcagLevel: 'AA',\n wcagCriterion: 'language-identification',\n suggestions: [\n 'Add labelEs prop for Spanish labels',\n 'Include aria-label in Spanish',\n 'Use data-label-es attribute',\n 'Set lang=\"es\" for Spanish content sections'\n ],\n birhausPrinciple: 7\n })\n }\n })\n \n return violations\n }\n \n // Helper methods\n \n private getViolationType(ruleId: string): AccessibilityViolation['type'] {\n if (ruleId.includes('contrast')) return 'contrast'\n if (ruleId.includes('keyboard') || ruleId.includes('tabindex')) return 'keyboard'\n if (ruleId.includes('aria') || ruleId.includes('label')) return 'aria'\n if (ruleId.includes('focus')) return 'focus'\n return 'structure'\n }\n \n private getWcagLevel(tags: string[]): 'A' | 'AA' | 'AAA' {\n if (tags.includes('wcag2aaa')) return 'AAA'\n if (tags.includes('wcag2aa')) return 'AA'\n return 'A'\n }\n \n private translateViolation(description: string): string {\n // Basic translation mapping for common violations\n const translations: Record<string, string> = {\n 'Elements must have sufficient color contrast': 'Los elementos deben tener suficiente contraste de color',\n 'All interactive elements must have an accessible name': 'Todos los elementos interactivos deben tener un nombre accesible',\n 'Elements must have keyboard access': 'Los elementos deben tener acceso por teclado',\n 'Form elements must have labels': 'Los elementos de formulario deben tener etiquetas'\n }\n \n // eslint-disable-next-line security/detect-object-injection -- Controlled translation mapping\n return translations[description] || description\n }\n \n private hasText(element: Element): boolean {\n const textContent = element.textContent?.trim()\n return textContent !== null && textContent !== undefined && textContent.length > 0\n }\n \n private calculateContrastRatio(color1: string, color2: string): number {\n // Simplified contrast calculation - in real implementation, use proper color parsing\n // This is a placeholder that returns a reasonable value for demonstration\n const rgb1 = this.parseColor(color1)\n const rgb2 = this.parseColor(color2)\n \n const l1 = this.getRelativeLuminance(rgb1)\n const l2 = this.getRelativeLuminance(rgb2)\n \n const lighter = Math.max(l1, l2)\n const darker = Math.min(l1, l2)\n \n return (lighter + 0.05) / (darker + 0.05)\n }\n \n private parseColor(color: string): [number, number, number] {\n // Simplified color parsing - in real implementation, handle all CSS color formats\n const match = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n if (match) {\n return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])]\n }\n return [0, 0, 0] // Default to black\n }\n \n private getRelativeLuminance([r, g, b]: [number, number, number]): number {\n const [rs, gs, bs] = [r, g, b].map(c => {\n c = c / 255\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs\n }\n \n private getRequiredContrast(element: Element): number {\n const style = getComputedStyle(element)\n const fontSize = parseFloat(style.fontSize)\n const fontWeight = style.fontWeight\n \n // Large text (18pt+ or 14pt+ bold) requires 3:1, normal text requires 4.5:1\n const isLargeText = fontSize >= 18 || (fontSize >= 14 && (fontWeight === 'bold' || parseInt(fontWeight) >= 700))\n \n return this.options.level === 'AAA' \n ? (isLargeText ? 4.5 : 7)\n : (isLargeText ? 3 : 4.5)\n }\n \n private isFocusable(element: Element): boolean {\n const tabIndex = element.getAttribute('tabindex')\n const isDisabled = element.hasAttribute('disabled')\n const tagName = element.tagName.toLowerCase()\n \n if (isDisabled) return false\n if (tabIndex === '-1') return false\n if (tabIndex && parseInt(tabIndex) >= 0) return true\n \n const focusableTags = ['a', 'button', 'input', 'select', 'textarea']\n return focusableTags.includes(tagName)\n }\n \n private hasFocusIndicator(element: Element, style: CSSStyleDeclaration): boolean {\n // Check for common focus indicators\n return !!(\n style.outline !== 'none' ||\n style.outlineWidth !== '0px' ||\n style.boxShadow !== 'none' ||\n style.border !== style.borderWidth // Check if border changes on focus\n )\n }\n \n private getFocusableElements(container: Element): Element[] {\n const focusableSelectors = [\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'a[href]',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(', ')\n \n return Array.from(container.querySelectorAll(focusableSelectors))\n }\n \n private hasAccessibleName(element: Element): boolean {\n const ariaLabel = element.getAttribute('aria-label')\n const ariaLabelledBy = element.getAttribute('aria-labelledby')\n const textContent = element.textContent?.trim()\n \n return !!(ariaLabel || ariaLabelledBy || textContent)\n }\n \n private hasSpanishAccessibilityLabel(element: Element): boolean {\n const ariaLabel = element.getAttribute('aria-label')\n const dataLabelEs = element.getAttribute('data-label-es')\n const lang = element.getAttribute('lang')\n \n // Check if aria-label contains Spanish characters or patterns\n const hasSpanishPatterns = ariaLabel && /[ñáéíóúü]|ción|dad|mente/i.test(ariaLabel)\n \n return !!(dataLabelEs || hasSpanishPatterns || lang === 'es')\n }\n}\n\n/**\n * Test helper functions for accessibility assertions\n */\n\n/**\n * Assert WCAG AA+ compliance\n */\nexport async function expectAccessibilityCompliance(\n container?: HTMLElement,\n level: 'A' | 'AA' | 'AAA' = 'AA'\n): Promise<void> {\n const validator = new AccessibilityValidator({ level })\n const violations = await validator.validateAll(container)\n \n const criticalViolations = violations.filter(v => v.severity === 'serious' || v.severity === 'critical')\n \n if (criticalViolations.length > 0) {\n const errorMessages = criticalViolations\n .map(v => `${v.type}: ${v.message}`)\n .join('\\n')\n \n throw new Error(\n `WCAG ${level} violations detected:\\n${errorMessages}\\n\\n` +\n `Total violations: ${violations.length} (${criticalViolations.length} critical/serious)`\n )\n }\n}\n\n/**\n * Assert Spanish-first accessibility\n */\nexport async function expectSpanishAccessibility(\n container?: HTMLElement\n): Promise<void> {\n const validator = new AccessibilityValidator({ includeSpanishLabels: true })\n const violations = await validator.validateAll(container)\n \n const spanishViolations = violations.filter(v => v.type === 'spanish')\n \n if (spanishViolations.length > 0) {\n const errorMessages = spanishViolations\n .map(v => v.messageEs)\n .join('\\n')\n \n throw new Error(\n `Spanish accessibility violations detected:\\n${errorMessages}`\n )\n }\n}\n\n/**\n * Assert keyboard navigation works\n */\nexport async function expectKeyboardAccessible(\n container?: HTMLElement\n): Promise<void> {\n const validator = new AccessibilityValidator({ includeKeyboardNav: true })\n const violations = await validator.validateKeyboardNavigation(container || document.body)\n \n if (violations.length > 0) {\n const errorMessages = violations\n .map(v => v.message)\n .join('\\n')\n \n throw new Error(\n `Keyboard accessibility violations detected:\\n${errorMessages}`\n )\n }\n}\n\n"]}