From b4bc9add1c6e5af54b7402e829e0b6a7835b321f Mon Sep 17 00:00:00 2001 From: Deeksha Sinha <88374536+deekshas8@users.noreply.github.com> Date: Mon, 15 Apr 2024 16:19:01 +0200 Subject: [PATCH] fix: Fix quote issue in path pattern (#4634) * fix quote issue in path * Changes from lint:fix * changelog * fix test * fix test 2 * fix test 3 --------- Co-authored-by: cloud-sdk-js --- .changeset/lemon-cats-jog.md | 5 +++ .../__snapshots__/operation.spec.ts.snap | 16 ++++++++ .../src/file-serializer/api-file.spec.ts | 8 ++-- .../src/file-serializer/operation.spec.ts | 37 ++++++++++++++++--- .../src/file-serializer/operation.ts | 2 +- .../src/openapi-request-builder.spec.ts | 12 ++++-- 6 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 .changeset/lemon-cats-jog.md create mode 100644 packages/openapi-generator/src/file-serializer/__snapshots__/operation.spec.ts.snap diff --git a/.changeset/lemon-cats-jog.md b/.changeset/lemon-cats-jog.md new file mode 100644 index 0000000000..c3338e5154 --- /dev/null +++ b/.changeset/lemon-cats-jog.md @@ -0,0 +1,5 @@ +--- +"@sap-cloud-sdk/openapi-generator": minor +--- + +[Fixed Issue] Fix serialization of path params that contain quotes to avoid syntax error and failing client generation diff --git a/packages/openapi-generator/src/file-serializer/__snapshots__/operation.spec.ts.snap b/packages/openapi-generator/src/file-serializer/__snapshots__/operation.spec.ts.snap new file mode 100644 index 0000000000..994c848701 --- /dev/null +++ b/packages/openapi-generator/src/file-serializer/__snapshots__/operation.spec.ts.snap @@ -0,0 +1,16 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`serializeOperation serializes operation with path parameters inside () 1`] = ` +"/** + * Create a request builder for execution of get requests to the 'test('{id}')' endpoint. + * @param id - Path parameter. + * @returns The request builder, use the \`execute()\` method to trigger the request. + */ +getFn: (id: string) => new OpenApiRequestBuilder>( + 'get', + "test('{id}')", + { + pathParameters: { id } + } +)" +`; diff --git a/packages/openapi-generator/src/file-serializer/api-file.spec.ts b/packages/openapi-generator/src/file-serializer/api-file.spec.ts index e4bae4897e..b74d1ad181 100644 --- a/packages/openapi-generator/src/file-serializer/api-file.spec.ts +++ b/packages/openapi-generator/src/file-serializer/api-file.spec.ts @@ -41,7 +41,7 @@ describe('apiFile', () => { */ getFn: (id: string) => new OpenApiRequestBuilder( 'get', - 'test/{id}', + "test/{id}", { pathParameters: { id } } @@ -126,7 +126,7 @@ describe('apiFile', () => { */ getFn: (id: string, queryParameters: {'queryParam': QueryParameterType}) => new OpenApiRequestBuilder( 'get', - 'test/{id}', + "test/{id}", { pathParameters: { id }, queryParameters @@ -139,7 +139,7 @@ describe('apiFile', () => { */ createFn: (body: RefType) => new OpenApiRequestBuilder( 'post', - 'test', + "test", { body } @@ -178,7 +178,7 @@ describe('apiFile', () => { */ getFn: () => new OpenApiRequestBuilder( 'get', - 'test' + "test" ) };" `); diff --git a/packages/openapi-generator/src/file-serializer/operation.spec.ts b/packages/openapi-generator/src/file-serializer/operation.spec.ts index cd73892c87..9af46cabd2 100644 --- a/packages/openapi-generator/src/file-serializer/operation.spec.ts +++ b/packages/openapi-generator/src/file-serializer/operation.spec.ts @@ -52,7 +52,7 @@ describe('serializeOperation', () => { */ getFn: (id: string, subId: string, queryParameters?: {'limit'?: number}) => new OpenApiRequestBuilder( 'get', - 'test/{id}/{subId}', + "test/{id}/{subId}", { pathParameters: { id, subId }, queryParameters @@ -93,7 +93,7 @@ describe('serializeOperation', () => { */ deleteFn: (id: string) => new OpenApiRequestBuilder>( 'delete', - 'test/{id}', + "test/{id}", { pathParameters: { id } } @@ -101,6 +101,33 @@ describe('serializeOperation', () => { `); }); + it('serializes operation with path parameters inside ()', () => { + const operation: OpenApiOperation = { + operationId: 'getFn', + method: 'get', + tags: [], + pathParameters: [ + { + in: 'path', + name: 'id', + originalName: 'id', + schema: { type: 'string' }, + required: true, + schemaProperties: {} + } + ], + queryParameters: [], + responses: { 200: { description: 'some response description' } }, + response: { + additionalProperties: { type: 'any' }, + properties: [] + }, + pathPattern: "test('{id}')" + }; + + expect(serializeOperation(operation)).toMatchSnapshot(); + }); + it('serializes operation with only query parameters', () => { const operation: OpenApiOperation = { operationId: 'getFn', @@ -129,7 +156,7 @@ describe('serializeOperation', () => { */ getFn: (queryParameters?: {'limit'?: number}) => new OpenApiRequestBuilder( 'get', - 'test', + "test", { queryParameters } @@ -173,7 +200,7 @@ describe('serializeOperation', () => { */ createFn: (id: string, body: Record) => new OpenApiRequestBuilder( 'post', - 'test/{id}', + "test/{id}", { pathParameters: { id }, body @@ -209,7 +236,7 @@ describe('serializeOperation', () => { */ fnWithRefBody: (body: RefType | undefined) => new OpenApiRequestBuilder( 'post', - 'test', + "test", { body } diff --git a/packages/openapi-generator/src/file-serializer/operation.ts b/packages/openapi-generator/src/file-serializer/operation.ts index 8ad552510c..f0c98511ff 100644 --- a/packages/openapi-generator/src/file-serializer/operation.ts +++ b/packages/openapi-generator/src/file-serializer/operation.ts @@ -15,7 +15,7 @@ import { serializeSchema } from './schema'; export function serializeOperation(operation: OpenApiOperation): string { const requestBuilderParams = [ `'${operation.method}'`, - `'${operation.pathPattern}'` + `"${operation.pathPattern}"` ]; const bodyAndQueryParams = serializeParamsForRequestBuilder(operation); diff --git a/packages/openapi/src/openapi-request-builder.spec.ts b/packages/openapi/src/openapi-request-builder.spec.ts index 1a88f56ed7..f3203c7d4c 100644 --- a/packages/openapi/src/openapi-request-builder.spec.ts +++ b/packages/openapi/src/openapi-request-builder.spec.ts @@ -234,16 +234,20 @@ describe('openapi-request-builder', () => { }); it('encodes path parameters', async () => { - const requestBuilder = new OpenApiRequestBuilder('get', '/test/{id}', { - pathParameters: { id: '^test' } - }); + const requestBuilder = new OpenApiRequestBuilder( + 'get', + "/test('{someId}')/{id}", + { + pathParameters: { someId: 'value', id: '^test' } + } + ); const response = await requestBuilder.executeRaw(destination); expect(httpSpy).toHaveBeenCalledWith( sanitizeDestination(destination), { method: 'get', middleware: [], - url: '/test/%5Etest', + url: "/test('value')/%5Etest", headers: { requestConfig: {} }, params: { requestConfig: {} }, data: undefined