import parser from '@typescript-eslint/parser'; import { RuleTester } from '@typescript-eslint/rule-tester'; import dedent from 'dedent'; import { displayNameRule } from './display-name.mjs'; const tester = new RuleTester({ languageOptions: { parser, parserOptions: { ecmaVersion: 2020, sourceType: 'module', ecmaFeatures: { jsx: true, }, }, }, }); describe('display-name', () => { describe('default behavior', () => { tester.run('display-name', displayNameRule, { valid: [ { name: 'Component with displayName', code: dedent` const MyComponent = React.memo(() =>
Hello
); MyComponent.displayName = 'MyComponent'; `, }, { name: 'Named import with displayName', code: dedent` import { memo } from 'react'; const MyComponent = memo(() =>
Hello
); MyComponent.displayName = 'MyComponent'; `, }, { name: 'Non-component variable', code: dedent` const notAComponent = someFunction(); `, }, { name: 'Exported component with displayName', code: dedent` export const MyComponent = React.memo(() =>
Hello
); MyComponent.displayName = 'MyComponent'; `, }, ], invalid: [ { name: 'Component without displayName', code: dedent` const MyComponent = React.memo(() =>
Hello
); `, errors: [{ messageId: 'missingDisplayName' }], }, { name: 'Exported component without displayName', code: dedent` export const MyComponent = React.memo(() =>
Hello
); `, errors: [{ messageId: 'missingDisplayName' }], }, { name: 'Component with mismatched displayName', code: dedent` const MyComponent = React.memo(() =>
Hello
); MyComponent.displayName = 'Other'; `, errors: [ { messageId: 'mismatchedDisplayName', data: { componentName: 'MyComponent' }, }, ], }, { name: 'Named import without displayName', code: dedent` import { memo } from 'react'; const MyComponent = memo(() =>
Hello
); `, errors: [{ messageId: 'missingDisplayName' }], }, { name: 'Named import with mismatched displayName', code: dedent` import { memo } from 'react'; const MyComponent = memo(() =>
Hello
); MyComponent.displayName = 'Component'; `, errors: [ { messageId: 'mismatchedDisplayName', data: { componentName: 'MyComponent' }, }, ], }, { name: 'Exported component with mismatched displayName', code: dedent` export const MyComponent = React.memo(() =>
Hello
); MyComponent.displayName = 'Component'; `, errors: [ { messageId: 'mismatchedDisplayName', data: { componentName: 'MyComponent' }, }, ], }, ], }); }); describe('ignoreName option', () => { tester.run('display-name with ignoreName', displayNameRule, { valid: [ { name: 'Component with mismatched displayName (ignored)', code: dedent` const MyComponent = React.memo(() =>
Hello
); MyComponent.displayName = 'Other'; `, options: [{ ignoreName: 'MyComponent' }], }, { name: 'Component with displayName', code: dedent` const MyComponent = React.memo(() =>
Hello
); MyComponent.displayName = 'MyComponent'; `, options: [{ ignoreName: ['MyComponent'] }], }, ], invalid: [ { name: 'Component without displayName is still reported', code: dedent` const MyComponent = React.memo(() =>
Hello
); `, options: [{ ignoreName: ['MyComponent'] }], errors: [{ messageId: 'missingDisplayName' }], }, ], }); }); });