/** * @fileoverview Enforce img alt attribute does not have the word image, picture, or photo. * @author Ethan Cohen */ // ----------------------------------------------------------------------------- // Requirements // ----------------------------------------------------------------------------- import { RuleTester } from 'eslint'; import semver from 'semver'; import { version as eslintVersion } from 'eslint/package.json'; import parserOptionsMapper from '../../__util__/parserOptionsMapper'; import parsers from '../../__util__/helpers/parsers'; import rule from '../../../src/rules/img-redundant-alt'; // ----------------------------------------------------------------------------- // Tests // ----------------------------------------------------------------------------- const array = [{ components: ['Image'], words: ['Word1', 'Word2'], }]; const componentsSettings = { 'jsx-a11y': { components: { Image: 'img', }, }, }; const ruleTester = new RuleTester(); const expectedError = { message: 'Redundant alt attribute. Screen-readers already announce `img` tags as an image. You don’t need to use the words `image`, `photo,` or `picture` (or any specified custom words) in the alt prop.', type: 'JSXOpeningElement', }; ruleTester.run('img-redundant-alt', rule, { valid: parsers.all([].concat( { code: 'foo;' }, { code: 'picture of me taking a photo of an image' }, { code: 'photo of image' }, { code: 'foo;' }, { code: 'foo' }, { code: '{"foo"}' }, { code: '{alt}' }, { code: '' }, { code: '' }, { code: '' }, { code: '{undefined}' }, { code: '{`this' }, { code: '{`this' }, { code: '{`this' }, { code: '{`this' }, { code: '{`${photo}`}' }, { code: '{`${image}`}' }, { code: '{`${picture}`}' }, { code: '{"undefined"}' }, { code: '{() {}} />' }, { code: '{function(e){}}' }, { code: 'Doing cool things.' }, { code: 'test' }, { code: '' }, { code: '{imageAlt}' }, { code: '{imageAlt.name}' }, semver.satisfies(eslintVersion, '>= 6') ? [ { code: '{imageAlt?.name}', parserOptions: { ecmaVersion: 2020 } }, { code: 'Doing cool things', parserOptions: { ecmaVersion: 2020 } }, ] : [], { code: 'Photography;' }, { code: 'ImageMagick;' }, { code: 'Photo of a friend' }, { code: 'Foo', settings: componentsSettings }, )).map(parserOptionsMapper), invalid: parsers.all([].concat( { code: 'Photo of friend.;', errors: [expectedError] }, { code: 'Picture of friend.;', errors: [expectedError] }, { code: 'Image of friend.;', errors: [expectedError] }, { code: 'PhOtO of friend.;', errors: [expectedError] }, { code: '{"photo"};', errors: [expectedError] }, { code: 'piCTUre of friend.;', errors: [expectedError] }, { code: 'imAGE of friend.;', errors: [expectedError] }, { code: 'photo of cool person', errors: [expectedError], }, { code: 'picture of cool person', errors: [expectedError], }, { code: 'image of cool person', errors: [expectedError], }, { code: 'photo', errors: [expectedError] }, { code: 'image', errors: [expectedError] }, { code: 'picture', errors: [expectedError] }, { code: '{`picture', errors: [expectedError], }, { code: '{`photo', errors: [expectedError], }, { code: '{`image', errors: [expectedError], }, { code: '{`picture', errors: [expectedError], }, { code: '{`photo', errors: [expectedError], }, { code: '{`image', errors: [expectedError], }, { code: 'Photo of a friend', errors: [expectedError], settings: componentsSettings }, // TESTS FOR ARRAY OPTION TESTS { code: 'Word1;', options: array, errors: [expectedError] }, { code: 'Word2;', options: array, errors: [expectedError] }, { code: 'Word1;', options: array, errors: [expectedError] }, { code: 'Word2;', options: array, errors: [expectedError] }, )).map(parserOptionsMapper), });