Skip to content

Commit 545286b

Browse files
authored
Add ability to record and replay mock code search requests (#2576)
1 parent a3921b7 commit 545286b

15 files changed

Lines changed: 76241 additions & 1 deletion

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/gh-api-request.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export enum RequestKind {
1010
GetVariantAnalysis = "getVariantAnalysis",
1111
GetVariantAnalysisRepo = "getVariantAnalysisRepo",
1212
GetVariantAnalysisRepoResult = "getVariantAnalysisRepoResult",
13+
CodeSearch = "codeSearch",
1314
}
1415

1516
export interface BasicErorResponse {
@@ -69,12 +70,30 @@ export interface GetVariantAnalysisRepoResultRequest {
6970
};
7071
}
7172

73+
export interface CodeSearchRequest {
74+
request: {
75+
kind: RequestKind.CodeSearch;
76+
query: string;
77+
};
78+
response: {
79+
status: number;
80+
body?: {
81+
total_count?: number;
82+
items?: Array<{
83+
repository: Repository;
84+
}>;
85+
};
86+
message?: string;
87+
};
88+
}
89+
7290
export type GitHubApiRequest =
7391
| GetRepoRequest
7492
| SubmitVariantAnalysisRequest
7593
| GetVariantAnalysisRequest
7694
| GetVariantAnalysisRepoRequest
77-
| GetVariantAnalysisRepoResultRequest;
95+
| GetVariantAnalysisRepoResultRequest
96+
| CodeSearchRequest;
7897

7998
export const isGetRepoRequest = (
8099
request: GitHubApiRequest,
@@ -99,3 +118,8 @@ export const isGetVariantAnalysisRepoResultRequest = (
99118
request: GitHubApiRequest,
100119
): request is GetVariantAnalysisRepoResultRequest =>
101120
request.request.kind === RequestKind.GetVariantAnalysisRepoResult;
121+
122+
export const isCodeSearchRequest = (
123+
request: GitHubApiRequest,
124+
): request is CodeSearchRequest =>
125+
request.request.kind === RequestKind.CodeSearch;

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/recorder.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,20 @@ async function createGitHubApiRequest(
245245
};
246246
}
247247

248+
const codeSearchMatch = url.match(/\/search\/code\?q=(?<query>.*)$/);
249+
if (codeSearchMatch?.groups?.query) {
250+
return {
251+
request: {
252+
kind: RequestKind.CodeSearch,
253+
query: codeSearchMatch?.groups?.query,
254+
},
255+
response: {
256+
status,
257+
body: JSON.parse(body),
258+
},
259+
};
260+
}
261+
248262
return undefined;
249263
}
250264

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/request-handlers.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { readdir, readJson, readFile } from "fs-extra";
33
import { DefaultBodyType, MockedRequest, rest, RestHandler } from "msw";
44
import {
55
GitHubApiRequest,
6+
isCodeSearchRequest,
67
isGetRepoRequest,
78
isGetVariantAnalysisRepoRequest,
89
isGetVariantAnalysisRepoResultRequest,
@@ -25,6 +26,7 @@ export async function createRequestHandlers(
2526
createGetVariantAnalysisRequestHandler(requests),
2627
createGetVariantAnalysisRepoRequestHandler(requests),
2728
createGetVariantAnalysisRepoResultRequestHandler(requests),
29+
createCodeSearchRequestHandler(requests),
2830
];
2931

3032
return handlers;
@@ -193,3 +195,27 @@ function createGetVariantAnalysisRepoResultRequestHandler(
193195
},
194196
);
195197
}
198+
199+
function createCodeSearchRequestHandler(
200+
requests: GitHubApiRequest[],
201+
): RequestHandler {
202+
const codeSearchRequests = requests.filter(isCodeSearchRequest);
203+
let requestIndex = 0;
204+
205+
// During a code search, there are multiple request to get pages of results. We
206+
// need to return different responses for each request, so keep an index of the
207+
// request and return the appropriate response.
208+
return rest.get(`${baseUrl}/search/code?q=*`, (_req, res, ctx) => {
209+
const request = codeSearchRequests[requestIndex];
210+
211+
if (requestIndex < codeSearchRequests.length - 1) {
212+
// If there are more requests to come, increment the index.
213+
requestIndex++;
214+
}
215+
216+
return res(
217+
ctx.status(request.response.status),
218+
ctx.json(request.response.body),
219+
);
220+
});
221+
}

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/scenarios/code-search-success/0-codeSearch.json

Lines changed: 7615 additions & 0 deletions
Large diffs are not rendered by default.

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/scenarios/code-search-success/1-codeSearch.json

Lines changed: 7615 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"request": {
3+
"kind": "codeSearch",
4+
"query": "org%3Adotnet+project+language%3Acsharp&per_page=100&page=10"
5+
},
6+
"response": {
7+
"status": 403,
8+
"body": {
9+
"message": "API rate limit exceeded for user ID 311693.",
10+
"documentation_url": "https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting"
11+
}
12+
}
13+
}

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/scenarios/code-search-success/11-codeSearch.json

Lines changed: 7615 additions & 0 deletions
Large diffs are not rendered by default.

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/scenarios/code-search-success/2-codeSearch.json

Lines changed: 7615 additions & 0 deletions
Large diffs are not rendered by default.

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/scenarios/code-search-success/3-codeSearch.json

Lines changed: 7615 additions & 0 deletions
Large diffs are not rendered by default.

extensions/ql-vscode/src/variant-analysis/gh-api/mocks/scenarios/code-search-success/4-codeSearch.json

Lines changed: 7615 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)