/* eslint-env jest */ /** * @fileoverview Enforce `` text to not exactly match "click here", "here", "link", or "a link". * @author Matt Wang */ // ----------------------------------------------------------------------------- // Requirements // ----------------------------------------------------------------------------- import { RuleTester } from 'eslint'; import parserOptionsMapper from '../../__util__/parserOptionsMapper'; import parsers from '../../__util__/helpers/parsers'; import rule from '../../../src/rules/anchor-ambiguous-text'; // ----------------------------------------------------------------------------- // Tests // ----------------------------------------------------------------------------- const ruleTester = new RuleTester(); const DEFAULT_AMBIGUOUS_WORDS = [ 'click here', 'here', 'link', 'a link', 'learn more', ]; const expectedErrorGenerator = (words) => ({ message: `Ambiguous text within anchor. Screenreader users rely on link text for context; the words "${words.join('", "')}" are ambiguous and do not provide enough context.`, type: 'JSXOpeningElement', }); const expectedError = expectedErrorGenerator(DEFAULT_AMBIGUOUS_WORDS); ruleTester.run('anchor-ambiguous-text', rule, { valid: parsers.all([].concat( { code: 'documentation;' }, { code: '${here};' }, { code: 'click here;' }, { code: 'click here;' }, { code: 'documentation;' }, { code: 'click here', options: [{ words: ['disabling the defaults'], }], }, { code: 'documentation;', settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, { code: 'documentation;', settings: { 'jsx-a11y': { components: { Image: 'img' } } }, }, { code: '${here};', settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, { code: 'click here;', settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, { code: 'click here', options: [{ words: ['disabling the defaults with components'], }], settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, )).map(parserOptionsMapper), invalid: parsers.all([].concat( { code: 'here;', errors: [expectedError] }, { code: 'HERE;', errors: [expectedError] }, { code: 'click here;', errors: [expectedError] }, { code: 'learn more;', errors: [expectedError] }, { code: 'learn more;', errors: [expectedError] }, { code: 'learn more.;', errors: [expectedError] }, { code: 'learn more?;', errors: [expectedError] }, { code: 'learn more,;', errors: [expectedError] }, { code: 'learn more!;', errors: [expectedError] }, { code: 'learn more;;', errors: [expectedError] }, { code: 'learn more:;', errors: [expectedError] }, { code: 'link;', errors: [expectedError] }, { code: 'a link;', errors: [expectedError] }, { code: 'something;', errors: [expectedError] }, { code: ' a link ;', errors: [expectedError] }, { code: 'a link;', errors: [expectedError] }, { code: 'a link;', errors: [expectedError] }, { code: 'click here;', errors: [expectedError] }, { code: ' click here;', errors: [expectedError] }, { code: 'more textlearn more;', errors: [expectedError] }, { code: 'learn more;', errors: [expectedError] }, { code: 'click here;', errors: [expectedError] }, { code: 'click here;', errors: [expectedError] }, { code: 'click here;', errors: [expectedError] }, { code: 'click here;', errors: [expectedError] }, { code: 'here', errors: [expectedError], settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, { code: 'click here', errors: [expectedError], settings: { 'jsx-a11y': { components: { Image: 'img' } } }, }, { code: 'a disallowed word', errors: [expectedErrorGenerator(['a disallowed word'])], options: [{ words: ['a disallowed word'], }], }, )).map(parserOptionsMapper), });