lib/apiScenario/gen/testProxyRecordLoader.ts (52 lines of code) (raw):

import { basename } from "path"; import { URL } from "url"; import { HttpMethods } from "@azure/core-http"; import { injectable } from "inversify"; import { Loader } from "../../swagger/loader"; import { logger } from ".././logger"; import { RequestTracking, SingleRequestTracking } from "./testRecordingApiScenarioGenerator"; interface RecordingFile { Names: { [testName: string]: string[] }; Variables: { [variableName: string]: string }; Entries: RecordEntry[]; } interface RecordEntry { RequestUri: string; RequestMethod: HttpMethods; RequestHeaders: { [headerName: string]: string }; RequestBody: object | string | null; StatusCode: number; ResponseHeaders: { [headerName: string]: string }; ResponseBody: object | string | null; } @injectable() export class TestProxyRecordingLoader implements Loader<RequestTracking, [RecordingFile, string]> { public async load([content, filePath]: [RecordingFile, string]): Promise<RequestTracking> { const result: RequestTracking = { requests: [], description: basename(filePath).replace(/\.[^/.]+$/, ""), }; for (const entry of content.Entries) { const url = new URL(entry.RequestUri); const query: { [key: string]: string } = {}; url.searchParams.forEach((val, key) => (query[key] = val)); const request: SingleRequestTracking = { host: url.host, method: entry.RequestMethod, path: url.pathname, url: url.href, headers: entry.RequestHeaders, query, body: entry.RequestBody ?? {}, responseCode: entry.StatusCode, responseHeaders: entry.ResponseHeaders, responseBody: entry.ResponseBody, }; result.requests.push(request); } result.requests.sort((a, b) => new Date(a.responseHeaders.Date) < new Date(b.responseHeaders.Date) ? -1 : 1 ); // for (const entry of result.requests) { // console.log(`${entry.method}\t${entry.path}`); // } return result; } } export const parseRecordingBodyJson = (content: object | string | null) => { if (typeof content !== "string" || content.length === 0) { return undefined; } try { return JSON.parse(content); } catch (e) { logger.error(`Failed to parse json body. Use string instead: ${JSON.stringify(content)}`); return content; } };