Skip to content

Commit

Permalink
fix(oas): handling header parameters options
Browse files Browse the repository at this point in the history
- wip; early draft

fixes #120
  • Loading branch information
pmstss committed Feb 17, 2022
1 parent 3a53fdd commit adebd11
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 29 deletions.
6 changes: 1 addition & 5 deletions packages/oas/src/converter/parts/Oas2ValueSerializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,7 @@ import { OpenAPIV2 } from '@har-sdk/core';
export class Oas2ValueSerializer {
private readonly flattener = new Flattener();

public serialize(
param: OpenAPIV2.Parameter,
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
value: any
): any {
public serialize(param: OpenAPIV2.Parameter, value: unknown): any {
const style = param.collectionFormat;
const explode = param.collectionFormat === 'multi';

Expand Down
34 changes: 19 additions & 15 deletions packages/oas/src/converter/parts/headers/HeadersConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ export abstract class HeadersConverter<T extends OpenAPI.Document>
protected abstract createContentTypeHeaders(
pathObj: OperationObject
): Header[];

protected abstract createAcceptHeaders(pathObj: OperationObject): Header[];

protected abstract convertHeaderParam(
param: ParameterObject,
paramValue: unknown
): Header[];

protected abstract getSecuritySchemes():
| Record<string, SecuritySchemeObject>
| undefined;
Expand Down Expand Up @@ -96,21 +103,18 @@ export abstract class HeadersConverter<T extends OpenAPI.Document>
const params: ParameterObject[] = getParameters(this.spec, path, method);
const tokens = ['paths', path, method];

return filterLocationParams(params, 'header').map((param) => ({
name: param.name.toLowerCase(),
value: this.serializeHeaderValue(
this.sampler.sampleParam(param, {
spec: this.spec,
tokens,
idx: params.indexOf(param)
})
)
}));
}

private serializeHeaderValue(value: any): string {
// TODO proper serialization
return typeof value === 'object' ? JSON.stringify(value) : value;
return filterLocationParams(params, 'header').flatMap((param) => {
const value = this.sampler.sampleParam(param, {
spec: this.spec,
tokens,
idx: params.indexOf(param)
});

return this.convertHeaderParam(param, value).map(({ name, ...rest }) => ({
name: name.toLowerCase(),
...rest
}));
});
}

private getSecurityRequirementObjects(
Expand Down
19 changes: 19 additions & 0 deletions packages/oas/src/converter/parts/headers/Oas2HeadersConveter.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import { isObject } from '../../../utils';
import { Oas2ValueSerializer } from '../Oas2ValueSerializer';
import { Sampler } from '../Sampler';
import { HeadersConverter } from './HeadersConverter';
import { Header, OpenAPIV2 } from '@har-sdk/core';

export class Oas2HeadersConverter extends HeadersConverter<OpenAPIV2.Document> {
private readonly oas2ValueSerializer = new Oas2ValueSerializer();

constructor(spec: OpenAPIV2.Document, sampler: Sampler) {
super(spec, sampler);
}
Expand All @@ -17,6 +21,21 @@ export class Oas2HeadersConverter extends HeadersConverter<OpenAPIV2.Document> {
return this.createHeaders('accept', pathObj.produces);
}

// TODO proper logic
protected convertHeaderParam(
param: OpenAPIV2.Parameter,
paramValue: unknown
): Header[] {
const value = this.oas2ValueSerializer.serialize(param, paramValue);

return [
{
name: param.name,
value: isObject(value) ? JSON.stringify(value) : (value as string)
}
];
}

protected getSecuritySchemes():
| Record<string, OpenAPIV2.SecuritySchemeObject>
| undefined {
Expand Down
16 changes: 16 additions & 0 deletions packages/oas/src/converter/parts/headers/Oas3HeadersConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,22 @@ export class Oas3HeadersConverter extends HeadersConverter<OpenAPIV3.Document> {
return [];
}

// TODO proper logic
protected convertHeaderParam(
param: OpenAPIV3.ParameterObject,
paramValue: unknown
): Header[] {
return [
{
name: param.name,
value:
typeof paramValue === 'object'
? JSON.stringify(paramValue)
: (paramValue as string)
}
];
}

protected getSecuritySchemes():
| Record<string, OpenAPIV3.SecuritySchemeObject>
| undefined {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,9 @@ export class Oas2QueryStringConverter extends QueryStringConverter<OpenAPIV2.Par
super(spec, sampler);
}

protected convertParam(
protected convertQueryParam(
param: OpenAPIV2.Parameter,
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
paramValue: any
paramValue: unknown
): QueryString[] {
const { name } = param;
const value = this.oas2ValueSerializer.serialize(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ export class Oas3QueryStringConverter extends QueryStringConverter<OpenAPIV3.Par
super(spec, sampler);
}

protected convertParam(
protected convertQueryParam(
param: OpenAPIV3.ParameterObject,
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
paramValue: any
paramValue: unknown
): QueryString[] {
const templateStr = this.getQueryParamUriTemplate(param);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ export abstract class QueryStringConverter<T extends ParameterObject>
private readonly sampler: Sampler
) {}

// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
protected abstract convertParam(param: T, paramValue: any): QueryString[];
protected abstract convertQueryParam(
param: T,
paramValue: unknown
): QueryString[];

public convert(path: string, method: string): QueryString[] {
const tokens = ['paths', path, method];
Expand All @@ -32,7 +34,7 @@ export abstract class QueryStringConverter<T extends ParameterObject>
idx: params.indexOf(param)
});

return this.convertParam(param as T, value);
return this.convertQueryParam(param as T, value);
});
}
}
5 changes: 5 additions & 0 deletions packages/oas/tests/DefaultConverter.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ describe('DefaultConverter', () => {
input: 'params-path.swagger.yaml',
expected: 'params-path.swagger.result.json',
message: 'should correctly convert swagger path parameters'
},
{
input: 'params-header.oas.yaml',
expected: 'params-header.oas.result.json',
message: 'should correctly convert oas headers parameters'
}
].forEach(({ input: inputFile, expected: expectedFile, message }) => {
it(message, async () => {
Expand Down
33 changes: 33 additions & 0 deletions packages/oas/tests/fixtures/params-header.oas.result.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[
{
"queryString": [],
"url": "https://petstore.swagger.io/v1/dummy1",
"method": "GET",
"headers": [
{
"name": "x-request-datetime",
"value": "2021-12-31T23:34:00Z"
},
{
"name": "x-request-array",
"value": "[42]"
},
{
"name": "x-request-array-exploded",
"value": "[42]"
},
{
"name": "x-request-object",
"value": "{\"role\":\"lorem\",\"firstName\":\"lorem\"}"
},
{
"name": "x-request-object-exploded",
"value": "{\"role\":\"lorem\",\"firstName\":\"lorem\"}"
}
],
"httpVersion": "HTTP/1.1",
"cookies": [],
"headersSize": 0,
"bodySize": 0
}
]
53 changes: 53 additions & 0 deletions packages/oas/tests/fixtures/params-header.oas.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
openapi: 3.0.1
info:
title: Header Parameters Test
version: 1.0.0
servers:
- url: https://petstore.swagger.io/v1
paths:
/dummy1:
get:
parameters:
- in: header
name: X-Request-DateTime
schema:
type: 'string'
format: 'date-time'
- in: header
name: X-Request-Array
schema:
type: 'array'
items:
type: integer
- in: header
name: X-Request-Array-Exploded
explode: true
schema:
type: 'array'
items:
type: integer
- in: header
name: X-Request-Object
schema:
type: object
properties:
role:
type: string
firstName:
type: string
- in: header
name: X-Request-Object-Exploded
schema:
type: object
properties:
role:
type: string
firstName:
type: string
responses:
200:
description: OK
content:
application/json:
example:
ok: true

0 comments on commit adebd11

Please sign in to comment.