/** * @fileoverview Enforce aria role attribute is valid. * @author Ethan Cohen */ // ----------------------------------------------------------------------------- // Requirements // ----------------------------------------------------------------------------- import { roles } from 'aria-query'; import { RuleTester } from 'eslint'; import parserOptionsMapper from '../../__util__/parserOptionsMapper'; import parsers from '../../__util__/helpers/parsers'; import rule from '../../../src/rules/aria-role'; // ----------------------------------------------------------------------------- // Tests // ----------------------------------------------------------------------------- const ruleTester = new RuleTester(); const errorMessage = { message: 'Elements with ARIA roles must use a valid, non-abstract ARIA role.', type: 'JSXAttribute', }; const roleKeys = [...roles.keys()]; const validRoles = roleKeys.filter((role) => roles.get(role).abstract === false); const invalidRoles = roleKeys.filter((role) => roles.get(role).abstract === true); const createTests = (roleNames) => roleNames.map((role) => ({ code: `
`, })); const validTests = createTests(validRoles); const invalidTests = createTests(invalidRoles).map((test) => { const invalidTest = { ...test }; invalidTest.errors = [errorMessage]; return invalidTest; }); const allowedInvalidRoles = [{ allowedInvalidRoles: ['invalid-role', 'other-invalid-role'], }]; const ignoreNonDOMSchema = [{ ignoreNonDOM: true, }]; const customDivSettings = { 'jsx-a11y': { polymorphicPropName: 'asChild', components: { Div: 'div', }, }, }; ruleTester.run('aria-role', rule, { valid: parsers.all([].concat( // Variables should pass, as we are only testing literals. { code: '
' }, { code: '
' }, { code: '
' }, { code: '
' }, { code: '
' }, { code: '
' }, { code: '
' }, { code: '
' }, { code: '
' }, { code: '' }, { code: '', options: allowedInvalidRoles }, { code: '', options: allowedInvalidRoles }, { code: '', options: allowedInvalidRoles }, { code: '', options: ignoreNonDOMSchema }, { code: '', options: ignoreNonDOMSchema }, { code: '', options: ignoreNonDOMSchema }, { code: '
', settings: customDivSettings, }, { code: '', settings: customDivSettings, }, { code: '', }, )).concat(validTests).map(parserOptionsMapper), invalid: parsers.all([].concat( { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage] }, { code: '
', errors: [errorMessage], options: allowedInvalidRoles }, { code: '
', errors: [errorMessage] }, { code: '', errors: [errorMessage] }, { code: '', errors: [errorMessage] }, { code: '
', errors: [errorMessage], settings: customDivSettings }, { code: '
', errors: [errorMessage], options: ignoreNonDOMSchema, settings: customDivSettings, }, { code: '', settings: customDivSettings, errors: [errorMessage], }, )).concat(invalidTests).map(parserOptionsMapper), });