@checkdigit/eslint-plugin 7.6.0-PR.75-5da1 → 7.6.0-PR.75-1b09

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,343 @@
1
+ // src/agent/no-supertest.ts
2
+ import { strict as assert } from "node:assert";
3
+ import "eslint";
4
+ import {
5
+ getEnclosingFunction,
6
+ getEnclosingScopeNode,
7
+ getEnclosingStatement,
8
+ getParent,
9
+ isUsedInArrayOrAsArgument
10
+ } from "../library/tree.mjs";
11
+ import getDocumentationUrl from "../get-documentation-url.mjs";
12
+ import { getIndentation } from "../library/format.mjs";
13
+ import { analyzeResponseReferences } from "./response-reference.mjs";
14
+ import { getResponseBodyRetrievalText, getResponseHeadersRetrievalText } from "./fetch.mjs";
15
+ var ruleId = "no-supertest";
16
+ function analyzeFixtureCall(call, results, sourceCode) {
17
+ const parent = getParent(call);
18
+ assert.ok(parent, "parent should exist for fixture/supertest call node");
19
+ let nextCall;
20
+ if (parent.type === "ReturnStatement") {
21
+ results.fixtureNode = call;
22
+ results.rootNode = parent;
23
+ } else if (parent.type === "ArrayExpression" || parent.type === "CallExpression" || parent.type === "ArrowFunctionExpression") {
24
+ results.fixtureNode = call;
25
+ results.rootNode = call;
26
+ } else if (parent.type === "AwaitExpression") {
27
+ results.fixtureNode = call;
28
+ const enclosingStatement = getEnclosingStatement(parent);
29
+ assert.ok(enclosingStatement);
30
+ const awaitParent = getParent(parent);
31
+ if (awaitParent?.type === "MemberExpression") {
32
+ results.rootNode = parent;
33
+ results.inlineStatementNode = enclosingStatement;
34
+ if (awaitParent.property.type === "Identifier" && awaitParent.property.name === "body") {
35
+ results.inlineBodyReference = awaitParent;
36
+ }
37
+ if (awaitParent.property.type === "Identifier" && (awaitParent.property.name === "header" || awaitParent.property.name === "headers")) {
38
+ results.inlineHeadersReference = awaitParent;
39
+ }
40
+ } else if (enclosingStatement.type === "VariableDeclaration") {
41
+ results.variableDeclaration = enclosingStatement;
42
+ results.rootNode = enclosingStatement;
43
+ } else if (enclosingStatement.type === "ExpressionStatement" && enclosingStatement.expression.type === "AssignmentExpression") {
44
+ results.variableAssignment = enclosingStatement;
45
+ results.rootNode = enclosingStatement;
46
+ } else {
47
+ results.rootNode = parent;
48
+ }
49
+ } else if (parent.type === "MemberExpression" && parent.property.type === "Identifier") {
50
+ if (parent.property.name === "expect") {
51
+ const assertionCall = getParent(parent);
52
+ assert.ok(assertionCall && assertionCall.type === "CallExpression");
53
+ results.assertions = [...results.assertions ?? [], assertionCall.arguments];
54
+ nextCall = assertionCall;
55
+ } else if (parent.property.name === "send") {
56
+ const sendRequestBodyCall = getParent(parent);
57
+ assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === "CallExpression");
58
+ results.requestBody = sendRequestBodyCall.arguments[0];
59
+ nextCall = sendRequestBodyCall;
60
+ } else if (parent.property.name === "set") {
61
+ const setRequestHeaderCall = getParent(parent);
62
+ assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === "CallExpression");
63
+ const [arg1, arg2] = setRequestHeaderCall.arguments;
64
+ if (arg1.type === "ObjectExpression") {
65
+ results.requestHeadersObjectLiteral = arg1;
66
+ } else {
67
+ results.requestHeaders = [...results.requestHeaders ?? [], { name: arg1, value: arg2 }];
68
+ }
69
+ nextCall = setRequestHeaderCall;
70
+ }
71
+ } else {
72
+ throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
73
+ }
74
+ if (nextCall) {
75
+ analyzeFixtureCall(nextCall, results, sourceCode);
76
+ }
77
+ }
78
+ function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName, destructuringResponseHeadersVariable) {
79
+ let statusAssertion;
80
+ const nonStatusAssertions = [];
81
+ for (const expectArguments of fixtureCallInformation.assertions ?? []) {
82
+ if (expectArguments.length === 1) {
83
+ const [assertionArgument] = expectArguments;
84
+ assert.ok(assertionArgument);
85
+ if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal" || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
86
+ statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
87
+ } else if (assertionArgument.type === "ArrowFunctionExpression") {
88
+ let functionBody = sourceCode.getText(assertionArgument.body);
89
+ const [originalResponseArgument] = assertionArgument.params;
90
+ assert.ok(originalResponseArgument?.type === "Identifier");
91
+ const originalResponseArgumentName = originalResponseArgument.name;
92
+ if (originalResponseArgumentName !== responseVariableName) {
93
+ functionBody = functionBody.replace(
94
+ new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
95
+ responseVariableName
96
+ );
97
+ }
98
+ nonStatusAssertions.push(`assert.doesNotThrow(()=>${functionBody})`);
99
+ } else if (assertionArgument.type === "Identifier") {
100
+ nonStatusAssertions.push(
101
+ `assert.doesNotThrow(()=>${sourceCode.getText(assertionArgument)}(${responseVariableName}))`
102
+ );
103
+ } else if (assertionArgument.type === "ObjectExpression" || assertionArgument.type === "CallExpression") {
104
+ nonStatusAssertions.push(
105
+ `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
106
+ );
107
+ } else {
108
+ throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
109
+ }
110
+ } else if (expectArguments.length === 2) {
111
+ const [headerName, headerValue] = expectArguments;
112
+ assert.ok(headerName && headerValue);
113
+ const headersReference = destructuringResponseHeadersVariable !== void 0 ? destructuringResponseHeadersVariable.name : `${responseVariableName}.headers`;
114
+ if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
115
+ nonStatusAssertions.push(
116
+ `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
117
+ );
118
+ } else {
119
+ nonStatusAssertions.push(
120
+ `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
121
+ );
122
+ }
123
+ }
124
+ }
125
+ return {
126
+ statusAssertion,
127
+ nonStatusAssertions
128
+ };
129
+ }
130
+ function getResponseVariableNameToUse(scopeManager, fixtureCallInformation, scopeVariablesMap) {
131
+ if (fixtureCallInformation.variableAssignment) {
132
+ assert.ok(
133
+ fixtureCallInformation.variableAssignment.expression.type === "AssignmentExpression" && fixtureCallInformation.variableAssignment.expression.left.type === "Identifier"
134
+ );
135
+ return fixtureCallInformation.variableAssignment.expression.left.name;
136
+ }
137
+ if (fixtureCallInformation.variableDeclaration) {
138
+ const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
139
+ if (firstDeclaration && firstDeclaration.id.type === "Identifier") {
140
+ return firstDeclaration.id.name;
141
+ }
142
+ }
143
+ const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
144
+ scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
145
+ assert.ok(enclosingScopeNode);
146
+ const scope = scopeManager.acquire(enclosingScopeNode);
147
+ assert.ok(scope !== null);
148
+ let scopeVariables = scopeVariablesMap.get(scope);
149
+ if (!scopeVariables) {
150
+ scopeVariables = [...scope.set.keys()];
151
+ scopeVariablesMap.set(scope, scopeVariables);
152
+ }
153
+ let responseVariableCounter = 0;
154
+ let responseVariableNameToUse;
155
+ while (responseVariableNameToUse === void 0) {
156
+ responseVariableCounter++;
157
+ responseVariableNameToUse = `response${responseVariableCounter === 1 ? "" : responseVariableCounter.toString()}`;
158
+ if (scopeVariables.includes(responseVariableNameToUse)) {
159
+ responseVariableNameToUse = void 0;
160
+ }
161
+ }
162
+ scopeVariables.push(responseVariableNameToUse);
163
+ return responseVariableNameToUse;
164
+ }
165
+ function isResponseBodyRedefinition(responseBodyReference) {
166
+ const parent = getParent(responseBodyReference);
167
+ return parent?.type === "VariableDeclarator" && parent.id.type === "Identifier";
168
+ }
169
+ var rule = {
170
+ meta: {
171
+ type: "suggestion",
172
+ docs: {
173
+ description: "Transform supertest assersions to regular node assertions.",
174
+ url: getDocumentationUrl(ruleId)
175
+ },
176
+ messages: {
177
+ preferNativeFetch: "Transform supertest assersions to regular node assertions.",
178
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
179
+ },
180
+ fixable: "code",
181
+ schema: []
182
+ },
183
+ // eslint-disable-next-line max-lines-per-function
184
+ create(context) {
185
+ const sourceCode = context.sourceCode;
186
+ const scopeManager = sourceCode.scopeManager;
187
+ const scopeVariablesMap = /* @__PURE__ */ new Map();
188
+ return {
189
+ // eslint-disable-next-line max-lines-per-function
190
+ 'CallExpression[callee.property.name="expect"]': (supertestCall) => {
191
+ assert.ok(supertestCall.callee.type === "MemberExpression");
192
+ if (supertestCall.callee.object.type === "CallExpression" && supertestCall.callee.object.callee.type === "MemberExpression" && supertestCall.callee.object.callee.property.type === "Identifier" && supertestCall.callee.object.callee.property.name === "expect") {
193
+ return;
194
+ }
195
+ try {
196
+ if (isUsedInArrayOrAsArgument(supertestCall) || getEnclosingFunction(supertestCall)?.async === false) {
197
+ return;
198
+ }
199
+ assert.ok(supertestCall.type === "CallExpression");
200
+ const fixtureFunction = supertestCall.callee.object;
201
+ if (fixtureFunction.type !== "CallExpression") {
202
+ return;
203
+ }
204
+ const indentation = getIndentation(supertestCall, sourceCode);
205
+ const fixtureCallInformation = {};
206
+ analyzeFixtureCall(fixtureFunction, fixtureCallInformation, sourceCode);
207
+ sourceCode.getText(fixtureCallInformation.fixtureNode);
208
+ sourceCode.getText(fixtureCallInformation.rootNode);
209
+ fixtureCallInformation.assertions?.flat().map((ass) => sourceCode.getText(ass));
210
+ const {
211
+ variable: responseVariable,
212
+ bodyReferences: responseBodyReferences,
213
+ headersReferences: responseHeadersReferences,
214
+ statusReferences: responseStatusReferences,
215
+ destructuringBodyVariable: destructuringResponseBodyVariable,
216
+ destructuringHeadersVariable: destructuringResponseHeadersVariable
217
+ } = analyzeResponseReferences(fixtureCallInformation.variableDeclaration, scopeManager);
218
+ const responseVariableNameToUse = getResponseVariableNameToUse(
219
+ scopeManager,
220
+ fixtureCallInformation,
221
+ scopeVariablesMap
222
+ );
223
+ const isResponseBodyVariableRedefinitionNeeded = destructuringResponseBodyVariable !== void 0 || fixtureCallInformation.inlineBodyReference !== void 0 || responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition);
224
+ const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
225
+ const isResponseHeadersVariableRedefinitionNeeded = destructuringResponseHeadersVariable !== void 0 && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
226
+ destructuringResponseHeadersVariable.type === "ObjectPattern" || fixtureCallInformation.inlineHeadersReference !== void 0;
227
+ const redefineResponseHeadersVariableName = `${responseVariableNameToUse}Headers`;
228
+ const isResponseVariableRedefinitionNeeded = fixtureCallInformation.variableAssignment === void 0 && responseVariable === void 0 && fixtureCallInformation.assertions !== void 0 || isResponseBodyVariableRedefinitionNeeded || isResponseHeadersVariableRedefinitionNeeded;
229
+ const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded ? [
230
+ // eslint-disable-next-line no-nested-ternary
231
+ ...destructuringResponseBodyVariable ? [
232
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
233
+ `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseBodyVariable.type === "ObjectPattern" ? sourceCode.getText(destructuringResponseBodyVariable) : destructuringResponseBodyVariable.name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
234
+ ] : isResponseBodyVariableRedefinitionNeeded ? [
235
+ `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
236
+ ] : [],
237
+ // eslint-disable-next-line no-nested-ternary
238
+ ...destructuringResponseHeadersVariable ? (
239
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
240
+ destructuringResponseHeadersVariable.type === "ObjectPattern" ? destructuringResponseHeadersVariable.properties.map((property) => {
241
+ assert.ok(property.type === "Property");
242
+ assert.equal(property.value.type, "Identifier");
243
+ return `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${property.value.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}.get(${property.key.type === "Literal" ? sourceCode.getText(property.key) : `'${sourceCode.getText(property.key)}'`})`;
244
+ }) : [
245
+ `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseHeadersVariable.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
246
+ ]
247
+ ) : isResponseHeadersVariableRedefinitionNeeded ? [
248
+ `const ${redefineResponseHeadersVariableName} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
249
+ ] : []
250
+ ] : [];
251
+ const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
252
+ fixtureCallInformation,
253
+ sourceCode,
254
+ responseVariableNameToUse,
255
+ destructuringResponseHeadersVariable
256
+ );
257
+ const fetchCallText = sourceCode.getText(fixtureFunction);
258
+ const fetchStatementText = !isResponseVariableRedefinitionNeeded ? fetchCallText : `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${responseVariableNameToUse} = await ${fetchCallText}`;
259
+ const nodeToReplace = isResponseVariableRedefinitionNeeded ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
260
+ const appendingAssignmentAndAssertionText = [
261
+ "",
262
+ ...statusAssertion !== void 0 ? [statusAssertion] : [],
263
+ ...responseBodyHeadersVariableRedefineLines,
264
+ ...nonStatusAssertions
265
+ ].join(`;
266
+ ${indentation}`);
267
+ context.report({
268
+ node: supertestCall,
269
+ messageId: "preferNativeFetch",
270
+ *fix(fixer) {
271
+ if (fixtureCallInformation.inlineStatementNode) {
272
+ const preInlineDeclaration = [
273
+ fetchStatementText,
274
+ `${appendingAssignmentAndAssertionText};
275
+ ${indentation}`
276
+ ].join(``);
277
+ yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
278
+ } else {
279
+ yield fixer.replaceText(nodeToReplace, fetchStatementText);
280
+ const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
281
+ yield fixer.insertTextAfter(
282
+ nodeToReplace,
283
+ needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
284
+ );
285
+ }
286
+ for (const responseBodyReference of responseBodyReferences) {
287
+ yield fixer.replaceText(
288
+ responseBodyReference,
289
+ isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference) ? redefineResponseBodyVariableName : getResponseBodyRetrievalText(responseVariableNameToUse)
290
+ );
291
+ }
292
+ if (fixtureCallInformation.inlineBodyReference) {
293
+ yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
294
+ }
295
+ for (const responseHeadersReference of responseHeadersReferences) {
296
+ const parent = getParent(responseHeadersReference);
297
+ assert.ok(parent);
298
+ let headerName;
299
+ if (parent.type === "MemberExpression") {
300
+ const headerNameNode = parent.property;
301
+ headerName = parent.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`;
302
+ } else if (parent.type === "CallExpression") {
303
+ const headerNameNode = parent.arguments[0];
304
+ headerName = sourceCode.getText(headerNameNode);
305
+ }
306
+ assert.ok(headerName !== void 0);
307
+ yield fixer.replaceText(parent, `${responseVariableNameToUse}.headers.get(${headerName})`);
308
+ }
309
+ for (const responseStatusReference of responseStatusReferences) {
310
+ if (responseStatusReference.property.type === "Identifier" && responseStatusReference.property.name === "statusCode") {
311
+ yield fixer.replaceText(responseStatusReference.property, `status`);
312
+ }
313
+ }
314
+ if (fixtureCallInformation.rootNode.type === "ReturnStatement" && fixtureCallInformation.assertions !== void 0) {
315
+ yield fixer.insertTextAfter(
316
+ fixtureCallInformation.rootNode,
317
+ `
318
+ ${indentation}return ${responseVariableNameToUse};`
319
+ );
320
+ }
321
+ }
322
+ });
323
+ } catch (error) {
324
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
325
+ context.report({
326
+ node: supertestCall,
327
+ messageId: "unknownError",
328
+ data: {
329
+ fileName: context.filename,
330
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
331
+ }
332
+ });
333
+ }
334
+ }
335
+ };
336
+ }
337
+ };
338
+ var no_supertest_default = rule;
339
+ export {
340
+ no_supertest_default as default,
341
+ ruleId
342
+ };
343
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXN1cGVydGVzdC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLFVBQVUsY0FBYztBQWVqQyxPQUFrRDtBQUVsRDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8seUJBQXlCO0FBQ2hDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsOEJBQThCLHVDQUF1QztBQUV2RSxJQUFNLFNBQVM7QUFrQnRCLFNBQVMsbUJBQW1CLE1BQTRCLFNBQWlDLFlBQXdCO0FBQy9HLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsU0FBTyxHQUFHLFFBQVEscURBQXFEO0FBRXZFLE1BQUk7QUFDSixNQUFJLE9BQU8sU0FBUyxtQkFBbUI7QUFFckMsWUFBUSxjQUFjO0FBQ3RCLFlBQVEsV0FBVztBQUFBLEVBQ3JCLFdBQ0UsT0FBTyxTQUFTLHFCQUNoQixPQUFPLFNBQVMsb0JBQ2hCLE9BQU8sU0FBUywyQkFDaEI7QUFFQSxZQUFRLGNBQWM7QUFDdEIsWUFBUSxXQUFXO0FBQUEsRUFDckIsV0FBVyxPQUFPLFNBQVMsbUJBQW1CO0FBQzVDLFlBQVEsY0FBYztBQUN0QixVQUFNLHFCQUFxQixzQkFBc0IsTUFBTTtBQUN2RCxXQUFPLEdBQUcsa0JBQWtCO0FBQzVCLFVBQU0sY0FBYyxVQUFVLE1BQU07QUFDcEMsUUFBSSxhQUFhLFNBQVMsb0JBQW9CO0FBQzVDLGNBQVEsV0FBVztBQUNuQixjQUFRLHNCQUFzQjtBQUM5QixVQUFJLFlBQVksU0FBUyxTQUFTLGdCQUFnQixZQUFZLFNBQVMsU0FBUyxRQUFRO0FBQ3RGLGdCQUFRLHNCQUFzQjtBQUFBLE1BQ2hDO0FBQ0EsVUFDRSxZQUFZLFNBQVMsU0FBUyxpQkFDN0IsWUFBWSxTQUFTLFNBQVMsWUFBWSxZQUFZLFNBQVMsU0FBUyxZQUN6RTtBQUNBLGdCQUFRLHlCQUF5QjtB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
@@ -13,6 +13,7 @@ import fixFunctionCallArguments, {
13
13
  import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from "./invalid-json-stringify.mjs";
14
14
  import noDuplicatedImports, { ruleId as noDuplicatedImportsRuleId } from "./no-duplicated-imports.mjs";
15
15
  import noFixture, { ruleId as noFixtureRuleId } from "./agent/no-fixture.mjs";
16
+ import noSupertest, { ruleId as noSupertestRuleId } from "./agent/no-supertest.mjs";
16
17
  import noLegacyServiceTyping, { ruleId as noLegacyServiceTypingRuleId } from "./no-legacy-service-typing.mjs";
17
18
  import noMappedResponse, { ruleId as noMappedResponseRuleId } from "./agent/no-mapped-response.mjs";
18
19
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from "./no-promise-instance-method.mjs";
@@ -62,6 +63,7 @@ var rules = {
62
63
  [invalidJsonStringifyRuleId]: invalidJsonStringify,
63
64
  [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
64
65
  [noFixtureRuleId]: noFixture,
66
+ [noSupertestRuleId]: noSupertest,
65
67
  [fetchThenRuleId]: fetchThen,
66
68
  [noServiceWrapperRuleId]: noServiceWrapper,
67
69
  [noStatusCodeRuleId]: noStatusCode,
@@ -119,6 +121,7 @@ var configs = {
119
121
  [`@checkdigit/${noMappedResponseRuleId}`]: "off",
120
122
  [`@checkdigit/${addUrlDomainRuleId}`]: "off",
121
123
  [`@checkdigit/${noFixtureRuleId}`]: "off",
124
+ [`@checkdigit/${noSupertestRuleId}`]: "off",
122
125
  [`@checkdigit/${noServiceWrapperRuleId}`]: "off",
123
126
  [`@checkdigit/${noStatusCodeRuleId}`]: "off",
124
127
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "off",
@@ -167,6 +170,7 @@ var configs = {
167
170
  [`@checkdigit/${noMappedResponseRuleId}`]: "off",
168
171
  [`@checkdigit/${addUrlDomainRuleId}`]: "off",
169
172
  [`@checkdigit/${noFixtureRuleId}`]: "off",
173
+ [`@checkdigit/${noSupertestRuleId}`]: "off",
170
174
  [`@checkdigit/${noServiceWrapperRuleId}`]: "off",
171
175
  [`@checkdigit/${noStatusCodeRuleId}`]: "off",
172
176
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "off",
@@ -209,7 +213,8 @@ var configs = {
209
213
  [`@checkdigit/${addBasePathConstRuleId}`]: "error",
210
214
  [`@checkdigit/${addBasePathImportRuleId}`]: "error",
211
215
  [`@checkdigit/${addAssertImportRuleId}`]: "error",
212
- [`@checkdigit/${noFixtureRuleId}`]: "error"
216
+ [`@checkdigit/${noFixtureRuleId}`]: "error",
217
+ [`@checkdigit/${noSupertestRuleId}`]: "error"
213
218
  }
214
219
  },
215
220
  {
@@ -258,4 +263,4 @@ var src_default = defaultToExport;
258
263
  export {
259
264
  src_default as default
260
265
  };
261
- //# sourceMappingURL=data:application/json;base64,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
266
+ //# sourceMappingURL=data:application/json;base64,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
@@ -0,0 +1,4 @@
1
+ import { type Rule } from 'eslint';
2
+ export declare const ruleId = "no-supertest";
3
+ declare const rule: Rule.RuleModule;
4
+ export default rule;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"7.6.0-PR.75-5da1","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"^8.15.0","@typescript-eslint/utils":"^8.15.0","debug":"^4.3.7","ts-api-utils":"^1.4.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.1","@checkdigit/typescript-config":"^8.0.0","@eslint/js":"^9.15.0","@types/debug":"^4.1.12","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.15.0","@typescript-eslint/rule-tester":"^8.15.0","eslint":"^9.15.0","eslint-config-prettier":"^9.1.0","eslint-import-resolver-typescript":"^3.6.3","eslint-plugin-eslint-plugin":"^6.3.2","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^1.1.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","http-status-codes":"^2.3.0","rimraf":"^6.0.1","typescript-eslint":"^8.15.0"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=20.17"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"7.6.0-PR.75-1b09","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"^8.15.0","@typescript-eslint/utils":"^8.15.0","debug":"^4.3.7","ts-api-utils":"^1.4.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.1","@checkdigit/typescript-config":"^8.0.0","@eslint/js":"^9.15.0","@types/debug":"^4.1.12","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.15.0","@typescript-eslint/rule-tester":"^8.15.0","eslint":"^9.15.0","eslint-config-prettier":"^9.1.0","eslint-import-resolver-typescript":"^3.6.3","eslint-plugin-eslint-plugin":"^6.3.2","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^1.1.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","http-status-codes":"^2.3.0","rimraf":"^6.0.1","typescript-eslint":"^8.15.0"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=20.17"}}
@@ -0,0 +1,497 @@
1
+ // agent/no-supertest.ts
2
+
3
+ /*
4
+ * Copyright (c) 2021-2024 Check Digit, LLC
5
+ *
6
+ * This code is licensed under the MIT license (see LICENSE.txt for details).
7
+ */
8
+
9
+ import { strict as assert } from 'node:assert';
10
+
11
+ import type {
12
+ AwaitExpression,
13
+ CallExpression,
14
+ Expression,
15
+ ExpressionStatement,
16
+ MemberExpression,
17
+ Node,
18
+ ObjectExpression,
19
+ ObjectPattern,
20
+ ReturnStatement,
21
+ SimpleCallExpression,
22
+ VariableDeclaration,
23
+ } from 'estree';
24
+ import { type Rule, type Scope, SourceCode } from 'eslint';
25
+
26
+ import {
27
+ getEnclosingFunction,
28
+ getEnclosingScopeNode,
29
+ getEnclosingStatement,
30
+ getParent,
31
+ isUsedInArrayOrAsArgument,
32
+ } from '../library/tree';
33
+ import getDocumentationUrl from '../get-documentation-url';
34
+ import { getIndentation } from '../library/format';
35
+ import { analyzeResponseReferences } from './response-reference';
36
+ import { getResponseBodyRetrievalText, getResponseHeadersRetrievalText } from './fetch';
37
+
38
+ export const ruleId = 'no-supertest';
39
+
40
+ interface FixtureCallInformation {
41
+ rootNode: AwaitExpression | ReturnStatement | VariableDeclaration | SimpleCallExpression | ExpressionStatement;
42
+ fixtureNode: AwaitExpression | SimpleCallExpression;
43
+ variableDeclaration?: VariableDeclaration;
44
+ variableAssignment?: ExpressionStatement;
45
+ requestBody?: Expression;
46
+ requestHeaders?: { name: Expression; value: Expression }[];
47
+ requestHeadersObjectLiteral?: ObjectExpression;
48
+ assertions?: Expression[][];
49
+ inlineStatementNode?: Node;
50
+ inlineBodyReference?: MemberExpression;
51
+ inlineHeadersReference?: MemberExpression;
52
+ }
53
+
54
+ // recursively analyze the fixture/supertest call chain to collect information of request/response
55
+ // eslint-disable-next-line sonarjs/cognitive-complexity
56
+ function analyzeFixtureCall(call: SimpleCallExpression, results: FixtureCallInformation, sourceCode: SourceCode) {
57
+ const parent = getParent(call);
58
+ assert.ok(parent, 'parent should exist for fixture/supertest call node');
59
+
60
+ let nextCall;
61
+ if (parent.type === 'ReturnStatement') {
62
+ // direct return, no variable declaration or await
63
+ results.fixtureNode = call;
64
+ results.rootNode = parent;
65
+ } else if (
66
+ parent.type === 'ArrayExpression' ||
67
+ parent.type === 'CallExpression' ||
68
+ parent.type === 'ArrowFunctionExpression'
69
+ ) {
70
+ // direct return, no variable declaration or await
71
+ results.fixtureNode = call;
72
+ results.rootNode = call;
73
+ } else if (parent.type === 'AwaitExpression') {
74
+ results.fixtureNode = call;
75
+ const enclosingStatement = getEnclosingStatement(parent);
76
+ assert.ok(enclosingStatement);
77
+ const awaitParent = getParent(parent);
78
+ if (awaitParent?.type === 'MemberExpression') {
79
+ results.rootNode = parent;
80
+ results.inlineStatementNode = enclosingStatement;
81
+ if (awaitParent.property.type === 'Identifier' && awaitParent.property.name === 'body') {
82
+ results.inlineBodyReference = awaitParent;
83
+ }
84
+ if (
85
+ awaitParent.property.type === 'Identifier' &&
86
+ (awaitParent.property.name === 'header' || awaitParent.property.name === 'headers')
87
+ ) {
88
+ results.inlineHeadersReference = awaitParent;
89
+ }
90
+ } else if (enclosingStatement.type === 'VariableDeclaration') {
91
+ results.variableDeclaration = enclosingStatement;
92
+ results.rootNode = enclosingStatement;
93
+ } else if (
94
+ enclosingStatement.type === 'ExpressionStatement' &&
95
+ enclosingStatement.expression.type === 'AssignmentExpression'
96
+ ) {
97
+ results.variableAssignment = enclosingStatement;
98
+ results.rootNode = enclosingStatement;
99
+ } else {
100
+ results.rootNode = parent;
101
+ }
102
+ } else if (parent.type === 'MemberExpression' && parent.property.type === 'Identifier') {
103
+ if (parent.property.name === 'expect') {
104
+ // supertest assertions
105
+ const assertionCall = getParent(parent);
106
+ assert.ok(assertionCall && assertionCall.type === 'CallExpression');
107
+ results.assertions = [...(results.assertions ?? []), assertionCall.arguments as Expression[]];
108
+ nextCall = assertionCall;
109
+ } else if (parent.property.name === 'send') {
110
+ // request body
111
+ const sendRequestBodyCall = getParent(parent);
112
+ assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === 'CallExpression');
113
+ results.requestBody = sendRequestBodyCall.arguments[0] as Expression;
114
+ nextCall = sendRequestBodyCall;
115
+ } else if (parent.property.name === 'set') {
116
+ // request headers
117
+ const setRequestHeaderCall = getParent(parent);
118
+ assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === 'CallExpression');
119
+ const [arg1, arg2] = setRequestHeaderCall.arguments as [Expression, Expression];
120
+ if (arg1.type === 'ObjectExpression') {
121
+ results.requestHeadersObjectLiteral = arg1;
122
+ } else {
123
+ results.requestHeaders = [...(results.requestHeaders ?? []), { name: arg1, value: arg2 }];
124
+ }
125
+ nextCall = setRequestHeaderCall;
126
+ }
127
+ } else {
128
+ throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
129
+ }
130
+ if (nextCall) {
131
+ analyzeFixtureCall(nextCall, results, sourceCode);
132
+ }
133
+ }
134
+
135
+ // eslint-disable-next-line sonarjs/cognitive-complexity
136
+ function createResponseAssertions(
137
+ fixtureCallInformation: FixtureCallInformation,
138
+ sourceCode: SourceCode,
139
+ responseVariableName: string,
140
+ destructuringResponseHeadersVariable: Scope.Variable | undefined,
141
+ ) {
142
+ let statusAssertion: string | undefined;
143
+ const nonStatusAssertions: string[] = [];
144
+ for (const expectArguments of fixtureCallInformation.assertions ?? []) {
145
+ if (expectArguments.length === 1) {
146
+ const [assertionArgument] = expectArguments;
147
+ assert.ok(assertionArgument);
148
+ if (
149
+ (assertionArgument.type === 'MemberExpression' &&
150
+ assertionArgument.object.type === 'Identifier' &&
151
+ assertionArgument.object.name === 'StatusCodes') ||
152
+ assertionArgument.type === 'Literal' ||
153
+ sourceCode.getText(assertionArgument).includes('StatusCodes.')
154
+ ) {
155
+ // status code assertion
156
+ statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
157
+ } else if (assertionArgument.type === 'ArrowFunctionExpression') {
158
+ // callback assertion using arrow function
159
+ let functionBody = sourceCode.getText(assertionArgument.body);
160
+
161
+ const [originalResponseArgument] = assertionArgument.params;
162
+ assert.ok(originalResponseArgument?.type === 'Identifier');
163
+ const originalResponseArgumentName = originalResponseArgument.name;
164
+ if (originalResponseArgumentName !== responseVariableName) {
165
+ functionBody = functionBody.replace(
166
+ new RegExp(`\\b${originalResponseArgumentName}\\b`, 'ug'),
167
+ responseVariableName,
168
+ );
169
+ }
170
+ nonStatusAssertions.push(`assert.doesNotThrow(()=>${functionBody})`);
171
+ } else if (assertionArgument.type === 'Identifier') {
172
+ // callback assertion using function reference
173
+ nonStatusAssertions.push(
174
+ `assert.doesNotThrow(()=>${sourceCode.getText(assertionArgument)}(${responseVariableName}))`,
175
+ );
176
+ } else if (assertionArgument.type === 'ObjectExpression' || assertionArgument.type === 'CallExpression') {
177
+ // body deep equal assertion
178
+ nonStatusAssertions.push(
179
+ `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`,
180
+ );
181
+ } else {
182
+ throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
183
+ }
184
+ } else if (expectArguments.length === 2) {
185
+ // header assertion
186
+ const [headerName, headerValue] = expectArguments;
187
+ assert.ok(headerName && headerValue);
188
+ const headersReference =
189
+ destructuringResponseHeadersVariable !== undefined
190
+ ? destructuringResponseHeadersVariable.name
191
+ : `${responseVariableName}.headers`;
192
+ if (headerValue.type === 'Literal' && headerValue.value instanceof RegExp) {
193
+ nonStatusAssertions.push(
194
+ `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`,
195
+ );
196
+ } else {
197
+ nonStatusAssertions.push(
198
+ `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`,
199
+ );
200
+ }
201
+ }
202
+ }
203
+ return {
204
+ statusAssertion,
205
+ nonStatusAssertions,
206
+ };
207
+ }
208
+
209
+ function getResponseVariableNameToUse(
210
+ scopeManager: Scope.ScopeManager,
211
+ fixtureCallInformation: FixtureCallInformation,
212
+ scopeVariablesMap: Map<Scope.Scope, string[]>,
213
+ ) {
214
+ if (fixtureCallInformation.variableAssignment) {
215
+ assert.ok(
216
+ fixtureCallInformation.variableAssignment.expression.type === 'AssignmentExpression' &&
217
+ fixtureCallInformation.variableAssignment.expression.left.type === 'Identifier',
218
+ );
219
+ return fixtureCallInformation.variableAssignment.expression.left.name;
220
+ }
221
+
222
+ if (fixtureCallInformation.variableDeclaration) {
223
+ const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
224
+ if (firstDeclaration && firstDeclaration.id.type === 'Identifier') {
225
+ return firstDeclaration.id.name;
226
+ }
227
+ }
228
+
229
+ const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
230
+ scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
231
+ assert.ok(enclosingScopeNode);
232
+ const scope = scopeManager.acquire(enclosingScopeNode);
233
+ assert.ok(scope !== null);
234
+ let scopeVariables = scopeVariablesMap.get(scope);
235
+ if (!scopeVariables) {
236
+ scopeVariables = [...scope.set.keys()];
237
+ scopeVariablesMap.set(scope, scopeVariables);
238
+ }
239
+
240
+ let responseVariableCounter = 0;
241
+ let responseVariableNameToUse;
242
+ while (responseVariableNameToUse === undefined) {
243
+ responseVariableCounter++;
244
+ responseVariableNameToUse = `response${responseVariableCounter === 1 ? '' : responseVariableCounter.toString()}`;
245
+ if (scopeVariables.includes(responseVariableNameToUse)) {
246
+ responseVariableNameToUse = undefined;
247
+ }
248
+ }
249
+ scopeVariables.push(responseVariableNameToUse);
250
+ return responseVariableNameToUse;
251
+ }
252
+
253
+ function isResponseBodyRedefinition(responseBodyReference: MemberExpression): boolean {
254
+ const parent = getParent(responseBodyReference);
255
+ return parent?.type === 'VariableDeclarator' && parent.id.type === 'Identifier';
256
+ }
257
+
258
+ const rule: Rule.RuleModule = {
259
+ meta: {
260
+ type: 'suggestion',
261
+ docs: {
262
+ description: 'Transform supertest assersions to regular node assertions.',
263
+ url: getDocumentationUrl(ruleId),
264
+ },
265
+ messages: {
266
+ preferNativeFetch: 'Transform supertest assersions to regular node assertions.',
267
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
268
+ },
269
+ fixable: 'code',
270
+ schema: [],
271
+ },
272
+ // eslint-disable-next-line max-lines-per-function
273
+ create(context) {
274
+ const sourceCode = context.sourceCode;
275
+ const scopeManager = sourceCode.scopeManager;
276
+ const scopeVariablesMap = new Map<Scope.Scope, string[]>();
277
+
278
+ return {
279
+ // eslint-disable-next-line max-lines-per-function
280
+ 'CallExpression[callee.property.name="expect"]': (
281
+ supertestCall: CallExpression,
282
+ // eslint-disable-next-line sonarjs/cognitive-complexity
283
+ ) => {
284
+ assert.ok(supertestCall.callee.type === 'MemberExpression');
285
+ if (
286
+ supertestCall.callee.object.type === 'CallExpression' &&
287
+ supertestCall.callee.object.callee.type === 'MemberExpression' &&
288
+ supertestCall.callee.object.callee.property.type === 'Identifier' &&
289
+ supertestCall.callee.object.callee.property.name === 'expect'
290
+ ) {
291
+ // skip nested expect calls, only focus on the top level
292
+ return;
293
+ }
294
+ try {
295
+ if (isUsedInArrayOrAsArgument(supertestCall) || getEnclosingFunction(supertestCall)?.async === false) {
296
+ // skip and leave it to "fetch-then" rule to handle it because no "await" can be used here
297
+ return;
298
+ }
299
+
300
+ assert.ok(supertestCall.type === 'CallExpression');
301
+ const fixtureFunction = supertestCall.callee.object;
302
+ if (fixtureFunction.type !== 'CallExpression') {
303
+ return;
304
+ }
305
+
306
+ const indentation = getIndentation(supertestCall, sourceCode);
307
+
308
+ const fixtureCallInformation = {} as FixtureCallInformation;
309
+ analyzeFixtureCall(fixtureFunction, fixtureCallInformation, sourceCode);
310
+ sourceCode.getText(fixtureCallInformation.fixtureNode);
311
+ sourceCode.getText(fixtureCallInformation.rootNode);
312
+ fixtureCallInformation.assertions?.flat().map((ass) => sourceCode.getText(ass));
313
+
314
+ const {
315
+ variable: responseVariable,
316
+ bodyReferences: responseBodyReferences,
317
+ headersReferences: responseHeadersReferences,
318
+ statusReferences: responseStatusReferences,
319
+ destructuringBodyVariable: destructuringResponseBodyVariable,
320
+ destructuringHeadersVariable: destructuringResponseHeadersVariable,
321
+ } = analyzeResponseReferences(fixtureCallInformation.variableDeclaration, scopeManager);
322
+
323
+ const responseVariableNameToUse = getResponseVariableNameToUse(
324
+ scopeManager,
325
+ fixtureCallInformation,
326
+ scopeVariablesMap,
327
+ );
328
+
329
+ const isResponseBodyVariableRedefinitionNeeded =
330
+ destructuringResponseBodyVariable !== undefined ||
331
+ fixtureCallInformation.inlineBodyReference !== undefined ||
332
+ (responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition));
333
+ const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
334
+
335
+ const isResponseHeadersVariableRedefinitionNeeded =
336
+ (destructuringResponseHeadersVariable !== undefined &&
337
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
338
+ (destructuringResponseHeadersVariable as ObjectPattern).type === 'ObjectPattern') ||
339
+ fixtureCallInformation.inlineHeadersReference !== undefined;
340
+ const redefineResponseHeadersVariableName = `${responseVariableNameToUse}Headers`;
341
+
342
+ const isResponseVariableRedefinitionNeeded =
343
+ (fixtureCallInformation.variableAssignment === undefined &&
344
+ responseVariable === undefined &&
345
+ fixtureCallInformation.assertions !== undefined) ||
346
+ isResponseBodyVariableRedefinitionNeeded ||
347
+ isResponseHeadersVariableRedefinitionNeeded;
348
+
349
+ const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded
350
+ ? [
351
+ // eslint-disable-next-line no-nested-ternary
352
+ ...(destructuringResponseBodyVariable
353
+ ? [
354
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
355
+ `${fixtureCallInformation.variableDeclaration?.kind ?? 'const'} ${(destructuringResponseBodyVariable as ObjectPattern).type === 'ObjectPattern' ? sourceCode.getText(destructuringResponseBodyVariable as ObjectPattern) : (destructuringResponseBodyVariable as Scope.Variable).name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`,
356
+ ]
357
+ : isResponseBodyVariableRedefinitionNeeded
358
+ ? [
359
+ `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`,
360
+ ]
361
+ : []),
362
+ // eslint-disable-next-line no-nested-ternary
363
+ ...(destructuringResponseHeadersVariable
364
+ ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
365
+ (destructuringResponseHeadersVariable as ObjectPattern).type === 'ObjectPattern'
366
+ ? (destructuringResponseHeadersVariable as ObjectPattern).properties.map((property) => {
367
+ assert.ok(property.type === 'Property');
368
+ assert.equal(property.value.type, 'Identifier');
369
+ // eslint-disable-next-line sonarjs/no-nested-template-literals
370
+ return `${fixtureCallInformation.variableDeclaration?.kind ?? 'const'} ${property.value.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}.get(${property.key.type === 'Literal' ? sourceCode.getText(property.key) : `'${sourceCode.getText(property.key)}'`})`;
371
+ })
372
+ : [
373
+ `${fixtureCallInformation.variableDeclaration?.kind ?? 'const'} ${(destructuringResponseHeadersVariable as Scope.Variable).name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`,
374
+ ]
375
+ : isResponseHeadersVariableRedefinitionNeeded
376
+ ? [
377
+ `const ${redefineResponseHeadersVariableName} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`,
378
+ ]
379
+ : []),
380
+ ]
381
+ : [];
382
+
383
+ const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
384
+ fixtureCallInformation,
385
+ sourceCode,
386
+ responseVariableNameToUse,
387
+ destructuringResponseHeadersVariable as Scope.Variable | undefined,
388
+ );
389
+
390
+ // add variable declaration if needed
391
+ const fetchCallText = sourceCode.getText(fixtureFunction);
392
+ const fetchStatementText = !isResponseVariableRedefinitionNeeded
393
+ ? fetchCallText
394
+ : `${fixtureCallInformation.variableDeclaration?.kind ?? 'const'} ${responseVariableNameToUse} = await ${fetchCallText}`;
395
+
396
+ const nodeToReplace = isResponseVariableRedefinitionNeeded
397
+ ? fixtureCallInformation.rootNode
398
+ : fixtureCallInformation.fixtureNode;
399
+ const appendingAssignmentAndAssertionText = [
400
+ '',
401
+ ...(statusAssertion !== undefined ? [statusAssertion] : []),
402
+ ...responseBodyHeadersVariableRedefineLines,
403
+ ...nonStatusAssertions,
404
+ ].join(`;\n${indentation}`);
405
+
406
+ context.report({
407
+ node: supertestCall,
408
+ messageId: 'preferNativeFetch',
409
+
410
+ *fix(fixer) {
411
+ if (fixtureCallInformation.inlineStatementNode) {
412
+ const preInlineDeclaration = [
413
+ fetchStatementText,
414
+ `${appendingAssignmentAndAssertionText};\n${indentation}`,
415
+ ].join(``);
416
+ yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
417
+ } else {
418
+ yield fixer.replaceText(nodeToReplace, fetchStatementText);
419
+
420
+ const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(';');
421
+ yield fixer.insertTextAfter(
422
+ nodeToReplace,
423
+ needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText,
424
+ );
425
+ }
426
+
427
+ // handle response body references
428
+ for (const responseBodyReference of responseBodyReferences) {
429
+ yield fixer.replaceText(
430
+ responseBodyReference,
431
+ isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference)
432
+ ? redefineResponseBodyVariableName
433
+ : getResponseBodyRetrievalText(responseVariableNameToUse),
434
+ );
435
+ }
436
+ if (fixtureCallInformation.inlineBodyReference) {
437
+ yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
438
+ }
439
+
440
+ // handle response headers references
441
+ for (const responseHeadersReference of responseHeadersReferences) {
442
+ const parent = getParent(responseHeadersReference);
443
+ assert.ok(parent);
444
+ let headerName;
445
+ if (parent.type === 'MemberExpression') {
446
+ const headerNameNode = parent.property;
447
+ headerName = parent.computed
448
+ ? sourceCode.getText(headerNameNode)
449
+ : `'${sourceCode.getText(headerNameNode)}'`;
450
+ } else if (parent.type === 'CallExpression') {
451
+ const headerNameNode = parent.arguments[0];
452
+ headerName = sourceCode.getText(headerNameNode);
453
+ }
454
+ assert.ok(headerName !== undefined);
455
+ yield fixer.replaceText(parent, `${responseVariableNameToUse}.headers.get(${headerName})`);
456
+ }
457
+
458
+ // convert response.statusCode to response.status
459
+ for (const responseStatusReference of responseStatusReferences) {
460
+ if (
461
+ responseStatusReference.property.type === 'Identifier' &&
462
+ responseStatusReference.property.name === 'statusCode'
463
+ ) {
464
+ yield fixer.replaceText(responseStatusReference.property, `status`);
465
+ }
466
+ }
467
+
468
+ // handle direct return statement without await, e.g. "return fixture.api.get(...);"
469
+ if (
470
+ fixtureCallInformation.rootNode.type === 'ReturnStatement' &&
471
+ fixtureCallInformation.assertions !== undefined
472
+ ) {
473
+ yield fixer.insertTextAfter(
474
+ fixtureCallInformation.rootNode,
475
+ `\n${indentation}return ${responseVariableNameToUse};`,
476
+ );
477
+ }
478
+ },
479
+ });
480
+ } catch (error) {
481
+ // eslint-disable-next-line no-console
482
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
483
+ context.report({
484
+ node: supertestCall,
485
+ messageId: 'unknownError',
486
+ data: {
487
+ fileName: context.filename,
488
+ error: error instanceof Error ? error.toString() : JSON.stringify(error),
489
+ },
490
+ });
491
+ }
492
+ },
493
+ };
494
+ },
495
+ };
496
+
497
+ export default rule;
package/src/index.ts CHANGED
@@ -22,6 +22,7 @@ import fixFunctionCallArguments, {
22
22
  import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from './invalid-json-stringify';
23
23
  import noDuplicatedImports, { ruleId as noDuplicatedImportsRuleId } from './no-duplicated-imports';
24
24
  import noFixture, { ruleId as noFixtureRuleId } from './agent/no-fixture';
25
+ import noSupertest, { ruleId as noSupertestRuleId } from './agent/no-supertest';
25
26
  import noLegacyServiceTyping, { ruleId as noLegacyServiceTypingRuleId } from './no-legacy-service-typing';
26
27
  import noMappedResponse, { ruleId as noMappedResponseRuleId } from './agent/no-mapped-response';
27
28
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from './no-promise-instance-method';
@@ -72,6 +73,7 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
72
73
  [invalidJsonStringifyRuleId]: invalidJsonStringify,
73
74
  [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
74
75
  [noFixtureRuleId]: noFixture,
76
+ [noSupertestRuleId]: noSupertest,
75
77
  [fetchThenRuleId]: fetchThen,
76
78
  [noServiceWrapperRuleId]: noServiceWrapper,
77
79
  [noStatusCodeRuleId]: noStatusCode,
@@ -131,6 +133,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
131
133
  [`@checkdigit/${noMappedResponseRuleId}`]: 'off',
132
134
  [`@checkdigit/${addUrlDomainRuleId}`]: 'off',
133
135
  [`@checkdigit/${noFixtureRuleId}`]: 'off',
136
+ [`@checkdigit/${noSupertestRuleId}`]: 'off',
134
137
  [`@checkdigit/${noServiceWrapperRuleId}`]: 'off',
135
138
  [`@checkdigit/${noStatusCodeRuleId}`]: 'off',
136
139
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'off',
@@ -179,6 +182,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
179
182
  [`@checkdigit/${noMappedResponseRuleId}`]: 'off',
180
183
  [`@checkdigit/${addUrlDomainRuleId}`]: 'off',
181
184
  [`@checkdigit/${noFixtureRuleId}`]: 'off',
185
+ [`@checkdigit/${noSupertestRuleId}`]: 'off',
182
186
  [`@checkdigit/${noServiceWrapperRuleId}`]: 'off',
183
187
  [`@checkdigit/${noStatusCodeRuleId}`]: 'off',
184
188
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'off',
@@ -222,6 +226,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
222
226
  [`@checkdigit/${addBasePathImportRuleId}`]: 'error',
223
227
  [`@checkdigit/${addAssertImportRuleId}`]: 'error',
224
228
  [`@checkdigit/${noFixtureRuleId}`]: 'error',
229
+ [`@checkdigit/${noSupertestRuleId}`]: 'error',
225
230
  },
226
231
  },
227
232
  {