Skip to content

Commit 9c89855

Browse files
authored
fix(valid-expect-in-promise): support finally (#914)
1 parent ec432c1 commit 9c89855

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/rules/__tests__/valid-expect-in-promise.test.ts

+37
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,29 @@ ruleTester.run('valid-expect-in-promise', rule, {
2121
});
2222
}));
2323
`,
24+
dedent`
25+
it('it1', () => new Promise((done) => {
26+
test()
27+
.finally(() => {
28+
expect(someThing).toEqual(true);
29+
done();
30+
});
31+
}));
32+
`,
2433
dedent`
2534
it('it1', () => {
2635
return somePromise.then(() => {
2736
expect(someThing).toEqual(true);
2837
});
2938
});
3039
`,
40+
dedent`
41+
it('it1', () => {
42+
return somePromise.finally(() => {
43+
expect(someThing).toEqual(true);
44+
});
45+
});
46+
`,
3147
dedent`
3248
it('it1', function() {
3349
return somePromise.catch(function() {
@@ -234,6 +250,16 @@ ruleTester.run('valid-expect-in-promise', rule, {
234250
`,
235251
errors: [{ column: 3, endColumn: 6, messageId: 'returnPromise' }],
236252
},
253+
{
254+
code: dedent`
255+
it('it1', () => {
256+
somePromise.finally(() => {
257+
expect(someThing).toEqual(true);
258+
});
259+
});
260+
`,
261+
errors: [{ column: 3, endColumn: 6, messageId: 'returnPromise' }],
262+
},
237263
// {
238264
// code: `
239265
// it('it1', () => {
@@ -326,6 +352,17 @@ ruleTester.run('valid-expect-in-promise', rule, {
326352
`,
327353
errors: [{ column: 3, endColumn: 5, messageId: 'returnPromise' }],
328354
},
355+
{
356+
code: dedent`
357+
it('it1', () => {
358+
somePromise.finally(() => {
359+
doSomeOperation();
360+
expect(someThing).toEqual(true);
361+
})
362+
});
363+
`,
364+
errors: [{ column: 3, endColumn: 5, messageId: 'returnPromise' }],
365+
},
329366
{
330367
code: dedent`
331368
test('invalid return', () => {

src/rules/valid-expect-in-promise.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
TSESTree,
55
} from '@typescript-eslint/experimental-utils';
66
import {
7-
CalledKnownMemberExpression,
87
FunctionExpression,
98
KnownCallExpression,
109
TestCaseName,
@@ -18,15 +17,17 @@ import {
1817
type MessageIds = 'returnPromise';
1918
type RuleContext = TSESLint.RuleContext<MessageIds, unknown[]>;
2019

21-
type ThenOrCatchCallExpression = KnownCallExpression<'then' | 'catch'>;
20+
type PromiseChainCallExpression = KnownCallExpression<
21+
'then' | 'catch' | 'finally'
22+
>;
2223

23-
const isThenOrCatchCall = (
24+
const isPromiseChainCall = (
2425
node: TSESTree.Node,
25-
): node is ThenOrCatchCallExpression =>
26+
): node is PromiseChainCallExpression =>
2627
node.type === AST_NODE_TYPES.CallExpression &&
2728
node.callee.type === AST_NODE_TYPES.MemberExpression &&
2829
isSupportedAccessor(node.callee.property) &&
29-
['then', 'catch'].includes(getAccessorValue(node.callee.property));
30+
['then', 'catch', 'finally'].includes(getAccessorValue(node.callee.property));
3031

3132
const isExpectCallPresentInFunction = (body: TSESTree.Node) => {
3233
if (body.type === AST_NODE_TYPES.BlockStatement) {
@@ -122,7 +123,7 @@ const isParentThenOrPromiseReturned = (
122123

123124
const verifyExpectWithReturn = (
124125
promiseCallbacks: Array<TSESTree.CallExpressionArgument | undefined>,
125-
node: CalledKnownMemberExpression<'then' | 'catch'>,
126+
node: PromiseChainCallExpression['callee'],
126127
context: RuleContext,
127128
testFunctionBody: TSESTree.Statement[],
128129
) => {
@@ -167,7 +168,7 @@ export default createRule<unknown[], MessageIds>({
167168
return {
168169
CallExpression(node) {
169170
if (
170-
!isThenOrCatchCall(node) ||
171+
!isPromiseChainCall(node) ||
171172
(node.parent && node.parent.type === AST_NODE_TYPES.AwaitExpression)
172173
) {
173174
return;

0 commit comments

Comments
 (0)