Add ability to record and replay mock code search requests (#2576)

This commit is contained in:
Charis Kyriakou
2023-07-04 14:47:30 +01:00
committed by GitHub
parent a3921b7afa
commit 545286b8d9
15 changed files with 76241 additions and 1 deletions

View File

@@ -10,6 +10,7 @@ export enum RequestKind {
GetVariantAnalysis = "getVariantAnalysis",
GetVariantAnalysisRepo = "getVariantAnalysisRepo",
GetVariantAnalysisRepoResult = "getVariantAnalysisRepoResult",
CodeSearch = "codeSearch",
}
export interface BasicErorResponse {
@@ -69,12 +70,30 @@ export interface GetVariantAnalysisRepoResultRequest {
};
}
export interface CodeSearchRequest {
request: {
kind: RequestKind.CodeSearch;
query: string;
};
response: {
status: number;
body?: {
total_count?: number;
items?: Array<{
repository: Repository;
}>;
};
message?: string;
};
}
export type GitHubApiRequest =
| GetRepoRequest
| SubmitVariantAnalysisRequest
| GetVariantAnalysisRequest
| GetVariantAnalysisRepoRequest
| GetVariantAnalysisRepoResultRequest;
| GetVariantAnalysisRepoResultRequest
| CodeSearchRequest;
export const isGetRepoRequest = (
request: GitHubApiRequest,
@@ -99,3 +118,8 @@ export const isGetVariantAnalysisRepoResultRequest = (
request: GitHubApiRequest,
): request is GetVariantAnalysisRepoResultRequest =>
request.request.kind === RequestKind.GetVariantAnalysisRepoResult;
export const isCodeSearchRequest = (
request: GitHubApiRequest,
): request is CodeSearchRequest =>
request.request.kind === RequestKind.CodeSearch;

View File

@@ -245,6 +245,20 @@ async function createGitHubApiRequest(
};
}
const codeSearchMatch = url.match(/\/search\/code\?q=(?<query>.*)$/);
if (codeSearchMatch?.groups?.query) {
return {
request: {
kind: RequestKind.CodeSearch,
query: codeSearchMatch?.groups?.query,
},
response: {
status,
body: JSON.parse(body),
},
};
}
return undefined;
}

View File

@@ -3,6 +3,7 @@ import { readdir, readJson, readFile } from "fs-extra";
import { DefaultBodyType, MockedRequest, rest, RestHandler } from "msw";
import {
GitHubApiRequest,
isCodeSearchRequest,
isGetRepoRequest,
isGetVariantAnalysisRepoRequest,
isGetVariantAnalysisRepoResultRequest,
@@ -25,6 +26,7 @@ export async function createRequestHandlers(
createGetVariantAnalysisRequestHandler(requests),
createGetVariantAnalysisRepoRequestHandler(requests),
createGetVariantAnalysisRepoResultRequestHandler(requests),
createCodeSearchRequestHandler(requests),
];
return handlers;
@@ -193,3 +195,27 @@ function createGetVariantAnalysisRepoResultRequestHandler(
},
);
}
function createCodeSearchRequestHandler(
requests: GitHubApiRequest[],
): RequestHandler {
const codeSearchRequests = requests.filter(isCodeSearchRequest);
let requestIndex = 0;
// During a code search, there are multiple request to get pages of results. We
// need to return different responses for each request, so keep an index of the
// request and return the appropriate response.
return rest.get(`${baseUrl}/search/code?q=*`, (_req, res, ctx) => {
const request = codeSearchRequests[requestIndex];
if (requestIndex < codeSearchRequests.length - 1) {
// If there are more requests to come, increment the index.
requestIndex++;
}
return res(
ctx.status(request.response.status),
ctx.json(request.response.body),
);
});
}

View File

@@ -0,0 +1,13 @@
{
"request": {
"kind": "codeSearch",
"query": "org%3Adotnet+project+language%3Acsharp&per_page=100&page=10"
},
"response": {
"status": 403,
"body": {
"message": "API rate limit exceeded for user ID 311693.",
"documentation_url": "https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting"
}
}
}

View File

@@ -0,0 +1,13 @@
{
"request": {
"kind": "codeSearch",
"query": "org%3Adotnet+project+language%3Acsharp&per_page=100&page=10"
},
"response": {
"status": 403,
"body": {
"message": "API rate limit exceeded for user ID 311693.",
"documentation_url": "https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting"
}
}
}