eng: add a basic 'must use result' and ensure assertSnapshot result is used (#194744)

* eng: add a basic 'must use result' and ensure assertSnapshot result is used

Fixes #194570

* fix found lint
This commit is contained in:
Connor Peet 2023-10-03 12:08:56 -07:00 committed by GitHub
parent 9106c6421b
commit 331e445eff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 4 deletions

View file

@ -0,0 +1,35 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
const VALID_USES = new Set<TSESTree.AST_NODE_TYPES | undefined>([
TSESTree.AST_NODE_TYPES.AwaitExpression,
TSESTree.AST_NODE_TYPES.VariableDeclarator,
]);
export = new class MustUseResults implements eslint.Rule.RuleModule {
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const config = <{ message: string, functions: string[] }[]>context.options[0];
const listener: eslint.Rule.RuleListener = {};
for (const { message, functions } of config) {
for (const fn of functions) {
const query = `CallExpression[callee.property.name='${fn}'], CallExpression[callee.name='${fn}']`
listener[query] = (node: any) => {
const cast: TSESTree.CallExpression = node;
if (!VALID_USES.has(cast.parent?.type)) {
context.report({ node, message });
}
}
}
}
return listener;
}
};

View file

@ -140,7 +140,18 @@
"rules": {
"local/code-no-test-only": "error",
"local/code-no-test-async-suite": "warn",
"local/code-no-unexternalized-strings": "off"
"local/code-no-unexternalized-strings": "off",
"local/code-must-use-result": [
"warn",
[
{
"message": "Expression must be awaited",
"functions": [
"assertSnapshot"
]
}
]
]
}
},
{

View file

@ -257,7 +257,7 @@ suite('Chat', () => {
const model = testDisposables.add(testService.startSession(providerId, CancellationToken.None));
assert.strictEqual(model.getRequests().length, 0);
assertSnapshot(model.toExport());
await assertSnapshot(model.toExport());
const response = await testService.sendRequest(model.sessionId, 'test request');
assert(response);
@ -266,7 +266,7 @@ suite('Chat', () => {
assert.strictEqual(model.getRequests().length, 1);
assertSnapshot(model.toExport());
await assertSnapshot(model.toExport());
});
test('can deserialize', async () => {
@ -306,6 +306,6 @@ suite('Chat', () => {
dispose: () => testService2.clearSession(serializedChatData.sessionId)
});
assertSnapshot(chatModel2.toExport());
await assertSnapshot(chatModel2.toExport());
});
});