UNPKG

@birhaus/test-utils

Version:

BIRHAUS Testing & Validation Framework - Comprehensive testing utilities for cognitive load, accessibility, and BIRHAUS principle compliance

1 lines 43.6 kB
{"version":3,"sources":["../../src/spanish/SpanishCoverageValidator.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BIRHAUS Spanish Coverage Validator\n * \n * Comprehensive testing utilities for BIRHAUS Principle #7: \"Bilingual by design\"\n * \n * Features:\n * - Spanish-first label validation\n * - Bilingual completeness testing\n * - Financial terminology coverage\n * - Paraguay-specific language patterns\n * - Cultural context validation\n */\n\n/* eslint-disable security/detect-object-injection, security/detect-non-literal-regexp, security/detect-unsafe-regex */\n// Spanish language validation requires controlled object access and regex patterns\n\n// import { screen, within } from '@testing-library/react' // Available for future test extensions\n\nexport interface SpanishCoverageViolation {\n type: 'missing-spanish' | 'missing-english' | 'invalid-pattern' | 'financial-term' | 'cultural-context'\n element: Element\n severity: 'minor' | 'moderate' | 'serious' | 'critical'\n message: string\n messageEs: string\n currentText?: string\n suggestedSpanish?: string\n suggestedEnglish?: string\n birhausPrinciple: number\n context: 'navigation' | 'form' | 'button' | 'content' | 'error' | 'financial'\n}\n\nexport interface SpanishTestOptions {\n // Coverage requirements\n requireSpanishPrimary?: boolean\n requireEnglishFallback?: boolean\n strictFinancialTerms?: boolean\n \n // Language patterns\n validateParaguayanSpanish?: boolean\n validateFinancialVocabulary?: boolean\n validateCurrencyFormats?: boolean\n \n // Component coverage\n checkBirhausComponents?: boolean\n checkErrorMessages?: boolean\n checkButtonLabels?: boolean\n checkFormLabels?: boolean\n \n // Selectors\n birhausSelector?: string\n interactiveSelector?: string\n contentSelector?: string\n}\n\nexport class SpanishCoverageValidator {\n private options: Required<SpanishTestOptions>\n \n // Paraguay-specific financial terminology\n private readonly financialTerms = {\n // Currency and amounts\n 'amount': { es: 'monto', alternatives: ['cantidad', 'importe'] },\n 'balance': { es: 'saldo', alternatives: ['balance'] },\n 'income': { es: 'ingreso', alternatives: ['entrada'] },\n 'expense': { es: 'gasto', alternatives: ['egreso'] },\n 'transfer': { es: 'transferencia', alternatives: [] },\n 'payment': { es: 'pago', alternatives: [] },\n 'receipt': { es: 'recibo', alternatives: ['comprobante'] },\n 'invoice': { es: 'factura', alternatives: [] },\n 'tax': { es: 'impuesto', alternatives: [] },\n 'total': { es: 'total', alternatives: [] },\n 'subtotal': { es: 'subtotal', alternatives: [] },\n \n // Status terms\n 'pending': { es: 'pendiente', alternatives: ['en espera'] },\n 'approved': { es: 'aprobado', alternatives: ['autorizado'] },\n 'rejected': { es: 'rechazado', alternatives: ['denegado'] },\n 'completed': { es: 'completado', alternatives: ['finalizado'] },\n 'cancelled': { es: 'cancelado', alternatives: ['anulado'] },\n \n // Actions\n 'save': { es: 'guardar', alternatives: [] },\n 'cancel': { es: 'cancelar', alternatives: [] },\n 'edit': { es: 'editar', alternatives: ['modificar'] },\n 'delete': { es: 'eliminar', alternatives: ['borrar'] },\n 'approve': { es: 'aprobar', alternatives: ['autorizar'] },\n 'reject': { es: 'rechazar', alternatives: ['denegar'] },\n 'export': { es: 'exportar', alternatives: [] },\n 'print': { es: 'imprimir', alternatives: [] },\n \n // Church-specific terms\n 'donation': { es: 'donación', alternatives: ['ofrenda'] },\n 'tithe': { es: 'diezmo', alternatives: [] },\n 'offering': { es: 'ofrenda', alternatives: [] },\n 'church': { es: 'iglesia', alternatives: [] },\n 'pastor': { es: 'pastor', alternatives: [] },\n 'member': { es: 'miembro', alternatives: [] },\n 'treasurer': { es: 'tesorero', alternatives: [] },\n 'administrator': { es: 'administrador', alternatives: [] }\n }\n \n // Common Spanish patterns for Paraguay\n private readonly spanishPatterns = [\n /[ñáéíóúü]/i, // Spanish characters\n /ción\\b/i, // -ción endings\n /dad\\b/i, // -dad endings\n /mente\\b/i, // -mente adverbs\n /\\bel\\b|\\bla\\b|\\blos\\b|\\blas\\b/i, // Articles\n /\\ben\\b|\\bde\\b|\\bdel\\b|\\bal\\b/i, // Prepositions\n /\\by\\b|\\bo\\b|\\bpero\\b|\\bsi\\b/i // Conjunctions\n ]\n \n constructor(options: SpanishTestOptions = {}) {\n this.options = {\n requireSpanishPrimary: true,\n requireEnglishFallback: true,\n strictFinancialTerms: true,\n validateParaguayanSpanish: true,\n validateFinancialVocabulary: true,\n validateCurrencyFormats: true,\n checkBirhausComponents: true,\n checkErrorMessages: true,\n checkButtonLabels: true,\n checkFormLabels: true,\n birhausSelector: '[data-birhaus-component]',\n interactiveSelector: 'button, a, input, select, textarea, [role=\"button\"]',\n contentSelector: 'h1, h2, h3, h4, h5, h6, p, span, div[class*=\"text\"], label',\n ...options\n }\n }\n \n /**\n * Validate all Spanish coverage requirements\n */\n validateAll(container: HTMLElement = document.body): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n \n if (this.options.checkBirhausComponents) {\n violations.push(...this.validateBirhausComponents(container))\n }\n \n if (this.options.checkButtonLabels) {\n violations.push(...this.validateButtonLabels(container))\n }\n \n if (this.options.checkFormLabels) {\n violations.push(...this.validateFormLabels(container))\n }\n \n if (this.options.checkErrorMessages) {\n violations.push(...this.validateErrorMessages(container))\n }\n \n if (this.options.validateFinancialVocabulary) {\n violations.push(...this.validateFinancialTerminology(container))\n }\n \n if (this.options.validateCurrencyFormats) {\n violations.push(...this.validateCurrencyFormats(container))\n }\n \n return violations\n }\n \n /**\n * Validate BIRHAUS components have Spanish-first labels\n */\n validateBirhausComponents(container: HTMLElement): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n const birhausComponents = container.querySelectorAll(this.options.birhausSelector)\n \n birhausComponents.forEach(component => {\n const componentType = component.getAttribute('data-birhaus-component')\n const hasSpanishLabel = this.checkSpanishLabels(component)\n const hasEnglishFallback = this.checkEnglishFallbacks(component)\n \n if (this.options.requireSpanishPrimary && !hasSpanishLabel) {\n violations.push({\n type: 'missing-spanish',\n element: component,\n severity: 'serious',\n message: `BIRHAUS ${componentType} component missing Spanish labels`,\n messageEs: `Componente BIRHAUS ${componentType} carece de etiquetas en español`,\n suggestedSpanish: this.suggestSpanishLabel(component),\n birhausPrinciple: 7,\n context: this.getElementContext(component)\n })\n }\n \n if (this.options.requireEnglishFallback && hasSpanishLabel && !hasEnglishFallback) {\n violations.push({\n type: 'missing-english',\n element: component,\n severity: 'moderate',\n message: `BIRHAUS ${componentType} component missing English fallback labels`,\n messageEs: `Componente BIRHAUS ${componentType} carece de etiquetas de respaldo en inglés`,\n suggestedEnglish: this.suggestEnglishLabel(component),\n birhausPrinciple: 7,\n context: this.getElementContext(component)\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate button labels are in Spanish-first\n */\n validateButtonLabels(container: HTMLElement): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n const buttons = container.querySelectorAll('button, [role=\"button\"], input[type=\"submit\"], input[type=\"button\"]')\n \n buttons.forEach(button => {\n const text = this.getElementText(button)\n const hasSpanish = this.isSpanishText(text)\n \n if (!hasSpanish && text.length > 0) {\n const suggestedSpanish = this.translateButtonText(text)\n \n violations.push({\n type: 'missing-spanish',\n element: button,\n severity: 'moderate',\n message: `Button text \"${text}\" should be in Spanish`,\n messageEs: `Texto del botón \"${text}\" debería estar en español`,\n currentText: text,\n suggestedSpanish,\n birhausPrinciple: 7,\n context: 'button'\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate form labels and placeholders\n */\n validateFormLabels(container: HTMLElement): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n const formElements = container.querySelectorAll('input, select, textarea')\n \n formElements.forEach(element => {\n // Check labels\n const label = this.getAssociatedLabel(element)\n if (label) {\n const labelText = label.textContent?.trim() || ''\n if (!this.isSpanishText(labelText) && labelText.length > 0) {\n violations.push({\n type: 'missing-spanish',\n element: label,\n severity: 'moderate',\n message: `Form label \"${labelText}\" should be in Spanish`,\n messageEs: `Etiqueta de formulario \"${labelText}\" debería estar en español`,\n currentText: labelText,\n suggestedSpanish: this.translateFormLabel(labelText),\n birhausPrinciple: 7,\n context: 'form'\n })\n }\n }\n \n // Check placeholders\n const placeholder = element.getAttribute('placeholder')\n if (placeholder && !this.isSpanishText(placeholder)) {\n violations.push({\n type: 'missing-spanish',\n element: element,\n severity: 'minor',\n message: `Placeholder \"${placeholder}\" should be in Spanish`,\n messageEs: `Marcador de posición \"${placeholder}\" debería estar en español`,\n currentText: placeholder,\n suggestedSpanish: this.translatePlaceholder(placeholder),\n birhausPrinciple: 7,\n context: 'form'\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate error messages are in Spanish with \"Qué pasó + cómo resolver\" pattern\n */\n validateErrorMessages(container: HTMLElement): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n const errorElements = container.querySelectorAll(\n '.error, .alert-error, [role=\"alert\"], [class*=\"error\"], [data-error], [aria-invalid=\"true\"] + *'\n )\n \n errorElements.forEach(element => {\n const errorText = element.textContent?.trim() || ''\n \n if (errorText.length > 0) {\n const hasSpanish = this.isSpanishText(errorText)\n const hasProperPattern = this.hasProperErrorPattern(errorText)\n \n if (!hasSpanish) {\n violations.push({\n type: 'missing-spanish',\n element: element,\n severity: 'serious',\n message: `Error message \"${errorText}\" should be in Spanish`,\n messageEs: `Mensaje de error \"${errorText}\" debería estar en español`,\n currentText: errorText,\n suggestedSpanish: this.translateErrorMessage(errorText),\n birhausPrinciple: 7,\n context: 'error'\n })\n } else if (!hasProperPattern) {\n violations.push({\n type: 'invalid-pattern',\n element: element,\n severity: 'moderate',\n message: `Error message should follow \"Qué pasó + cómo resolver\" pattern`,\n messageEs: `Mensaje de error debería seguir el patrón \"Qué pasó + cómo resolver\"`,\n currentText: errorText,\n suggestedSpanish: this.improveErrorPattern(errorText),\n birhausPrinciple: 7,\n context: 'error'\n })\n }\n }\n })\n \n return violations\n }\n \n /**\n * Validate financial terminology is properly translated\n */\n validateFinancialTerminology(container: HTMLElement): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n const textElements = container.querySelectorAll(this.options.contentSelector)\n \n textElements.forEach(element => {\n const text = element.textContent?.toLowerCase() || ''\n \n // Check for English financial terms that should be translated\n Object.entries(this.financialTerms).forEach(([englishTerm, spanishData]) => {\n const regex = new RegExp(`\\\\b${englishTerm}\\\\b`, 'gi')\n if (regex.test(text)) {\n violations.push({\n type: 'financial-term',\n element: element,\n severity: this.options.strictFinancialTerms ? 'serious' : 'moderate',\n message: `Financial term \"${englishTerm}\" should use Spanish \"${spanishData.es}\"`,\n messageEs: `Término financiero \"${englishTerm}\" debería usar español \"${spanishData.es}\"`,\n currentText: englishTerm,\n suggestedSpanish: spanishData.es,\n birhausPrinciple: 7,\n context: 'financial'\n })\n }\n })\n })\n \n return violations\n }\n \n /**\n * Validate currency formats follow Paraguay conventions\n */\n validateCurrencyFormats(container: HTMLElement): SpanishCoverageViolation[] {\n const violations: SpanishCoverageViolation[] = []\n const textElements = container.querySelectorAll(this.options.contentSelector)\n \n textElements.forEach(element => {\n const text = element.textContent || ''\n \n // Look for currency patterns\n const currencyPatterns = [\n /\\$[\\d,]+/g, // Dollar signs\n /USD\\s*[\\d,]+/g, // USD prefix\n /[\\d,]+\\s*USD/g, // USD suffix\n /₲[\\d,]+/g, // Guaraní symbol\n /PYG\\s*[\\d,]+/g, // PYG prefix\n /[\\d,]+\\s*PYG/g // PYG suffix\n ]\n \n currencyPatterns.forEach(pattern => {\n const matches = text.match(pattern)\n if (matches) {\n matches.forEach(match => {\n if (!this.isValidParaguayanCurrency(match)) {\n violations.push({\n type: 'invalid-pattern',\n element: element,\n severity: 'moderate',\n message: `Currency format \"${match}\" should follow Paraguay conventions`,\n messageEs: `Formato de moneda \"${match}\" debería seguir convenciones de Paraguay`,\n currentText: match,\n suggestedSpanish: this.formatAsParaguayanCurrency(match),\n birhausPrinciple: 7,\n context: 'financial'\n })\n }\n })\n }\n })\n })\n \n return violations\n }\n \n // Helper methods\n \n private checkSpanishLabels(element: Element): boolean {\n const spanishAttributes = [\n 'data-label-es',\n 'labelEs',\n 'aria-label',\n 'title'\n ]\n \n return spanishAttributes.some(attr => {\n const value = element.getAttribute(attr)\n return value && this.isSpanishText(value)\n })\n }\n \n private checkEnglishFallbacks(element: Element): boolean {\n const englishAttributes = [\n 'data-label-en',\n 'labelEn'\n ]\n \n return englishAttributes.some(attr => {\n const value = element.getAttribute(attr)\n return value && value.length > 0\n })\n }\n \n private isSpanishText(text: string): boolean {\n if (!text || text.length === 0) return false\n \n // Check for Spanish patterns\n return this.spanishPatterns.some(pattern => pattern.test(text)) ||\n // Check for Spanish financial terms\n Object.values(this.financialTerms).some(term => \n text.toLowerCase().includes(term.es) ||\n term.alternatives.some(alt => text.toLowerCase().includes(alt))\n )\n }\n \n private getElementText(element: Element): string {\n return element.textContent?.trim() || \n element.getAttribute('aria-label') || \n element.getAttribute('title') || \n element.getAttribute('alt') || ''\n }\n \n private getElementContext(element: Element): SpanishCoverageViolation['context'] {\n const tagName = element.tagName.toLowerCase()\n const role = element.getAttribute('role')\n const className = element.className\n \n if (tagName === 'button' || role === 'button') return 'button'\n if (tagName === 'nav' || role === 'navigation') return 'navigation'\n if (['input', 'select', 'textarea'].includes(tagName)) return 'form'\n if (className.includes('error') || element.getAttribute('role') === 'alert') return 'error'\n if (this.isFinancialElement(element)) return 'financial'\n \n return 'content'\n }\n \n private isFinancialElement(element: Element): boolean {\n const text = this.getElementText(element).toLowerCase()\n const className = element.className.toLowerCase()\n \n return Object.keys(this.financialTerms).some(term => \n text.includes(term) || className.includes(term)\n )\n }\n \n private suggestSpanishLabel(element: Element): string {\n const componentType = element.getAttribute('data-birhaus-component')\n const currentText = this.getElementText(element)\n \n if (currentText) {\n return this.translateButtonText(currentText)\n }\n \n // Default suggestions based on component type\n const suggestions: Record<string, string> = {\n 'button': 'Botón',\n 'input': 'Campo de entrada',\n 'select': 'Lista desplegable',\n 'card': 'Tarjeta',\n 'dialog': 'Diálogo',\n 'table': 'Tabla',\n 'tabs': 'Pestañas',\n 'checkbox': 'Casilla de verificación'\n }\n \n return suggestions[componentType || ''] || 'Elemento'\n }\n \n private suggestEnglishLabel(element: Element): string {\n const spanishText = this.getElementText(element)\n return this.translateToEnglish(spanishText)\n }\n \n private translateButtonText(text: string): string {\n const translations: Record<string, string> = {\n 'save': 'Guardar',\n 'cancel': 'Cancelar',\n 'edit': 'Editar',\n 'delete': 'Eliminar',\n 'submit': 'Enviar',\n 'reset': 'Restablecer',\n 'close': 'Cerrar',\n 'open': 'Abrir',\n 'add': 'Agregar',\n 'remove': 'Quitar',\n 'approve': 'Aprobar',\n 'reject': 'Rechazar',\n 'export': 'Exportar',\n 'import': 'Importar',\n 'print': 'Imprimir',\n 'search': 'Buscar',\n 'filter': 'Filtrar',\n 'sort': 'Ordenar'\n }\n \n const lowerText = text.toLowerCase()\n return translations[lowerText] || text\n }\n \n private translateFormLabel(text: string): string {\n const translations: Record<string, string> = {\n 'name': 'Nombre',\n 'email': 'Correo electrónico',\n 'phone': 'Teléfono',\n 'address': 'Dirección',\n 'amount': 'Monto',\n 'date': 'Fecha',\n 'description': 'Descripción',\n 'category': 'Categoría',\n 'status': 'Estado',\n 'type': 'Tipo',\n 'notes': 'Notas',\n 'comments': 'Comentarios'\n }\n \n const lowerText = text.toLowerCase()\n return translations[lowerText] || text\n }\n \n private translatePlaceholder(text: string): string {\n const translations: Record<string, string> = {\n 'enter name': 'Ingrese el nombre',\n 'enter email': 'Ingrese el correo electrónico',\n 'enter amount': 'Ingrese el monto',\n 'select date': 'Seleccione la fecha',\n 'search...': 'Buscar...',\n 'type here': 'Escriba aquí',\n 'optional': 'Opcional'\n }\n \n const lowerText = text.toLowerCase()\n return translations[lowerText] || text\n }\n \n private translateErrorMessage(text: string): string {\n const translations: Record<string, string> = {\n 'required field': 'Campo obligatorio. Complete este campo para continuar.',\n 'invalid email': 'Correo electrónico inválido. Verifique el formato (ejemplo@dominio.com).',\n 'invalid amount': 'Monto inválido. Ingrese un número válido mayor a cero.',\n 'network error': 'Error de conexión. Verifique su conexión a internet e intente nuevamente.',\n 'server error': 'Error del servidor. El problema será resuelto pronto, intente más tarde.'\n }\n \n const lowerText = text.toLowerCase()\n return translations[lowerText] || `Error: ${text}. Verifique los datos e intente nuevamente.`\n }\n \n private translateToEnglish(spanishText: string): string {\n // Reverse translation for English fallbacks\n const reverseTranslations: Record<string, string> = {\n 'guardar': 'Save',\n 'cancelar': 'Cancel',\n 'editar': 'Edit',\n 'eliminar': 'Delete',\n 'enviar': 'Submit',\n 'cerrar': 'Close',\n 'abrir': 'Open',\n 'agregar': 'Add',\n 'quitar': 'Remove'\n }\n \n const lowerText = spanishText.toLowerCase()\n return reverseTranslations[lowerText] || spanishText\n }\n \n private hasProperErrorPattern(text: string): boolean {\n // Check if error follows \"Qué pasó + cómo resolver\" pattern\n const hasExplanation = /error|problema|fallo|inválido|incorrecto/i.test(text)\n const hasSolution = /verifique|intente|complete|corrija|revise/i.test(text)\n \n return hasExplanation && hasSolution\n }\n \n private improveErrorPattern(text: string): string {\n // Add solution suggestion to error message\n const solutions = [\n 'Verifique los datos e intente nuevamente.',\n 'Complete la información requerida.',\n 'Revise el formato e intente otra vez.',\n 'Intente más tarde o contacte soporte.'\n ]\n \n const randomSolution = solutions[Math.floor(Math.random() * solutions.length)]\n return `${text} ${randomSolution}`\n }\n \n private getAssociatedLabel(element: Element): Element | null {\n const labelledBy = element.getAttribute('aria-labelledby')\n if (labelledBy) {\n return document.getElementById(labelledBy)\n }\n \n const id = element.getAttribute('id')\n if (id) {\n return document.querySelector(`label[for=\"${id}\"]`)\n }\n \n return element.closest('label')\n }\n \n private isValidParaguayanCurrency(currencyText: string): boolean {\n // Check if follows Paraguay format: ₲ 123.456 or PYG 123.456\n const paraguayanPatterns = [\n /^₲\\s?\\d{1,3}(\\.\\d{3})*$/,\n /^PYG\\s\\d{1,3}(\\.\\d{3})*$/,\n /^\\d{1,3}(\\.\\d{3})*\\sPYG$/\n ]\n \n return paraguayanPatterns.some(pattern => pattern.test(currencyText))\n }\n \n private formatAsParaguayanCurrency(currencyText: string): string {\n // Extract number and format as Paraguayan Guaraní\n const number = currencyText.replace(/[^\\d]/g, '')\n const formatted = new Intl.NumberFormat('es-PY').format(parseInt(number))\n return `₲ ${formatted}`\n }\n}\n\n/**\n * Test helper functions for Spanish coverage assertions\n */\n\n/**\n * Assert Spanish-first compliance\n */\nexport function expectSpanishFirst(\n container?: HTMLElement,\n strict: boolean = true\n): void {\n const validator = new SpanishCoverageValidator({ \n requireSpanishPrimary: true,\n strictFinancialTerms: strict\n })\n const violations = validator.validateAll(container)\n \n const seriousViolations = violations.filter(v => v.severity === 'serious' || v.severity === 'critical')\n \n if (seriousViolations.length > 0) {\n const errorMessages = seriousViolations\n .map(v => v.messageEs)\n .join('\\n')\n \n throw new Error(\n `Spanish-first violations detected:\\n${errorMessages}\\n\\n` +\n `Total violations: ${violations.length} (${seriousViolations.length} serious)`\n )\n }\n}\n\n/**\n * Assert bilingual completeness\n */\nexport function expectBilingualCompleteness(\n container?: HTMLElement\n): void {\n const validator = new SpanishCoverageValidator({ \n requireSpanishPrimary: true,\n requireEnglishFallback: true\n })\n const violations = validator.validateAll(container)\n \n if (violations.length > 0) {\n const errorMessages = violations\n .map(v => v.message)\n .join('\\n')\n \n throw new Error(\n `Bilingual completeness violations detected:\\n${errorMessages}`\n )\n }\n}\n\n/**\n * Assert financial terminology is properly translated\n */\nexport function expectFinancialSpanish(\n container?: HTMLElement\n): void {\n const validator = new SpanishCoverageValidator({ \n validateFinancialVocabulary: true,\n strictFinancialTerms: true\n })\n const violations = validator.validateFinancialTerminology(container || document.body)\n \n if (violations.length > 0) {\n const errorMessages = violations\n .map(v => `${v.currentText} → ${v.suggestedSpanish}`)\n .join('\\n')\n \n throw new Error(\n `Financial terminology violations detected:\\n${errorMessages}`\n )\n }\n}\n\n"]}