diff --git a/clients/imodels-client-management/package.json b/clients/imodels-client-management/package.json index 758a91a1..6a081ec9 100644 --- a/clients/imodels-client-management/package.json +++ b/clients/imodels-client-management/package.json @@ -33,7 +33,7 @@ "extends": "./node_modules/@itwin/imodels-client-common-config/.eslintrc.json" }, "dependencies": { - "axios": "^1.0.0" + "axios": "1.1.0" }, "devDependencies": { "@itwin/imodels-client-common-config": "workspace:*", diff --git a/clients/imodels-client-management/src/base/internal/AxiosRestClient.ts b/clients/imodels-client-management/src/base/internal/AxiosRestClient.ts index 3ba397bf..445ef406 100644 --- a/clients/imodels-client-management/src/base/internal/AxiosRestClient.ts +++ b/clients/imodels-client-management/src/base/internal/AxiosRestClient.ts @@ -18,6 +18,8 @@ export class AxiosRestClient implements RestClient { constructor(parseErrorFunc: ParseErrorFunc) { this._parseErrorFunc = parseErrorFunc; + delete axios.defaults.headers.post["Content-Type"]; + delete axios.defaults.headers.patch["Content-Type"]; } public sendGetRequest(params: HttpGetRequestParams & { responseType: ContentType.Json }): Promise; @@ -43,7 +45,7 @@ export class AxiosRestClient implements RestClient { headers: params.headers }; - return this.executeRequest(async () => axios.post(params.url, params.body.content ?? {}, requestConfig)); + return this.executeRequest(async () => axios.post(params.url, params.body.content, requestConfig)); } public async sendPutRequest(params: HttpRequestWithBinaryBodyParams): Promise { @@ -59,7 +61,7 @@ export class AxiosRestClient implements RestClient { headers: params.headers }; - return this.executeRequest(async () => axios.patch(params.url, params.body.content ?? {}, requestConfig)); + return this.executeRequest(async () => axios.patch(params.url, params.body.content, requestConfig)); } public async sendDeleteRequest(params: HttpRequestParams): Promise { diff --git a/clients/imodels-client-management/src/base/internal/OperationsBase.ts b/clients/imodels-client-management/src/base/internal/OperationsBase.ts index 8faf9dcb..c89ab7c1 100644 --- a/clients/imodels-client-management/src/base/internal/OperationsBase.ts +++ b/clients/imodels-client-management/src/base/internal/OperationsBase.ts @@ -119,7 +119,7 @@ export class OperationsBase { } } - private async formHeaders(params: CommonRequestParams & { preferReturn?: PreferReturn, contentType?: ContentType}): Promise> { + private async formHeaders(params: CommonRequestParams & { preferReturn?: PreferReturn, contentType?: ContentType, body?: object }): Promise> { const headers: Dictionary = {}; const authorizationInfo = await params.authorization(); headers[Constants.headers.authorization] = `${authorizationInfo.scheme} ${authorizationInfo.token}`; @@ -128,7 +128,7 @@ export class OperationsBase { if (params.preferReturn) headers[Constants.headers.prefer] = `return=${params.preferReturn}`; - if (params.contentType) + if (params.contentType && params.body !== undefined) headers[Constants.headers.contentType] = params.contentType; this.addOrUpdateHeaders(headers, this._options.headers); diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d19a3c64..043daee8 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -34,14 +34,14 @@ importers: specifiers: '@itwin/imodels-client-common-config': workspace:* '@types/node': ^18.11.18 - axios: ^1.0.0 + axios: 1.1.0 cspell: ~5.21.0 eslint: ~7.31.0 rimraf: ~3.0.2 sort-package-json: ~1.53.1 typescript: ~4.4.0 dependencies: - axios: 1.4.0 + axios: 1.1.0 devDependencies: '@itwin/imodels-client-common-config': link:../../utils/imodels-client-common-config '@types/node': 18.16.16 @@ -62,7 +62,7 @@ importers: '@itwin/imodels-client-common-config': workspace:* '@types/node': 14.14.31 '@types/ws': ^7.0.0 - axios: ^1.0.0 + axios: 1.1.0 cspell: ~5.21.0 eslint: ~7.31.0 rimraf: ~3.0.2 @@ -71,7 +71,7 @@ importers: dependencies: '@azure/abort-controller': 1.1.0 '@itwin/imodels-client-authoring': link:../../clients/imodels-client-authoring - axios: 1.4.0 + axios: 1.1.0 devDependencies: '@itwin/core-backend': 4.0.0_acda798b3eb76717c9a14158b1be73d0 '@itwin/core-bentley': 4.0.0 @@ -248,7 +248,7 @@ importers: '@types/node': ^18.11.18 '@types/sinon': ^10.0.15 '@types/sinon-chai': ^3.2.9 - axios: ^1.0.0 + axios: 1.1.0 chai: ~4.3.4 chai-as-promised: ~7.1.1 cpx2: 4.2.0 @@ -272,7 +272,7 @@ importers: '@itwin/imodels-client-test-utils': link:../../utils/imodels-client-test-utils '@itwin/object-storage-azure': 1.6.0 '@itwin/object-storage-core': 1.6.0 - axios: 1.4.0 + axios: 1.1.0 chai: 4.3.7 chai-as-promised: 7.1.1_chai@4.3.7 dotenv: 10.0.0 @@ -365,7 +365,7 @@ importers: '@itwin/object-storage-core': ^1.6.0 '@types/chai': ~4.2.21 '@types/node': ^18.11.18 - axios: ^1.0.0 + axios: 1.1.0 chai: ~4.3.4 cpx2: 4.2.0 cspell: ~5.21.0 @@ -381,7 +381,7 @@ importers: '@itwin/imodels-client-authoring': link:../../clients/imodels-client-authoring '@itwin/imodels-client-management': link:../../clients/imodels-client-management '@itwin/object-storage-core': 1.6.0 - axios: 1.4.0 + axios: 1.1.0 chai: 4.3.7 dotenv: 10.0.0 inversify: 5.0.5 @@ -412,17 +412,17 @@ packages: resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} engines: {node: '>=12.0.0'} dependencies: - tslib: 2.5.2 + tslib: 2.5.3 /@azure/core-auth/1.4.0: resolution: {integrity: sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==} engines: {node: '>=12.0.0'} dependencies: '@azure/abort-controller': 1.1.0 - tslib: 2.5.2 + tslib: 2.5.3 - /@azure/core-http/3.0.1: - resolution: {integrity: sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==} + /@azure/core-http/3.0.2: + resolution: {integrity: sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==} engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 @@ -435,7 +435,7 @@ packages: form-data: 4.0.0 node-fetch: 2.6.11 process: 0.11.10 - tslib: 2.5.2 + tslib: 2.5.3 tunnel: 0.0.6 uuid: 8.3.2 xml2js: 0.5.0 @@ -449,46 +449,46 @@ packages: '@azure/abort-controller': 1.1.0 '@azure/core-util': 1.3.2 '@azure/logger': 1.0.4 - tslib: 2.5.2 + tslib: 2.5.3 /@azure/core-paging/1.5.0: resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.2 + tslib: 2.5.3 /@azure/core-tracing/1.0.0-preview.13: resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} engines: {node: '>=12.0.0'} dependencies: '@opentelemetry/api': 1.4.1 - tslib: 2.5.2 + tslib: 2.5.3 /@azure/core-util/1.3.2: resolution: {integrity: sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==} engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 - tslib: 2.5.2 + tslib: 2.5.3 /@azure/logger/1.0.4: resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.2 + tslib: 2.5.3 /@azure/storage-blob/12.13.0: resolution: {integrity: sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==} engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 - '@azure/core-http': 3.0.1 + '@azure/core-http': 3.0.2 '@azure/core-lro': 2.5.3 '@azure/core-paging': 1.5.0 '@azure/core-tracing': 1.0.0-preview.13 '@azure/logger': 1.0.4 events: 3.3.0 - tslib: 2.5.2 + tslib: 2.5.3 transitivePeerDependencies: - encoding @@ -497,13 +497,13 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 - '@azure/core-http': 3.0.1 + '@azure/core-http': 3.0.2 '@azure/core-lro': 2.5.3 '@azure/core-paging': 1.5.0 '@azure/core-tracing': 1.0.0-preview.13 '@azure/logger': 1.0.4 events: 3.3.0 - tslib: 2.5.2 + tslib: 2.5.3 transitivePeerDependencies: - encoding dev: false @@ -536,10 +536,10 @@ packages: '@babel/helper-compilation-targets': 7.22.1_@babel+core@7.22.1 '@babel/helper-module-transforms': 7.22.1 '@babel/helpers': 7.22.3 - '@babel/parser': 7.22.3 + '@babel/parser': 7.22.4 '@babel/template': 7.21.9 - '@babel/traverse': 7.22.1 - '@babel/types': 7.22.3 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -553,7 +553,7 @@ packages: resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.3 + '@babel/types': 7.22.4 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -583,21 +583,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.21.9 - '@babel/types': 7.22.3 + '@babel/types': 7.22.4 dev: true /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.3 + '@babel/types': 7.22.4 dev: true /@babel/helper-module-imports/7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.3 + '@babel/types': 7.22.4 dev: true /@babel/helper-module-transforms/7.22.1: @@ -610,8 +610,8 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.21.9 - '@babel/traverse': 7.22.1 - '@babel/types': 7.22.3 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 transitivePeerDependencies: - supports-color dev: true @@ -620,14 +620,14 @@ packages: resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.3 + '@babel/types': 7.22.4 dev: true /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.3 + '@babel/types': 7.22.4 dev: true /@babel/helper-string-parser/7.21.5: @@ -650,8 +650,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.21.9 - '@babel/traverse': 7.22.1 - '@babel/types': 7.22.3 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.4 transitivePeerDependencies: - supports-color dev: true @@ -665,8 +665,8 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.22.3: - resolution: {integrity: sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==} + /@babel/parser/7.22.4: + resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} engines: {node: '>=6.0.0'} hasBin: true dev: true @@ -690,12 +690,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 - '@babel/parser': 7.22.3 - '@babel/types': 7.22.3 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 dev: true - /@babel/traverse/7.22.1: - resolution: {integrity: sha512-lAWkdCoUFnmwLBhIRLciFntGYsIIoC6vIbN8zrLPqBnJmPu7Z6nzqnKd7FsxQUNAvZfVZ0x6KdNvNp8zWIOHSQ==} + /@babel/traverse/7.22.4: + resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 @@ -704,16 +704,16 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.22.3 - '@babel/types': 7.22.3 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.22.3: - resolution: {integrity: sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==} + /@babel/types/7.22.4: + resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.21.5 @@ -2006,8 +2006,8 @@ packages: transitivePeerDependencies: - debug - /axios/1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + /axios/1.1.0: + resolution: {integrity: sha512-hsJgcqz4JY7f+HZ4cWTrPZ6tZNCNFPTRx1MjRqu/hbpgpHdSCUpLVuplc+jE/h7dOvyANtw/ERA3HC2Rz/QoMg==} dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 @@ -2081,8 +2081,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001489 - electron-to-chromium: 1.4.411 + caniuse-lite: 1.0.30001495 + electron-to-chromium: 1.4.423 node-releases: 2.0.12 update-browserslist-db: 1.0.11_browserslist@4.21.7 dev: true @@ -2134,8 +2134,8 @@ packages: engines: {node: '>=10'} dev: false - /caniuse-lite/1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + /caniuse-lite/1.0.30001495: + resolution: {integrity: sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg==} dev: true /caseless/0.12.0: @@ -2511,7 +2511,7 @@ packages: cli-table3: 0.6.3 commander: 5.1.0 common-tags: 1.8.2 - dayjs: 1.11.7 + dayjs: 1.11.8 debug: 4.3.4_supports-color@8.1.1 enquirer: 2.3.6 eventemitter2: 6.4.7 @@ -2550,8 +2550,8 @@ packages: assert-plus: 1.0.0 dev: false - /dayjs/1.11.7: - resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + /dayjs/1.11.8: + resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==} dev: false /debounce/1.2.1: @@ -2732,8 +2732,8 @@ packages: safer-buffer: 2.1.2 dev: false - /electron-to-chromium/1.4.411: - resolution: {integrity: sha512-5VXLW4Qw89vM2WTICHua/y8v7fKGDRVa2VPOtBB9IpLvW316B+xd8yD1wTmLPY2ot/00P/qt87xdolj4aG/Lzg==} + /electron-to-chromium/1.4.423: + resolution: {integrity: sha512-y4A7YfQcDGPAeSWM1IuoWzXpg9RY1nwHzHSwRtCSQFp9FgAVDgdWlFf0RbdWfLWQ2WUI+bddUgk5RgTjqRE6FQ==} dev: true /emoji-regex/8.0.0: @@ -5151,7 +5151,7 @@ packages: /rxjs/7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.2 + tslib: 2.5.3 dev: false /safe-buffer/5.2.1: @@ -5574,8 +5574,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tslib/2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} /tsutils/3.21.0_typescript@4.4.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} diff --git a/itwin-platform-access/imodels-access-backend/package.json b/itwin-platform-access/imodels-access-backend/package.json index 4edcd08e..5b5363c1 100644 --- a/itwin-platform-access/imodels-access-backend/package.json +++ b/itwin-platform-access/imodels-access-backend/package.json @@ -33,7 +33,7 @@ "dependencies": { "@azure/abort-controller": "^1.1.0", "@itwin/imodels-client-authoring": "workspace:*", - "axios": "^1.0.0" + "axios": "1.1.0" }, "devDependencies": { "@itwin/core-backend": "^4.0.0", diff --git a/itwin-platform-access/imodels-access-backend/src/BackendIModelsAccess.ts b/itwin-platform-access/imodels-access-backend/src/BackendIModelsAccess.ts index ef287fbb..2aceeb3d 100644 --- a/itwin-platform-access/imodels-access-backend/src/BackendIModelsAccess.ts +++ b/itwin-platform-access/imodels-access-backend/src/BackendIModelsAccess.ts @@ -247,7 +247,7 @@ export class BackendIModelsAccess implements BackendHubAccess { const contentRangeHeaderName = "content-range"; const response: AxiosResponse = await axios.get(downloadUrl, { headers: { Range: emptyRangeHeaderValue } }); - const rangeHeaderValue: string = response.headers[contentRangeHeaderName]; + const rangeHeaderValue: string = response.headers[contentRangeHeaderName]!; const rangeTotalBytesString: string = rangeHeaderValue.split("/")[1]; const rangeTotalBytes: number = parseInt(rangeTotalBytesString, 10); diff --git a/tests/imodels-clients-tests-browser/src/ThumbnailOperations.test.ts b/tests/imodels-clients-tests-browser/src/ThumbnailOperations.test.ts index 6fb917d3..0d0302bc 100644 --- a/tests/imodels-clients-tests-browser/src/ThumbnailOperations.test.ts +++ b/tests/imodels-clients-tests-browser/src/ThumbnailOperations.test.ts @@ -73,7 +73,10 @@ describe(`[Management] ${ThumbnailOperations.name}`, () => { // Arrange const iModelScopedOperationParams: IModelScopedOperationParams = { authorization, - iModelId: testIModelForWriteId + iModelId: testIModelForWriteId, + headers: { + "Accept-Encoding": "gzip,deflate,compress" + } }; const initialThumbnail: Thumbnail = await iModelsClient.thumbnails.download(iModelScopedOperationParams); diff --git a/tests/imodels-clients-tests/package.json b/tests/imodels-clients-tests/package.json index 032d3822..0d52c2c6 100644 --- a/tests/imodels-clients-tests/package.json +++ b/tests/imodels-clients-tests/package.json @@ -42,7 +42,7 @@ "@itwin/imodels-client-test-utils": "workspace:*", "@itwin/object-storage-azure": "^1.6.0", "@itwin/object-storage-core": "^1.6.0", - "axios": "^1.0.0", + "axios": "1.1.0", "chai": "~4.3.4", "chai-as-promised": "~7.1.1", "dotenv": "~10.0.0", diff --git a/tests/imodels-clients-tests/src/integration/management/ThumbnailOperations.test.ts b/tests/imodels-clients-tests/src/integration/management/ThumbnailOperations.test.ts index 11505150..7a36cea0 100644 --- a/tests/imodels-clients-tests/src/integration/management/ThumbnailOperations.test.ts +++ b/tests/imodels-clients-tests/src/integration/management/ThumbnailOperations.test.ts @@ -112,7 +112,10 @@ describe("[Management] ThumbnailOperations", () => { // Arrange const iModelScopedOperationParams: IModelScopedOperationParams = { authorization, - iModelId: testIModelForWrite.id + iModelId: testIModelForWrite.id, + headers: { + "Accept-Encoding": "gzip,deflate,compress" + } }; const initialThumbnail: Thumbnail = await iModelsClient.thumbnails.download(iModelScopedOperationParams); diff --git a/tests/imodels-clients-tests/src/unit/management/OperationsBase.test.ts b/tests/imodels-clients-tests/src/unit/management/OperationsBase.test.ts index 8c3903de..fb0f6282 100644 --- a/tests/imodels-clients-tests/src/unit/management/OperationsBase.test.ts +++ b/tests/imodels-clients-tests/src/unit/management/OperationsBase.test.ts @@ -15,82 +15,6 @@ describe("[Management] OperationsBase", () => { let restClient: sinon.SinonStubbedInstance; let requiredArgs: {url: string, authorization: () => Promise}; - const operationsTestCases: { - caseName: string; - headersPassedToConstructor: Record string | undefined)>; - headersPassedToOperation: Record string | undefined)>; - expectedHeaders: Record; - }[] = [ - { - caseName: "Adds constructor headers", - headersPassedToConstructor: { - "header-specified-in-constructor": "constructor" - }, - headersPassedToOperation: {}, - expectedHeaders: { - "header-specified-in-constructor": "constructor" - } - }, - { - caseName: "Adds operation headers", - headersPassedToConstructor: {}, - headersPassedToOperation: { - "header-specified-in-operation": "operation" - }, - expectedHeaders: { - "header-specified-in-operation": "operation" - } - }, - { - caseName: "Adds constructor and operation headers", - headersPassedToConstructor: { - "header-specified-in-constructor": "constructor" - }, - headersPassedToOperation: { - "header-specified-in-operation": "operation" - }, - expectedHeaders: { - "header-specified-in-constructor": "constructor", - "header-specified-in-operation": "operation" - } - }, - { - caseName: "Replaces constructor headers", - headersPassedToConstructor: { - "header-specified-in-constructor": "constructor" - }, - headersPassedToOperation: { - "header-specified-in-constructor": "operation" - }, - expectedHeaders: { - "header-specified-in-constructor": "operation" - } - }, - { - caseName: "Removes constructor headers", - headersPassedToConstructor: { - "header-specified-in-constructor": "constructor" - }, - headersPassedToOperation: { - "header-specified-in-constructor": () => undefined - }, - expectedHeaders: {} - }, - { - caseName: "Works with function headers", - headersPassedToConstructor: { - "header-specified-in-constructor": () => "constructor" - }, - headersPassedToOperation: { - "header-specified-in-operation": () => "operation" - }, - expectedHeaders: { - "header-specified-in-constructor": "constructor", - "header-specified-in-operation": "operation" - } - } - ]; - before( async () => { restClient = createStub(AxiosRestClient); const authorizationCallback = async () => { @@ -103,111 +27,278 @@ describe("[Management] OperationsBase", () => { requiredArgs = {url: "url", authorization: authorizationCallback}; }); - for( const testCase of operationsTestCases) { - const { caseName, headersPassedToConstructor, headersPassedToOperation, expectedHeaders } = testCase; + describe("OperationsBase headers", () => { + const operationsTestCases: { + caseName: string; + headersPassedToConstructor: Record string | undefined)>; + headersPassedToOperation: Record string | undefined)>; + expectedHeaders: Record; + }[] = [ + { + caseName: "Adds constructor headers", + headersPassedToConstructor: { + "header-specified-in-constructor": "constructor" + }, + headersPassedToOperation: {}, + expectedHeaders: { + "header-specified-in-constructor": "constructor" + } + }, + { + caseName: "Adds operation headers", + headersPassedToConstructor: {}, + headersPassedToOperation: { + "header-specified-in-operation": "operation" + }, + expectedHeaders: { + "header-specified-in-operation": "operation" + } + }, + { + caseName: "Adds constructor and operation headers", + headersPassedToConstructor: { + "header-specified-in-constructor": "constructor" + }, + headersPassedToOperation: { + "header-specified-in-operation": "operation" + }, + expectedHeaders: { + "header-specified-in-constructor": "constructor", + "header-specified-in-operation": "operation" + } + }, + { + caseName: "Replaces constructor headers", + headersPassedToConstructor: { + "header-specified-in-constructor": "constructor" + }, + headersPassedToOperation: { + "header-specified-in-constructor": "operation" + }, + expectedHeaders: { + "header-specified-in-constructor": "operation" + } + }, + { + caseName: "Removes constructor headers", + headersPassedToConstructor: { + "header-specified-in-constructor": "constructor" + }, + headersPassedToOperation: { + "header-specified-in-constructor": () => undefined + }, + expectedHeaders: {} + }, + { + caseName: "Works with function headers", + headersPassedToConstructor: { + "header-specified-in-constructor": () => "constructor" + }, + headersPassedToOperation: { + "header-specified-in-operation": () => "operation" + }, + expectedHeaders: { + "header-specified-in-constructor": "constructor", + "header-specified-in-operation": "operation" + } + } + ]; + + for( const testCase of operationsTestCases) { + const { caseName, headersPassedToConstructor, headersPassedToOperation, expectedHeaders } = testCase; - it(`${caseName} works with Get Request`, async () => { + it(`${caseName} works with Get Request`, async () => { // Arrange - const iModelsOperationsWrapper = new TestOperationsWrapper( - { - restClient, - api: {version: "version"}, - headers: headersPassedToConstructor + const iModelsOperationsWrapper = new TestOperationsWrapper( + { + restClient, + api: {version: "version"}, + headers: headersPassedToConstructor + }); + + // Act + await iModelsOperationsWrapper.sendGetRequest({ + ...requiredArgs, + headers: headersPassedToOperation }); - // Act - await iModelsOperationsWrapper.sendGetRequest({ - ...requiredArgs, - headers: headersPassedToOperation + // Assert + const callHeaders = restClient.sendGetRequest.lastCall.args[0].headers; + expect(callHeaders).to.include(expectedHeaders); }); - // Assert - const callHeaders = restClient.sendGetRequest.lastCall.args[0].headers; - expect(callHeaders).to.include(expectedHeaders); - }); + it(`${caseName} works with Post Request`, async () => { + // Arrange + const iModelsOperationsWrapper = new TestOperationsWrapper( + { + restClient, + api: {version: "version"}, + headers: headersPassedToConstructor + }); + + // Act + await iModelsOperationsWrapper.sendPostRequest({ + ...requiredArgs, + headers: headersPassedToOperation, + body: {} + }); + + // Assert + const callHeaders = restClient.sendPostRequest.lastCall.args[0].headers; + expect(callHeaders).to.include(expectedHeaders); + }); + + it(`${caseName} works with Put Request`, async () => { + // Arrange + const iModelsOperationsWrapper = new TestOperationsWrapper( + { + restClient, + api: {version: "version"}, + headers: headersPassedToConstructor + }); + + // Act + await iModelsOperationsWrapper.sendPutRequest({ + ...requiredArgs, + headers: headersPassedToOperation, + body: new Uint8Array(), + contentType: ContentType.Png + }); + + // Assert + const callHeaders = restClient.sendPutRequest.lastCall.args[0].headers; + expect(callHeaders).to.include(expectedHeaders); + }); + + it(`${caseName} works with Delete Request`, async () => { + // Arrange + const iModelsOperationsWrapper = new TestOperationsWrapper( + { + restClient, + api: {version: "version"}, + headers: headersPassedToConstructor + }); + + // Act + await iModelsOperationsWrapper.sendDeleteRequest({ + ...requiredArgs, + headers: headersPassedToOperation + }); - it(`${caseName} works with Post Request`, async () => { + // Assert + const callHeaders = restClient.sendDeleteRequest.lastCall.args[0].headers; + expect(callHeaders).to.include(expectedHeaders); + }); + + it(`${caseName} works with Patch Request`, async () => { + // Arrange + const iModelsOperationsWrapper = new TestOperationsWrapper( + { + restClient, + api: {version: "version"}, + headers: headersPassedToConstructor + }); + + // Act + await iModelsOperationsWrapper.sendPatchRequest({ + ...requiredArgs, + headers: headersPassedToOperation, + body: {} + }); + + // Assert + const callHeaders = restClient.sendPatchRequest.lastCall.args[0].headers; + expect(callHeaders).to.include(expectedHeaders); + }); + } + }); + + describe("OperationsBase Content-Type", () => { + + it("Adds Content-Type header for Post Request", async () => { // Arrange const iModelsOperationsWrapper = new TestOperationsWrapper( { restClient, api: {version: "version"}, - headers: headersPassedToConstructor + headers: {} }); // Act await iModelsOperationsWrapper.sendPostRequest({ ...requiredArgs, - headers: headersPassedToOperation, - body: {} + body: { + contentType: ContentType.Json, + content: "serialized content" + } }); // Assert const callHeaders = restClient.sendPostRequest.lastCall.args[0].headers; - expect(callHeaders).to.include(expectedHeaders); + expect(callHeaders).to.include({"Content-Type": ContentType.Json}); }); - it(`${caseName} works with Put Request`, async () => { + it("Does not add Content-Type header for Post Request", async () => { // Arrange const iModelsOperationsWrapper = new TestOperationsWrapper( { restClient, api: {version: "version"}, - headers: headersPassedToConstructor + headers: {} }); // Act - await iModelsOperationsWrapper.sendPutRequest({ + await iModelsOperationsWrapper.sendPostRequest({ ...requiredArgs, - headers: headersPassedToOperation, - body: new Uint8Array(), - contentType: ContentType.Png + body: undefined }); // Assert - const callHeaders = restClient.sendPutRequest.lastCall.args[0].headers; - expect(callHeaders).to.include(expectedHeaders); + const callHeaders = restClient.sendPostRequest.lastCall.args[0].headers; + expect(callHeaders).to.not.have.property("Content-Type"); }); - it(`${caseName} works with Delete Request`, async () => { + it("Adds Content-Type header for Patch Request", async () => { // Arrange const iModelsOperationsWrapper = new TestOperationsWrapper( { restClient, api: {version: "version"}, - headers: headersPassedToConstructor + headers: {} }); // Act - await iModelsOperationsWrapper.sendDeleteRequest({ + await iModelsOperationsWrapper.sendPatchRequest({ ...requiredArgs, - headers: headersPassedToOperation + body: { + contentType: ContentType.Json, + content: "serialized content" + } }); // Assert - const callHeaders = restClient.sendDeleteRequest.lastCall.args[0].headers; - expect(callHeaders).to.include(expectedHeaders); + const callHeaders = restClient.sendPatchRequest.lastCall.args[0].headers; + expect(callHeaders).to.include({"Content-Type": ContentType.Json}); }); - it(`${caseName} works with Patch Request`, async () => { + it("Does not add Content-Type header for Patch Request", async () => { // Arrange const iModelsOperationsWrapper = new TestOperationsWrapper( { restClient, api: {version: "version"}, - headers: headersPassedToConstructor + headers: {} }); // Act await iModelsOperationsWrapper.sendPatchRequest({ ...requiredArgs, - headers: headersPassedToOperation, - body: {} + body: undefined }); // Assert const callHeaders = restClient.sendPatchRequest.lastCall.args[0].headers; - expect(callHeaders).to.include(expectedHeaders); + expect(callHeaders).to.not.have.property("Content-Type"); }); - } + }); }); diff --git a/utils/imodels-client-test-utils/package.json b/utils/imodels-client-test-utils/package.json index 05c4b546..5ea34b7f 100644 --- a/utils/imodels-client-test-utils/package.json +++ b/utils/imodels-client-test-utils/package.json @@ -33,7 +33,7 @@ "@itwin/imodels-client-authoring": "workspace:*", "@itwin/imodels-client-management": "workspace:*", "@itwin/object-storage-core": "^1.6.0", - "axios": "^1.0.0", + "axios": "1.1.0", "chai": "~4.3.4", "dotenv": "~10.0.0", "inversify": "~5.0.1",