diff --git a/src/rules/__tests__/prefer-to-be.test.ts b/src/rules/__tests__/prefer-to-be.test.ts index 3b9a6ac0a..5b810b061 100644 --- a/src/rules/__tests__/prefer-to-be.test.ts +++ b/src/rules/__tests__/prefer-to-be.test.ts @@ -1,7 +1,13 @@ import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule from '../prefer-to-be'; +import { espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new TSESLint.RuleTester({ + parser: espreeParser, + parserOptions: { + ecmaVersion: 2015, + }, +}); ruleTester.run('prefer-to-be', rule, { valid: [ @@ -16,6 +22,7 @@ ruleTester.run('prefer-to-be', rule, { 'expect("something");', 'expect(token).toStrictEqual(/[abc]+/g);', "expect(token).toStrictEqual(new RegExp('[abc]+', 'g'));", + 'expect(value).toEqual(dedent`my string`);', ], invalid: [ { @@ -33,6 +40,16 @@ ruleTester.run('prefer-to-be', rule, { output: 'expect(value).toBe(1);', errors: [{ messageId: 'useToBe', column: 15, line: 1 }], }, + { + code: 'expect(value).toEqual(`my string`);', + output: 'expect(value).toBe(`my string`);', + errors: [{ messageId: 'useToBe', column: 15, line: 1 }], + }, + { + code: 'expect(value).toStrictEqual(`my ${string}`);', + output: 'expect(value).toBe(`my ${string}`);', + errors: [{ messageId: 'useToBe', column: 15, line: 1 }], + }, { code: 'expect(loadMessage()).resolves.toStrictEqual("hello world");', output: 'expect(loadMessage()).resolves.toBe("hello world");', diff --git a/src/rules/prefer-to-be.ts b/src/rules/prefer-to-be.ts index 165a129d7..f45e814fd 100644 --- a/src/rules/prefer-to-be.ts +++ b/src/rules/prefer-to-be.ts @@ -35,10 +35,16 @@ const isFirstArgumentIdentifier = ( name: string, ) => isIdentifier(getFirstArgument(matcher), name); -const isPrimitiveLiteral = (matcher: ParsedEqualityMatcherCall): boolean => { +const shouldUseToBe = (matcher: ParsedEqualityMatcherCall): boolean => { const firstArg = getFirstArgument(matcher); - return firstArg.type === AST_NODE_TYPES.Literal && !('regex' in firstArg); + if (firstArg.type === AST_NODE_TYPES.Literal) { + // regex literals are classed as literals, but they're actually objects + // which means "toBe" will give different results than other matchers + return !('regex' in firstArg); + } + + return firstArg.type === AST_NODE_TYPES.TemplateLiteral; }; const getFirstArgument = (matcher: ParsedEqualityMatcherCall) => { @@ -164,10 +170,7 @@ export default createRule({ return; } - if ( - isPrimitiveLiteral(matcher) && - matcher.name !== EqualityMatcher.toBe - ) { + if (shouldUseToBe(matcher) && matcher.name !== EqualityMatcher.toBe) { reportPreferToBe(context, '', matcher); } },