From 6edb0f73baea15dc42884efc3d45681b9edba629 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 08:31:21 +0000 Subject: [PATCH 01/10] chore(deps-dev): bump nock from 14.0.0-beta.7 to 14.0.0-beta.14 Bumps [nock](https://github.com/nock/nock) from 14.0.0-beta.7 to 14.0.0-beta.14. - [Release notes](https://github.com/nock/nock/releases) - [Changelog](https://github.com/nock/nock/blob/main/CHANGELOG.md) - [Commits](https://github.com/nock/nock/compare/v14.0.0-beta.7...v14.0.0-beta.14) --- updated-dependencies: - dependency-name: nock dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/connectivity/package.json | 2 +- packages/http-client/package.json | 2 +- packages/odata-v2/package.json | 2 +- packages/odata-v4/package.json | 2 +- packages/openapi/package.json | 2 +- packages/resilience/package.json | 2 +- packages/util/package.json | 2 +- test-packages/integration-tests/package.json | 2 +- yarn.lock | 54 ++++++++++++++++++-- 9 files changed, 58 insertions(+), 12 deletions(-) diff --git a/packages/connectivity/package.json b/packages/connectivity/package.json index 6ec6c8a805..b97985352a 100644 --- a/packages/connectivity/package.json +++ b/packages/connectivity/package.json @@ -47,7 +47,7 @@ }, "devDependencies": { "mock-fs": "^5.2.0", - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2" } } diff --git a/packages/http-client/package.json b/packages/http-client/package.json index bddfc2a84d..85a7b0b7dc 100644 --- a/packages/http-client/package.json +++ b/packages/http-client/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "https-proxy-agent": "^7.0.5", - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2", "jsonwebtoken": "^9.0.2" } diff --git a/packages/odata-v2/package.json b/packages/odata-v2/package.json index 16d908a9aa..2a30e56b74 100644 --- a/packages/odata-v2/package.json +++ b/packages/odata-v2/package.json @@ -48,7 +48,7 @@ "devDependencies": { "@sap-cloud-sdk/test-services-odata-v2": "^3.21.0", "@sap-cloud-sdk/resilience": "^3.21.0", - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2" } } diff --git a/packages/odata-v4/package.json b/packages/odata-v4/package.json index b3eb001b88..021d0787a2 100644 --- a/packages/odata-v4/package.json +++ b/packages/odata-v4/package.json @@ -47,7 +47,7 @@ }, "devDependencies": { "@sap-cloud-sdk/test-services-odata-v4": "^3.21.0", - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2" } } diff --git a/packages/openapi/package.json b/packages/openapi/package.json index 6c700f0c1f..1a4a2db424 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -44,7 +44,7 @@ "axios": "^1.7.7" }, "devDependencies": { - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2" } } diff --git a/packages/resilience/package.json b/packages/resilience/package.json index 80183d0458..f623e92d2b 100644 --- a/packages/resilience/package.json +++ b/packages/resilience/package.json @@ -46,7 +46,7 @@ "devDependencies": { "@types/async-retry": "^1.4.8", "@types/opossum": "^8.1.7", - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2" } } diff --git a/packages/util/package.json b/packages/util/package.json index f481bf8872..00f8e6c030 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -42,7 +42,7 @@ "winston-transport": "^4.7.1" }, "devDependencies": { - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "typescript": "~5.6.2", "mock-fs": "^5.2.0" } diff --git a/test-packages/integration-tests/package.json b/test-packages/integration-tests/package.json index 879f80e856..712a3118ca 100644 --- a/test-packages/integration-tests/package.json +++ b/test-packages/integration-tests/package.json @@ -35,7 +35,7 @@ "execa": "^5.0.0", "jsonwebtoken": "^9.0.2", "mock-fs": "^5.2.0", - "nock": "^14.0.0-beta.6", + "nock": "^14.0.0-beta.14", "winston": "^3.14.2" } } diff --git a/yarn.lock b/yarn.lock index a2680e5ef3..ebb83916b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1142,6 +1142,18 @@ jju "^1.4.0" js-yaml "^4.1.0" +"@mswjs/interceptors@^0.35.6": + version "0.35.8" + resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz#f36e5907e05593e33037ef4519aac7815fa3509f" + integrity sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1271,6 +1283,24 @@ dependencies: "@octokit/openapi-types" "^22.1.0" +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -5286,6 +5316,11 @@ is-negative-zero@^2.0.3: resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -6738,11 +6773,12 @@ neo-async@^2.6.0: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -nock@^14.0.0-beta.6: - version "14.0.0-beta.7" - resolved "https://registry.npmjs.org/nock/-/nock-14.0.0-beta.7.tgz#bdb3f3cfa2276659c87412f6dff2aea9ee69a7fc" - integrity sha512-+EQMm5W9K8YnBE2Ceg4hnJynaCZmvK8ZlFXQ2fxGwtkOkBUq8GpQLTks2m1jpvse9XDxMDDOHgOWpiznFuh0bA== +nock@^14.0.0-beta.14: + version "14.0.0-beta.14" + resolved "https://registry.npmjs.org/nock/-/nock-14.0.0-beta.14.tgz#1d211b93a547386846d6054f455c2581ab34f750" + integrity sha512-nbUIuqYkixyazl4hWBQ+EJzb5F0/NJabIQFEEIQwBHPaG+RxvVSs4uSCasHMnCrNuCmOndxgUBqS860g6/OwJw== dependencies: + "@mswjs/interceptors" "^0.35.6" json-stringify-safe "^5.0.1" propagate "^2.0.0" @@ -7163,6 +7199,11 @@ outdent@^0.5.0: resolved "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== +outvariant@^1.4.0, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-filter@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" @@ -8607,6 +8648,11 @@ streamx@^2.15.0, streamx@^2.16.1: optionalDependencies: bare-events "^2.2.0" +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" From ea1a9c5b91012c53897d694b743f4a8f7f07e672 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Fri, 27 Sep 2024 13:47:45 +0200 Subject: [PATCH 02/10] fix cert --- .../test/test-util/xsuaa-service-mocks.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/test-resources/test/test-util/xsuaa-service-mocks.ts b/test-resources/test/test-util/xsuaa-service-mocks.ts index 5ecd092228..69b4db4e07 100644 --- a/test-resources/test/test-util/xsuaa-service-mocks.ts +++ b/test-resources/test/test-util/xsuaa-service-mocks.ts @@ -1,6 +1,7 @@ +import https from 'node:https'; import nock from 'nock'; import { basicHeader } from '@sap-cloud-sdk/connectivity/internal'; -import { ServiceCredentials } from '@sap-cloud-sdk/connectivity'; +import type { ServiceCredentials } from '@sap-cloud-sdk/connectivity'; export function mockClientCredentialsGrantCall( uri: string, @@ -30,6 +31,7 @@ export function mockClientCredentialsGrantWithCertCall( serviceCredentials: ServiceCredentials, zoneId?: string ) { + jest.spyOn(https, 'request'); return nock(uri, { reqheaders: xsuaaRequestHeaders(zoneId ? { zid: zoneId } : {}) }) @@ -38,9 +40,18 @@ export function mockClientCredentialsGrantWithCertCall( client_id: serviceCredentials.clientid }) .reply(responseCode, function () { - const agentOptions = (this.req as any).options.agent.options; - expect(agentOptions.cert).toEqual(serviceCredentials.certificate); - expect(agentOptions.key).toEqual(serviceCredentials.key); + expect(https.request).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + agent: expect.objectContaining({ + options: expect.objectContaining({ + key: serviceCredentials.key, + cert: serviceCredentials.certificate + }) + }) + }), + expect.anything() + ); return response; }); } From 1570dcfc61abd8447ac3fc94a9f8943fb6c4a610 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Fri, 27 Sep 2024 16:29:00 +0200 Subject: [PATCH 03/10] fix get with body # Conflicts: # packages/connectivity/package.json # test-packages/integration-tests/package.json # yarn.lock --- packages/openapi/src/openapi-request-builder.spec.ts | 11 ++--------- yarn.lock | 6 +++--- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/openapi/src/openapi-request-builder.spec.ts b/packages/openapi/src/openapi-request-builder.spec.ts index 3d98c51e79..5cae70f56e 100644 --- a/packages/openapi/src/openapi-request-builder.spec.ts +++ b/packages/openapi/src/openapi-request-builder.spec.ts @@ -210,11 +210,7 @@ describe('openapi-request-builder', () => { .get(/.*/) .reply(200, 'iss token used on the way') ]; - const requestBuilder = new OpenApiRequestBuilder('get', '/test', { - body: { - limit: 100 - } - }); + const requestBuilder = new OpenApiRequestBuilder('get', '/test'); const response = await requestBuilder.executeRaw({ destinationName: 'ERNIE-UND-CERT', iss: onlyIssuerXsuaaUrl @@ -227,10 +223,7 @@ describe('openapi-request-builder', () => { middleware: [], url: '/test', headers: { requestConfig: {} }, - params: { requestConfig: {} }, - data: { - limit: 100 - } + params: { requestConfig: {} } }, { fetchCsrfToken: false } ); diff --git a/yarn.lock b/yarn.lock index 7c2a335218..4ab4ec69f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1143,9 +1143,9 @@ js-yaml "^4.1.0" "@mswjs/interceptors@^0.35.6": - version "0.35.8" - resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz#f36e5907e05593e33037ef4519aac7815fa3509f" - integrity sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ== + version "0.35.9" + resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.9.tgz#1e1488ff2f333683d374eccc8c0f4d5d851c6d3d" + integrity sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ== dependencies: "@open-draft/deferred-promise" "^2.2.0" "@open-draft/logger" "^0.3.0" From e56e5657472b545e2f73ff41f755303ec9246afa Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 30 Sep 2024 10:12:30 +0200 Subject: [PATCH 04/10] Fix tests for 204 --- .../request-builder/update-request-builder.spec.ts | 12 +++++------- .../operation-request-builder.spec.ts | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/odata-v2/src/request-builder/update-request-builder.spec.ts b/packages/odata-v2/src/request-builder/update-request-builder.spec.ts index a1ad50d6bd..c7cc9ce6f6 100644 --- a/packages/odata-v2/src/request-builder/update-request-builder.spec.ts +++ b/packages/odata-v2/src/request-builder/update-request-builder.spec.ts @@ -476,21 +476,19 @@ describe('UpdateRequestBuilder', () => { it('returns request and raw response when sending non-key properties', async () => { const entity = createTestEntity(); entity.booleanProperty = false; - const requestBody = { + const body = { Int32Property: entity.int32Property, BooleanProperty: false, StringProperty: null }; - const response = { d: requestBody }; mockUpdateRequest( { - body: requestBody, + body, path: testEntityResourcePath( entity.keyPropertyGuid, entity.keyPropertyString - ), - responseBody: response + ) }, testEntityApi ); @@ -499,8 +497,8 @@ describe('UpdateRequestBuilder', () => { testEntityApi, entity ).executeRaw(defaultDestination); - expect(actual!.data).toEqual(response); - expect(actual!.request.method).toEqual('PATCH'); + expect(actual?.status).toEqual(204); + expect(actual?.request.method).toEqual('PATCH'); }); }); }); diff --git a/packages/odata-v4/src/request-builder/operation-request-builder.spec.ts b/packages/odata-v4/src/request-builder/operation-request-builder.spec.ts index 9a6ed4604a..2ffe3204fb 100644 --- a/packages/odata-v4/src/request-builder/operation-request-builder.spec.ts +++ b/packages/odata-v4/src/request-builder/operation-request-builder.spec.ts @@ -107,12 +107,12 @@ describe('operation request builder', () => { nock(host) .post(`${basePath}/TestActionImportNoParameterNoReturnType`) - .reply(204, {}); + .reply(204); const actual = await testActionImportNoParameterNoReturnType( {} ).executeRaw(destination); - expect(actual.data).toEqual({}); + expect(actual.status).toEqual(204); expect(actual.request.method).toBe('POST'); }); }); From 4fb19c6ded9026bc071472d25c694f02a827022b Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 1 Oct 2024 09:22:15 +0200 Subject: [PATCH 05/10] refactor --- .../src/request-builder/delete-request-builder.spec.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/odata-v2/src/request-builder/delete-request-builder.spec.ts b/packages/odata-v2/src/request-builder/delete-request-builder.spec.ts index 35afe9ea50..562727dd16 100644 --- a/packages/odata-v2/src/request-builder/delete-request-builder.spec.ts +++ b/packages/odata-v2/src/request-builder/delete-request-builder.spec.ts @@ -50,12 +50,11 @@ describe('DeleteRequestBuilder', () => { testEntityApi ); - const deleteRequest = new DeleteRequestBuilder( - testEntityApi, - entity - ).execute(defaultDestination); + const deleteRequest = new DeleteRequestBuilder(testEntityApi, entity); - await expect(deleteRequest).resolves.toBe(undefined); + await expect(deleteRequest.execute(defaultDestination)).resolves.toBe( + undefined + ); }); it('delete request with version identifier on the request should resolve', async () => { From e166f4ee7c84f699cfd358341569ae4de0487043 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 1 Oct 2024 10:30:39 +0200 Subject: [PATCH 06/10] fix typos --- .../request-builder/get-by-key-request-builder.spec.ts | 10 +++++----- .../request-builder/get-by-key-request-builder.spec.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/odata-v2/src/request-builder/get-by-key-request-builder.spec.ts b/packages/odata-v2/src/request-builder/get-by-key-request-builder.spec.ts index caab61615c..4e6b2ac7ea 100644 --- a/packages/odata-v2/src/request-builder/get-by-key-request-builder.spec.ts +++ b/packages/odata-v2/src/request-builder/get-by-key-request-builder.spec.ts @@ -70,9 +70,9 @@ describe('GetByKeyRequestBuilder', () => { expect(actual.versionIdentifier).toBeUndefined(); }); - it('ETag should be pulled from __metadata', async () => { + it('eTag should be pulled from __metadata', async () => { const entityData = createOriginalTestEntityData1(); - const versionIdentifier = 'etagInMetadata'; + const versionIdentifier = 'eTagInMetadata'; entityData['__metadata'] = { etag: versionIdentifier }; const expected = createTestEntity(entityData); @@ -95,10 +95,10 @@ describe('GetByKeyRequestBuilder', () => { expect(actual).toEqual(expected); }); - it('ETag should be pulled from response header when __metadata has no ETag property', async () => { + it('eTag should be pulled from response header when __metadata has no eTag property', async () => { const entityData = createOriginalTestEntityData1(); const expected = createTestEntity(entityData); - const versionIdentifier = 'etagInHeader'; + const versionIdentifier = 'eTagInHeader'; expected.setVersionIdentifier(versionIdentifier); mockGetRequest( @@ -108,7 +108,7 @@ describe('GetByKeyRequestBuilder', () => { expected.keyPropertyString ), responseBody: { d: entityData }, - responseHeaders: { Etag: versionIdentifier } + responseHeaders: { etag: versionIdentifier } }, testEntityApi ); diff --git a/packages/odata-v4/src/request-builder/get-by-key-request-builder.spec.ts b/packages/odata-v4/src/request-builder/get-by-key-request-builder.spec.ts index 925c72323d..8c98b6973f 100644 --- a/packages/odata-v4/src/request-builder/get-by-key-request-builder.spec.ts +++ b/packages/odata-v4/src/request-builder/get-by-key-request-builder.spec.ts @@ -95,9 +95,9 @@ describe('GetByKeyRequestBuilder', () => { expect(actual[0].somethingTheSdkDoesNotSupport).toBe('SomeValue'); }); - it('ETag should be pulled from @odata.etag', async () => { + it('eTag should be pulled from @odata.etag', async () => { const entityData = createOriginalTestEntityDataV4_1(); - const versionIdentifier = 'etagInMetadata'; + const versionIdentifier = 'eTagInMetadata'; entityData['@odata.etag'] = versionIdentifier; const expected = createTestEntity(entityData); const response = { @@ -129,10 +129,10 @@ describe('GetByKeyRequestBuilder', () => { expect(actual).toEqual(expected); }); - it('ETag should be pulled from response header when json payload has no @odata.etag property', async () => { + it('eTag should be pulled from response header when json payload has no @odata.etag property', async () => { const entityData = createOriginalTestEntityDataV4_1(); const expected = createTestEntity(entityData); - const versionIdentifier = 'etagInHeader'; + const versionIdentifier = 'eTagInHeader'; expected.setVersionIdentifier(versionIdentifier); const response = { KeyPropertyGuid: entityData.KeyPropertyGuid, @@ -150,7 +150,7 @@ describe('GetByKeyRequestBuilder', () => { expected.keyDateProperty ), responseBody: response, - responseHeaders: { Etag: versionIdentifier } + responseHeaders: { etag: versionIdentifier } }, testEntityApi ); From 27a8b5f27e70a371af88c8dfccbecd65e917d431 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Wed, 16 Oct 2024 11:25:17 +0200 Subject: [PATCH 07/10] nock 15 --- packages/connectivity/package.json | 2 +- packages/http-client/package.json | 2 +- packages/odata-v2/package.json | 2 +- packages/odata-v4/package.json | 2 +- packages/openapi/package.json | 2 +- packages/resilience/package.json | 2 +- packages/util/package.json | 2 +- test-packages/integration-tests/package.json | 2 +- yarn.lock | 18 +++++++++--------- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/connectivity/package.json b/packages/connectivity/package.json index 2c25ffaaa6..9a55437b8b 100644 --- a/packages/connectivity/package.json +++ b/packages/connectivity/package.json @@ -47,7 +47,7 @@ }, "devDependencies": { "mock-fs": "^5.3.0", - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3" } } diff --git a/packages/http-client/package.json b/packages/http-client/package.json index f7cda82e53..36a4c86320 100644 --- a/packages/http-client/package.json +++ b/packages/http-client/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "https-proxy-agent": "^7.0.5", - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3", "jsonwebtoken": "^9.0.2" } diff --git a/packages/odata-v2/package.json b/packages/odata-v2/package.json index dbecd3fcf5..380e474d79 100644 --- a/packages/odata-v2/package.json +++ b/packages/odata-v2/package.json @@ -48,7 +48,7 @@ "devDependencies": { "@sap-cloud-sdk/test-services-odata-v2": "^3.22.2", "@sap-cloud-sdk/resilience": "^3.22.2", - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3" } } diff --git a/packages/odata-v4/package.json b/packages/odata-v4/package.json index a0e65877f9..f3b0418f24 100644 --- a/packages/odata-v4/package.json +++ b/packages/odata-v4/package.json @@ -47,7 +47,7 @@ }, "devDependencies": { "@sap-cloud-sdk/test-services-odata-v4": "^3.22.2", - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3" } } diff --git a/packages/openapi/package.json b/packages/openapi/package.json index 437f5d084e..295151a46b 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -44,7 +44,7 @@ "axios": "^1.7.7" }, "devDependencies": { - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3" } } diff --git a/packages/resilience/package.json b/packages/resilience/package.json index 236cb548db..a4321e6312 100644 --- a/packages/resilience/package.json +++ b/packages/resilience/package.json @@ -46,7 +46,7 @@ "devDependencies": { "@types/async-retry": "^1.4.9", "@types/opossum": "^8.1.8", - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3" } } diff --git a/packages/util/package.json b/packages/util/package.json index 8aa23ff06b..ddf46e11f1 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -42,7 +42,7 @@ "winston-transport": "^4.8.0" }, "devDependencies": { - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "typescript": "~5.6.3", "mock-fs": "^5.3.0" } diff --git a/test-packages/integration-tests/package.json b/test-packages/integration-tests/package.json index bd0f6ecd24..3a4fa26c1b 100644 --- a/test-packages/integration-tests/package.json +++ b/test-packages/integration-tests/package.json @@ -35,7 +35,7 @@ "execa": "^5.0.0", "jsonwebtoken": "^9.0.2", "mock-fs": "^5.3.0", - "nock": "^14.0.0-beta.14", + "nock": "^14.0.0-beta.15", "winston": "^3.15.0" } } diff --git a/yarn.lock b/yarn.lock index 9d08193eab..4b741a2723 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1152,10 +1152,10 @@ jju "^1.4.0" js-yaml "^4.1.0" -"@mswjs/interceptors@^0.35.6": - version "0.35.9" - resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.9.tgz#1e1488ff2f333683d374eccc8c0f4d5d851c6d3d" - integrity sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ== +"@mswjs/interceptors@^0.36.4": + version "0.36.4" + resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.36.4.tgz#444d379ed917fa23640e65ddd8720c2cbf8725cd" + integrity sha512-ktzj7bra4HatOGqXw/PXyresXxFtnZa570rm4olAyf9HbvNdEWRkQl81ykmJK0nCHxNndmh2zQ84TBYKFDM+sg== dependencies: "@open-draft/deferred-promise" "^2.2.0" "@open-draft/logger" "^0.3.0" @@ -6939,12 +6939,12 @@ neo-async@^2.6.0: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -nock@^14.0.0-beta.14: - version "14.0.0-beta.14" - resolved "https://registry.npmjs.org/nock/-/nock-14.0.0-beta.14.tgz#1d211b93a547386846d6054f455c2581ab34f750" - integrity sha512-nbUIuqYkixyazl4hWBQ+EJzb5F0/NJabIQFEEIQwBHPaG+RxvVSs4uSCasHMnCrNuCmOndxgUBqS860g6/OwJw== +nock@^14.0.0-beta.15: + version "14.0.0-beta.15" + resolved "https://registry.npmjs.org/nock/-/nock-14.0.0-beta.15.tgz#1eb16e009d3a692bb2a9db4ba4a2834bda424aa3" + integrity sha512-rp72chatxoZbR/2cYHwtb+IX6n6kkanYKGN2PKn4c12JBrj9n4xGUKFykuQHB+Gkz3fynlikFbMH2LI6VoebuQ== dependencies: - "@mswjs/interceptors" "^0.35.6" + "@mswjs/interceptors" "^0.36.4" json-stringify-safe "^5.0.1" propagate "^2.0.0" From 8510dc74b14bda0ec5e25c258894f81ae5c998ca Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Wed, 16 Oct 2024 13:06:44 +0200 Subject: [PATCH 08/10] unlikely but try this --- .../batch-request-builder.spec.ts | 3 +-- .../create-request-builder.spec.ts | 1 - .../test/test-util/request-mocker.ts | 27 +++++++++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts b/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts index 09f486fd9c..d0e1bad8e8 100644 --- a/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts +++ b/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts @@ -119,13 +119,12 @@ HTTP/1.1 200 OK requestBuilder ]); const response = await batch(changeSet).execute({ url: baseUrl }); + expect(response[0].isWriteResponses()).toBeTruthy(); if (response[0].isWriteResponses()) { const casted = testFunctionImportPost({} as any).responseTransformer( response[0].responses[0].body ); expect(casted).toBe(true); - } else { - throw new Error('Should be writeResponse'); } }); diff --git a/packages/odata-v2/src/request-builder/create-request-builder.spec.ts b/packages/odata-v2/src/request-builder/create-request-builder.spec.ts index 24105b786a..d38b2a4a7a 100644 --- a/packages/odata-v2/src/request-builder/create-request-builder.spec.ts +++ b/packages/odata-v2/src/request-builder/create-request-builder.spec.ts @@ -260,7 +260,6 @@ describe('CreateRequestBuilder', () => { it('throws an error when request execution fails', async () => { mockCreateRequest( { - body: () => true, statusCode: 500 }, testEntityApi diff --git a/test-resources/test/test-util/request-mocker.ts b/test-resources/test/test-util/request-mocker.ts index e3383b124b..92159bcf5d 100644 --- a/test-resources/test/test-util/request-mocker.ts +++ b/test-resources/test/test-util/request-mocker.ts @@ -1,8 +1,5 @@ import nock from 'nock'; import { - EntityApi, - EntityBase, - GetAllRequestBuilderBase, ODataCreateRequestConfig, ODataDeleteRequestConfig, ODataGetAllRequestConfig, @@ -11,11 +8,16 @@ import { } from '@sap-cloud-sdk/odata-common/internal'; import { createODataUri as createODataUriV2 } from '@sap-cloud-sdk/odata-v2/internal'; import { createODataUri as createODataUriV4 } from '@sap-cloud-sdk/odata-v4/internal'; -import { +import { basicHeader } from '@sap-cloud-sdk/connectivity/internal'; +import type { HttpDestination, - Destination, - basicHeader + Destination } from '@sap-cloud-sdk/connectivity/internal'; +import type { + EntityApi, + EntityBase, + GetAllRequestBuilderBase +} from '@sap-cloud-sdk/odata-common/internal'; const defaultCsrfToken = 'mocked-x-csrf-token'; @@ -66,7 +68,16 @@ interface MockRequestParams { responseBody?: Record; responseHeaders?: Record; query?: Record; - method?: string; + method?: + | 'get' + | 'post' + | 'put' + | 'head' + | 'patch' + | 'merge' + | 'delete' + | 'options'; + headers?: Record; delay?: number; } @@ -82,7 +93,7 @@ export function mockCreateRequest>( return mockRequest(requestConfig, { ...params, statusCode: params.statusCode || 200, - method: params.method || 'post', + method: params.method || ('post' as const), responseBody: { d: params.responseBody || params.body } }); } From 7e4899e4ca7a4eb5f2e4df84822493c0e518a9ff Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Wed, 16 Oct 2024 13:35:05 +0200 Subject: [PATCH 09/10] batch improvements --- .../src/request-builder/batch-request-builder.spec.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts b/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts index d0e1bad8e8..1814753fa1 100644 --- a/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts +++ b/packages/odata-v2/src/request-builder/batch-request-builder.spec.ts @@ -76,13 +76,12 @@ HTTP/1.1 200 OK const response = await batch( operations.testFunctionImportGet({} as any) ).execute({ url: baseUrl }); + expect(response[0].isReadResponse()).toBeTruthy(); if (response[0].isReadResponse()) { const casted = testFunctionImportGet({} as any).responseTransformer( response[0].body ); expect(casted).toEqual('MyText'); - } else { - throw new Error('Should be readResponse'); } }); @@ -137,11 +136,10 @@ HTTP/1.1 200 OK const response = await batch( testEntityApi.requestBuilder().getAll() ).execute({ url: baseUrl }); + expect(response[0].isReadResponse()).toBeTruthy(); if (response[0].isReadResponse()) { const casted = response[0].as(testEntityApi); expect(casted[0].stringProperty).toEqual('4711'); - } else { - throw new Error('Should be readResponse'); } }); }); From c31d042eeb1733da1a4519296b63305958133fb4 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Wed, 16 Oct 2024 13:57:36 +0200 Subject: [PATCH 10/10] add debug tests --- .../src/request-builder/a-debug.spec.ts | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 packages/odata-v2/src/request-builder/a-debug.spec.ts diff --git a/packages/odata-v2/src/request-builder/a-debug.spec.ts b/packages/odata-v2/src/request-builder/a-debug.spec.ts new file mode 100644 index 0000000000..911cae6ae8 --- /dev/null +++ b/packages/odata-v2/src/request-builder/a-debug.spec.ts @@ -0,0 +1,202 @@ +import { + testFunctionImportGet, + testFunctionImportPost, + testService +} from '@sap-cloud-sdk/test-services-odata-v2/test-service'; +import nock from 'nock'; +import { + BatchChangeSet, + ODataCreateRequestConfig, + ODataRequest +} from '@sap-cloud-sdk/odata-common'; +import { createODataUri as createODataUriV2 } from '@sap-cloud-sdk/odata-v2/internal'; +import { + defaultDestination, + defaultHost, + defaultRequestHeaders +} from '../../../../test-resources/test/test-util'; +import { CreateRequestBuilder } from './create-request-builder'; +import type { DefaultDeSerializers } from '../de-serializers'; +const regexUuid = '\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}'; +const responseBoundary = 'responseBoundary'; + +describe('debug', () => { + const { batch, testEntityApi, operations } = testService(); + + const getHeader = contentType => `Content-Type: ${contentType} +Content-Length: 3886 +content-transfer-encoding: binary + +HTTP/1.1 200 OK +Content-Type: application/json; charset=utf-8 +Content-Length: 3679 +sap-metadata-last-modified: Wed, 22 Dec 2021 22:29:24 GMT +cache-control: no-store, no-cache +dataserviceversion: 2.0`; + + const getAllResponse = `--${responseBoundary} +${getHeader('application/http')} + +{"d":{"results":[{"StringProperty":"4711"}]}} +--${responseBoundary}-- +`; + + const functionImportResponse = `--${responseBoundary} +${getHeader('application/http')} + +{"d": {"TestFunctionImportGET":"MyText"}} + +--${responseBoundary}-- +`; + + const postResponse = `--${responseBoundary} +${getHeader('multipart/mixed; boundary=batchId')} + +--batchId +--partId +HTTP/1.1 200 OK + +{"d": {"TestFunctionImportPOST":true}} +--batchId + +--${responseBoundary}-- +`; + + const baseUrl = 'https://some.sdk.test.url.com'; + + it('batch works with function imports', async () => { + const body = [ + `--batch_${regexUuid}`, + 'Content-Type: application/http', + 'Content-Transfer-Encoding: binary', + '', + 'GET /sap/opu/odata/sap/API_TEST_SRV/TestFunctionImportGET HTTP/1.1', + 'Content-Type: application/json', + 'Accept: application/json', + '', + '', + `--batch_${regexUuid}--`, + '' + ].join('\r\n'); + + nock(baseUrl) + .post('/sap/opu/odata/sap/API_TEST_SRV/$batch', new RegExp(body)) + .reply(202, functionImportResponse, { + 'content-type': `multipart/mixed; boundary=${responseBoundary}` + }); + const response = await batch( + operations.testFunctionImportGet({} as any) + ).execute({ url: baseUrl }); + expect(response[0].isReadResponse()).toBeTruthy(); + if (response[0].isReadResponse()) { + const casted = testFunctionImportGet({} as any).responseTransformer( + response[0].body + ); + expect(casted).toEqual('MyText'); + } + }); + + it('batch works with POST function imports', async () => { + const body = [ + `--batch_${regexUuid}`, + `Content-Type: multipart/mixed; boundary=changeset_${regexUuid}`, + '', + `--changeset_${regexUuid}`, + 'Content-Type: application/http', + 'Content-Transfer-Encoding: binary', + `Content-Id: ${regexUuid}`, + '', + "POST /sap/opu/odata/sap/API_TEST_SRV/TestFunctionImportPOST\\?SimpleParam='someValue' HTTP/1.1", + 'Content-Type: application/json', + 'Accept: application/json', + '', + '', + '', + `--changeset_${regexUuid}--`, + `--batch_${regexUuid}--`, + '' + ].join('\r\n'); + nock(baseUrl) + .post('/sap/opu/odata/sap/API_TEST_SRV/$batch', new RegExp(body)) + .reply(202, postResponse, { + 'content-type': `multipart/mixed; boundary=${responseBoundary}` + }); + + const requestBuilder = testFunctionImportPost({ + simpleParam: 'someValue' + }); + const changeSet = new BatchChangeSet([ + requestBuilder + ]); + const response = await batch(changeSet).execute({ url: baseUrl }); + expect(response[0].isWriteResponses()).toBeTruthy(); + if (response[0].isWriteResponses()) { + const casted = testFunctionImportPost({} as any).responseTransformer( + response[0].responses[0].body + ); + expect(casted).toBe(true); + } + }); + + it('executes a getAll request', async () => { + nock(baseUrl) + .post('/sap/opu/odata/sap/API_TEST_SRV/$batch') + .reply(202, getAllResponse, { + 'content-type': `multipart/mixed; boundary=${responseBoundary}` + }); + const response = await batch( + testEntityApi.requestBuilder().getAll() + ).execute({ url: baseUrl }); + expect(response[0].isReadResponse()).toBeTruthy(); + if (response[0].isReadResponse()) { + const casted = response[0].as(testEntityApi); + expect(casted[0].stringProperty).toEqual('4711'); + } + }); + + it('create', async () => { + const requestConfig = new ODataCreateRequestConfig( + testEntityApi, + createODataUriV2(testEntityApi.deSerializers) + ); + + const request = new ODataRequest(requestConfig, defaultDestination); + + nock(defaultHost).head(`/${request.relativeServiceUrl()}`).reply(200); + + nock(defaultHost) + .post(`/${request.relativeServiceUrl()}`, () => true) + // .query({}) + // .delay(0) + .reply(500, { d: undefined }); + + const someEntity = testEntityApi.entityBuilder().stringProperty('').build(); + + const createRequest = new CreateRequestBuilder( + testEntityApi, + someEntity + ).execute(defaultDestination); + + await expect(createRequest).rejects.toThrowErrorMatchingInlineSnapshot( + '"Create request failed!"' + ); + }); +}); + +function getRequestHeaders( + method: string, + additionalHeaders?: Record, + headers?: Record +) { + if (headers) { + return { reqheaders: headers }; + } + + if (additionalHeaders) { + const initialHeaders = + method === 'get' + ? defaultRequestHeaders + : { ...defaultRequestHeaders, 'x-csrf-token': 'mocked-x-csrf-token' }; + return { reqheaders: { ...initialHeaders, ...additionalHeaders } }; + } +}