Skip to content

Commit

Permalink
refactor(oas): subconverters factory
Browse files Browse the repository at this point in the history
relates-to #120
  • Loading branch information
pmstss committed Feb 17, 2022
1 parent 3e34634 commit 9c4e30d
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 72 deletions.
74 changes: 11 additions & 63 deletions packages/oas/src/converter/DefaultConverter.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
import { isOASV3 } from '../utils';
import { Converter } from './Converter';
import {
BaseUrlParser,
Oas2PathConverter,
Oas2QueryStringConverter,
Oas3PathConverter,
Oas3QueryStringConverter,
PostDataConverter,
Sampler,
Oas3HeadersConverter,
Oas2HeadersConverter
} from './parts';
import { BaseUrlParser, Sampler, SubConvertersFactory } from './parts';
import { SubPart } from './SubPart';
import { SubConverter } from './SubConverter';
import $RefParser, { JSONSchema } from '@apidevtools/json-schema-ref-parser';
import {
Header,
Expand All @@ -29,24 +17,20 @@ type PathItemObject = OpenAPIV2.PathItemObject | OpenAPIV3.PathItemObject;

export class DefaultConverter implements Converter {
private readonly sampler = new Sampler();
private readonly baseUrlConverter = new BaseUrlParser(this.sampler);
private readonly baseUrlParser = new BaseUrlParser(this.sampler);

private spec: OpenAPI.Document;
private baseUrl: string;
private subConverters: Map<SubPart, SubConverter<any>>;
private subConvertersFactory: SubConvertersFactory;

public async convert(spec: OpenAPI.Document): Promise<Request[]> {
this.spec = (await new $RefParser().dereference(
JSON.parse(JSON.stringify(spec)) as JSONSchema,
{ resolve: { file: false, http: false } }
)) as OpenAPI.Document;

this.baseUrl = this.baseUrlConverter.parse(this.spec);
this.subConverters = new Map<SubPart, SubConverter<any>>(
Object.values(SubPart).map((type) => [
type,
this.createConverter(type, this.spec)
])
this.subConvertersFactory = new SubConvertersFactory(
this.spec,
this.sampler
);

return Object.entries(this.spec.paths).flatMap(
Expand Down Expand Up @@ -91,13 +75,13 @@ export class DefaultConverter implements Converter {
method: string,
queryString: QueryString[]
): string {
const rawUrl = `${this.baseUrl}${this.convertPart(
const rawUrl = `${this.baseUrlParser.parse(this.spec)}${this.convertPart(
SubPart.PATH,
path,
method
)}${this.serializeQueryString(queryString)}`;

return this.baseUrlConverter.normalizeUrl(rawUrl, {
return this.baseUrlParser.normalizeUrl(rawUrl, {
jsonPointer: pointer.compile(['paths', path, method])
});
}
Expand All @@ -111,45 +95,9 @@ export class DefaultConverter implements Converter {
: '';
}

private createSubConverter(
type: SubPart,
spec: OpenAPI.Document
): SubConverter<any> {
switch (type) {
case SubPart.HEADERS:
return this.createHeadersConverter(spec);
case SubPart.PATH:
return this.createPathConverter(spec);
case SubPart.POST_DATA:
return new PostDataConverter(spec, this.sampler);
case SubPart.QUERY_STRING:
return this.createQueryStringConverter(spec);
}
}

private createQueryStringConverter(
spec: OpenAPI.Document
): SubConverter<QueryString[]> {
return isOASV3(spec)
? new Oas3QueryStringConverter(spec, this.sampler)
: new Oas2QueryStringConverter(spec, this.sampler);
}

private createPathConverter(spec: OpenAPI.Document): SubConverter<string> {
return isOASV3(spec)
? new Oas3PathConverter(spec, this.sampler)
: new Oas2PathConverter(spec, this.sampler);
}

private createHeadersConverter(
spec: OpenAPI.Document
): SubConverter<Header[]> {
return isOASV3(spec)
? new Oas3HeadersConverter(spec, this.sampler)
: new Oas2HeadersConverter(spec, this.sampler);
}

private convertPart<T>(type: SubPart, path: string, method: string): T {
return this.subConverters.get(type).convert(path, method) as unknown as T;
return this.subConvertersFactory
.get(type)
.convert(path, method) as unknown as T;
}
}
73 changes: 73 additions & 0 deletions packages/oas/src/converter/parts/SubConvertersFactory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { isOASV3 } from '../../utils';
import { SubConverter } from '../SubConverter';
import { SubPart } from '../SubPart';
import { Oas3HeadersConverter, Oas2HeadersConverter } from './headers';
import { Oas3PathConverter, Oas2PathConverter } from './path';
import { PostDataConverter } from './postdata';
import { Oas3QueryStringConverter, Oas2QueryStringConverter } from './query';
import { Sampler } from './Sampler';
import {
Header,
OpenAPI,
OpenAPIV2,
OpenAPIV3,
QueryString
} from '@har-sdk/core';

export class SubConvertersFactory {
private subConverters = new Map<SubPart, SubConverter<unknown>>();

private readonly oas3: boolean;

constructor(
private readonly spec: OpenAPI.Document,
private readonly sampler: Sampler
) {
this.oas3 = isOASV3(this.spec);
}

public get(type: SubPart): SubConverter<unknown> {
if (!this.subConverters.has(type)) {
this.subConverters.set(type, this.createSubConverter(type));
}

return this.subConverters.get(type);
}

private createSubConverter(type: SubPart): SubConverter<any> {
switch (type) {
case SubPart.HEADERS:
return this.createHeadersConverter();
case SubPart.PATH:
return this.createPathConverter();
case SubPart.POST_DATA:
return new PostDataConverter(this.spec, this.sampler);
case SubPart.QUERY_STRING:
return this.createQueryStringConverter();
}
}

private createQueryStringConverter(): SubConverter<QueryString[]> {
return this.oas3
? new Oas3QueryStringConverter(
this.spec as OpenAPIV3.Document,
this.sampler
)
: new Oas2QueryStringConverter(
this.spec as OpenAPIV2.Document,
this.sampler
);
}

private createPathConverter(): SubConverter<string> {
return this.oas3
? new Oas3PathConverter(this.spec as OpenAPIV3.Document, this.sampler)
: new Oas2PathConverter(this.spec as OpenAPIV2.Document, this.sampler);
}

private createHeadersConverter(): SubConverter<Header[]> {
return this.oas3
? new Oas3HeadersConverter(this.spec as OpenAPIV3.Document, this.sampler)
: new Oas2HeadersConverter(this.spec as OpenAPIV2.Document, this.sampler);
}
}
4 changes: 3 additions & 1 deletion packages/oas/src/converter/parts/headers/HeadersConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ export abstract class HeadersConverter<T extends OpenAPI.Document>
}

protected createHeaders(name: string, values: string[]): Header[] {
return values.map((value) => this.createHeader(name, value));
return (Array.isArray(values) ? values : []).map((value) =>
this.createHeader(name, value)
);
}

protected parseSecurityScheme(
Expand Down
10 changes: 2 additions & 8 deletions packages/oas/src/converter/parts/headers/Oas2HeadersConveter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,11 @@ export class Oas2HeadersConverter extends HeadersConverter<OpenAPIV2.Document> {
protected createContentTypeHeaders(
pathObj: OpenAPIV2.OperationObject
): Header[] {
return this.createHeaders(
'content-type',
Array.isArray(pathObj.consumes) ? pathObj.consumes : []
);
return this.createHeaders('content-type', pathObj.consumes);
}

protected createAcceptHeaders(pathObj: OpenAPIV2.OperationObject): Header[] {
return this.createHeaders(
'accept',
Array.isArray(pathObj.produces) ? pathObj.produces : []
);
return this.createHeaders('accept', pathObj.produces);
}

protected getSecuritySchemes():
Expand Down
1 change: 1 addition & 0 deletions packages/oas/src/converter/parts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export * from './query';
export * from './postdata';
export { BaseUrlParser } from './BaseUrlParser';
export { Sampler } from './Sampler';
export { SubConvertersFactory } from './SubConvertersFactory';

0 comments on commit 9c4e30d

Please sign in to comment.