diff --git a/packages/oas/src/converter/parts/Oas2ValueSerializer.ts b/packages/oas/src/converter/parts/Oas2ValueSerializer.ts index bf786be3..d6dc5d35 100644 --- a/packages/oas/src/converter/parts/Oas2ValueSerializer.ts +++ b/packages/oas/src/converter/parts/Oas2ValueSerializer.ts @@ -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'; diff --git a/packages/oas/src/converter/parts/headers/HeadersConverter.ts b/packages/oas/src/converter/parts/headers/HeadersConverter.ts index 97da53cb..d8e917c3 100644 --- a/packages/oas/src/converter/parts/headers/HeadersConverter.ts +++ b/packages/oas/src/converter/parts/headers/HeadersConverter.ts @@ -27,7 +27,14 @@ export abstract class HeadersConverter protected abstract createContentTypeHeaders( pathObj: OperationObject ): Header[]; + protected abstract createAcceptHeaders(pathObj: OperationObject): Header[]; + + protected abstract convertHeaderParam( + param: ParameterObject, + paramValue: unknown + ): Header[]; + protected abstract getSecuritySchemes(): | Record | undefined; @@ -96,21 +103,18 @@ export abstract class HeadersConverter 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( diff --git a/packages/oas/src/converter/parts/headers/Oas2HeadersConveter.ts b/packages/oas/src/converter/parts/headers/Oas2HeadersConveter.ts index 4f2174e8..70816d14 100644 --- a/packages/oas/src/converter/parts/headers/Oas2HeadersConveter.ts +++ b/packages/oas/src/converter/parts/headers/Oas2HeadersConveter.ts @@ -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 { + private readonly oas2ValueSerializer = new Oas2ValueSerializer(); + constructor(spec: OpenAPIV2.Document, sampler: Sampler) { super(spec, sampler); } @@ -17,6 +21,21 @@ export class Oas2HeadersConverter extends HeadersConverter { 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 | undefined { diff --git a/packages/oas/src/converter/parts/headers/Oas3HeadersConverter.ts b/packages/oas/src/converter/parts/headers/Oas3HeadersConverter.ts index d47f088c..3b702134 100644 --- a/packages/oas/src/converter/parts/headers/Oas3HeadersConverter.ts +++ b/packages/oas/src/converter/parts/headers/Oas3HeadersConverter.ts @@ -26,6 +26,22 @@ export class Oas3HeadersConverter extends HeadersConverter { 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 | undefined { diff --git a/packages/oas/src/converter/parts/query/Oas2QueryStringConverter.ts b/packages/oas/src/converter/parts/query/Oas2QueryStringConverter.ts index 786f3dee..ad35e1e4 100644 --- a/packages/oas/src/converter/parts/query/Oas2QueryStringConverter.ts +++ b/packages/oas/src/converter/parts/query/Oas2QueryStringConverter.ts @@ -11,10 +11,9 @@ export class Oas2QueryStringConverter extends QueryStringConverter 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]; @@ -32,7 +34,7 @@ export abstract class QueryStringConverter idx: params.indexOf(param) }); - return this.convertParam(param as T, value); + return this.convertQueryParam(param as T, value); }); } } diff --git a/packages/oas/tests/DefaultConverter.spec.ts b/packages/oas/tests/DefaultConverter.spec.ts index ea7612ca..ae1ada2e 100644 --- a/packages/oas/tests/DefaultConverter.spec.ts +++ b/packages/oas/tests/DefaultConverter.spec.ts @@ -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 () => { diff --git a/packages/oas/tests/fixtures/params-header.oas.result.json b/packages/oas/tests/fixtures/params-header.oas.result.json new file mode 100644 index 00000000..084d187e --- /dev/null +++ b/packages/oas/tests/fixtures/params-header.oas.result.json @@ -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 + } +] diff --git a/packages/oas/tests/fixtures/params-header.oas.yaml b/packages/oas/tests/fixtures/params-header.oas.yaml new file mode 100644 index 00000000..9bed0196 --- /dev/null +++ b/packages/oas/tests/fixtures/params-header.oas.yaml @@ -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