Skip to content

Commit

Permalink
fix(oas): handling header parameters options
Browse files Browse the repository at this point in the history
fixes #120
  • Loading branch information
pmstss committed Feb 21, 2022
1 parent 408becc commit c6bd145
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 17 deletions.
37 changes: 21 additions & 16 deletions packages/oas/src/converter/parts/headers/HeadersConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,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 @@ -95,23 +102,21 @@ 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) =>
this.createHeader(
param.name,
this.serializeHeaderValue(
this.sampler.sampleParam(param, {
tokens,
spec: this.spec,
idx: params.indexOf(param)
})
)
)
);
}
return filterLocationParams(params, 'header').map((param) => {
const value = 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 this.convertHeaderParam(
{
...param,
name: param.name.toLowerCase()
},
value
);
});
}

private getSecurityRequirementObjects(
Expand Down
17 changes: 17 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,19 @@ 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
17 changes: 17 additions & 0 deletions packages/oas/src/converter/parts/headers/Oas3HeadersConverter.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { isObject } from '../../../utils';
import { Sampler } from '../Sampler';
import { UriTemplator } from '../UriTemplator';
import { HeadersConverter } from './HeadersConverter';
import { Header, OpenAPIV3 } from '@har-sdk/core';

export class Oas3HeadersConverter extends HeadersConverter<OpenAPIV3.Document> {
private readonly uriTemplator = new UriTemplator();

constructor(spec: OpenAPIV3.Document, sampler: Sampler) {
super(spec, sampler);
}
Expand All @@ -26,6 +29,20 @@ export class Oas3HeadersConverter extends HeadersConverter<OpenAPIV3.Document> {
return [];
}

protected convertHeaderParam(
param: OpenAPIV3.ParameterObject,
paramValue: unknown
): Header {
return {
name: param.name,
value: decodeURIComponent(
this.uriTemplator.substitute(`{x${param.explode ? '*' : ''}}`, {
x: paramValue
})
)
};
}

protected getSecuritySchemes():
| Record<string, OpenAPIV3.SecuritySchemeObject>
| undefined {
Expand Down
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
2 changes: 1 addition & 1 deletion packages/oas/tests/fixtures/empty-schema.oas.result.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
},
{
"name": "api_key",
"value": "null"
"value": ""
}
],
"httpVersion": "HTTP/1.1",
Expand Down
37 changes: 37 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,37 @@
[
{
"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,42"
},
{
"name": "x-request-array-exploded",
"value": "42,42"
},
{
"name": "x-request-object",
"value": "x,lorem,y,42"
},
{
"name": "x-request-object-exploded",
"value": "x=lorem,y=42"
},
{
"name": "x-request-object-exploded-default",
"value": "a=dummy,b=42"
}
],
"httpVersion": "HTTP/1.1",
"cookies": [],
"headersSize": 0,
"bodySize": 0
}
]
65 changes: 65 additions & 0 deletions packages/oas/tests/fixtures/params-header.oas.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
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'
minItems: 2
items:
type: integer
- in: header
name: X-Request-Array-Exploded
explode: true
schema:
type: 'array'
minItems: 2
items:
type: integer
- in: header
name: X-Request-Object
schema:
type: object
properties:
x:
type: string
y:
type: number
- in: header
name: X-Request-Object-Exploded
explode: true
schema:
type: object
properties:
x:
type: string
y:
type: number
- in: header
name: X-Request-Object-Exploded-Default
explode: true
schema:
type: object
default:
a: dummy
b: 42

responses:
200:
description: OK
content:
application/json:
example:
ok: true

0 comments on commit c6bd145

Please sign in to comment.