Skip to content

Commit aa428e6

Browse files
authored
fix(prefer-to-be): support template literals (#1006)
1 parent 4fe66ce commit aa428e6

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

src/rules/__tests__/prefer-to-be.test.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { TSESLint } from '@typescript-eslint/experimental-utils';
22
import rule from '../prefer-to-be';
3+
import { espreeParser } from './test-utils';
34

4-
const ruleTester = new TSESLint.RuleTester();
5+
const ruleTester = new TSESLint.RuleTester({
6+
parser: espreeParser,
7+
parserOptions: {
8+
ecmaVersion: 2015,
9+
},
10+
});
511

612
ruleTester.run('prefer-to-be', rule, {
713
valid: [
@@ -16,6 +22,7 @@ ruleTester.run('prefer-to-be', rule, {
1622
'expect("something");',
1723
'expect(token).toStrictEqual(/[abc]+/g);',
1824
"expect(token).toStrictEqual(new RegExp('[abc]+', 'g'));",
25+
'expect(value).toEqual(dedent`my string`);',
1926
],
2027
invalid: [
2128
{
@@ -33,6 +40,16 @@ ruleTester.run('prefer-to-be', rule, {
3340
output: 'expect(value).toBe(1);',
3441
errors: [{ messageId: 'useToBe', column: 15, line: 1 }],
3542
},
43+
{
44+
code: 'expect(value).toEqual(`my string`);',
45+
output: 'expect(value).toBe(`my string`);',
46+
errors: [{ messageId: 'useToBe', column: 15, line: 1 }],
47+
},
48+
{
49+
code: 'expect(value).toStrictEqual(`my ${string}`);',
50+
output: 'expect(value).toBe(`my ${string}`);',
51+
errors: [{ messageId: 'useToBe', column: 15, line: 1 }],
52+
},
3653
{
3754
code: 'expect(loadMessage()).resolves.toStrictEqual("hello world");',
3855
output: 'expect(loadMessage()).resolves.toBe("hello world");',

src/rules/prefer-to-be.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,16 @@ const isFirstArgumentIdentifier = (
3535
name: string,
3636
) => isIdentifier(getFirstArgument(matcher), name);
3737

38-
const isPrimitiveLiteral = (matcher: ParsedEqualityMatcherCall): boolean => {
38+
const shouldUseToBe = (matcher: ParsedEqualityMatcherCall): boolean => {
3939
const firstArg = getFirstArgument(matcher);
4040

41-
return firstArg.type === AST_NODE_TYPES.Literal && !('regex' in firstArg);
41+
if (firstArg.type === AST_NODE_TYPES.Literal) {
42+
// regex literals are classed as literals, but they're actually objects
43+
// which means "toBe" will give different results than other matchers
44+
return !('regex' in firstArg);
45+
}
46+
47+
return firstArg.type === AST_NODE_TYPES.TemplateLiteral;
4248
};
4349

4450
const getFirstArgument = (matcher: ParsedEqualityMatcherCall) => {
@@ -164,10 +170,7 @@ export default createRule({
164170
return;
165171
}
166172

167-
if (
168-
isPrimitiveLiteral(matcher) &&
169-
matcher.name !== EqualityMatcher.toBe
170-
) {
173+
if (shouldUseToBe(matcher) && matcher.name !== EqualityMatcher.toBe) {
171174
reportPreferToBe(context, '', matcher);
172175
}
173176
},

0 commit comments

Comments
 (0)