From 551ff5e529039957115dc7428dcbd744976f0aab Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 7 Feb 2024 13:51:53 +0100 Subject: [PATCH 01/11] feat(formatting): modifiy configuration to match SPA formatting --- .eslintrc | 57 +- .github/workflows/deploy_pr.yml | 4 +- .prettierrc | 11 +- docs/installation.md | 12 +- docs/localDevelopment.md | 2 +- docs/useCases.md | 184 +- jest.config.integration.js | 4 - jest.config.integration.ts | 6 + jest.config.js => jest.config.ts | 14 +- jest.config.unit.js | 6 - jest.config.unit.ts | 8 + package-lock.json | 1840 ++++++++++++++++- package.json | 44 +- .../domain/repositories/IAuthRepository.ts | 2 +- src/auth/domain/useCases/Logout.ts | 10 +- src/auth/index.ts | 8 +- src/auth/infra/repositories/AuthRepository.ts | 8 +- src/core/domain/repositories/ReadError.ts | 4 +- .../domain/repositories/RepositoryError.ts | 4 +- src/core/domain/repositories/WriteError.ts | 4 +- src/core/domain/useCases/UseCase.ts | 2 +- src/core/index.ts | 6 +- src/core/infra/repositories/ApiConfig.ts | 20 +- src/core/infra/repositories/ApiRepository.ts | 76 +- src/datasets/domain/models/Dataset.ts | 214 +- src/datasets/domain/models/DatasetLock.ts | 12 +- .../models/DatasetNotNumberedVersion.ts | 2 +- src/datasets/domain/models/DatasetPreview.ts | 14 +- .../domain/models/DatasetPreviewSubset.ts | 6 +- .../domain/models/DatasetUserPermissions.ts | 10 +- .../repositories/IDatasetsRepository.ts | 32 +- .../domain/useCases/GetAllDatasetPreviews.ts | 12 +- src/datasets/domain/useCases/GetDataset.ts | 20 +- .../domain/useCases/GetDatasetCitation.ts | 18 +- .../domain/useCases/GetDatasetLocks.ts | 12 +- .../useCases/GetDatasetSummaryFieldNames.ts | 10 +- .../useCases/GetDatasetUserPermissions.ts | 12 +- .../domain/useCases/GetPrivateUrlDataset.ts | 12 +- .../useCases/GetPrivateUrlDatasetCitation.ts | 10 +- src/datasets/index.ts | 54 +- .../infra/repositories/DatasetsRepository.ts | 102 +- .../transformers/datasetLocksTransformers.ts | 40 +- .../datasetPreviewsTransformers.ts | 60 +- .../transformers/datasetTransformers.ts | 114 +- .../datasetUserPermissionsTransformers.ts | 14 +- src/files/domain/models/File.ts | 72 +- src/files/domain/models/FileCounts.ts | 22 +- src/files/domain/models/FileCriteria.ts | 26 +- src/files/domain/models/FileDataTable.ts | 110 +- .../domain/models/FileDownloadSizeMode.ts | 2 +- .../domain/models/FileUserPermissions.ts | 6 +- src/files/domain/models/FilesSubset.ts | 6 +- .../domain/repositories/IFilesRepository.ts | 34 +- .../domain/useCases/GetDatasetFileCounts.ts | 20 +- src/files/domain/useCases/GetDatasetFiles.ts | 20 +- .../GetDatasetFilesTotalDownloadSize.ts | 20 +- src/files/domain/useCases/GetFile.ts | 10 +- .../domain/useCases/GetFileDataTables.ts | 12 +- .../domain/useCases/GetFileDownloadCount.ts | 10 +- .../domain/useCases/GetFileUserPermissions.ts | 12 +- src/files/index.ts | 58 +- .../infra/repositories/FilesRepository.ts | 174 +- .../transformers/fileCountsTransformers.ts | 64 +- .../transformers/fileDataTableTransformers.ts | 177 +- .../transformers/fileTransformers.ts | 88 +- .../fileUserPermissionsTransformers.ts | 14 +- src/index.ts | 14 +- src/info/domain/models/DataverseVersion.ts | 4 +- .../repositories/IDataverseInfoRepository.ts | 8 +- .../domain/useCases/GetDataverseVersion.ts | 12 +- .../useCases/GetMaxEmbargoDurationInMonths.ts | 10 +- .../domain/useCases/GetZipDownloadLimit.ts | 10 +- src/info/index.ts | 18 +- .../repositories/DataverseInfoRepository.ts | 32 +- .../domain/models/MetadataBlock.ts | 28 +- .../repositories/IMetadataBlocksRepository.ts | 4 +- .../domain/useCases/GetMetadataBlockByName.ts | 12 +- src/metadataBlocks/index.ts | 12 +- .../repositories/MetadataBlocksRepository.ts | 12 +- .../transformers/metadataBlockTransformers.ts | 53 +- src/users/domain/models/AuthenticatedUser.ts | 34 +- .../domain/repositories/IUsersRepository.ts | 4 +- .../useCases/GetCurrentAuthenticatedUser.ts | 12 +- src/users/index.ts | 10 +- .../infra/repositories/UsersRepository.ts | 18 +- test/integration/auth/AuthRepository.test.ts | 33 +- .../datasets/DatasetsRepository.test.ts | 292 +-- test/integration/environment/setup.js | 103 - test/integration/environment/setup.ts | 99 + .../integration/files/FilesRepository.test.ts | 575 +++--- .../info/DataverseInfoRepository.test.ts | 71 +- .../MetadataBlocksRepository.test.ts | 43 +- .../integration/users/UsersRepository.test.ts | 42 +- test/testHelpers/TestConstants.ts | 55 +- test/testHelpers/datasets/datasetHelper.ts | 181 +- .../testHelpers/datasets/datasetLockHelper.ts | 16 +- .../datasets/datasetPreviewHelper.ts | 30 +- .../datasets/datasetUserPermissionsHelper.ts | 8 +- test/testHelpers/files/fileCountsHelper.ts | 36 +- .../testHelpers/files/fileDataTablesHelper.ts | 32 +- .../files/fileUserPermissionsHelper.ts | 8 +- test/testHelpers/files/filesHelper.ts | 108 +- .../files/filesTotalDownloadSizeHelper.ts | 7 +- test/testHelpers/info/infoHelper.ts | 14 +- .../metadataBlocks/metadataBlockHelper.ts | 38 +- .../users/authenticatedUserHelper.ts | 8 +- test/unit/auth/AuthRepository.test.ts | 75 +- test/unit/auth/Logout.test.ts | 42 +- test/unit/datasets/DatasetsRepository.test.ts | 668 +++--- .../datasets/GetAllDatasetPreviews.test.ts | 54 +- test/unit/datasets/GetDataset.test.ts | 54 +- test/unit/datasets/GetDatasetCitation.test.ts | 59 +- test/unit/datasets/GetDatasetLocks.test.ts | 54 +- .../GetDatasetSummaryFieldNames.test.ts | 52 +- .../GetDatasetUserPermissions.test.ts | 54 +- .../datasets/GetPrivateUrlDataset.test.ts | 54 +- .../GetPrivateUrlDatasetCitation.test.ts | 58 +- test/unit/files/FilesRepository.test.ts | 1019 +++++---- test/unit/files/GetDatasetFileCounts.test.ts | 66 +- test/unit/files/GetDatasetFiles.test.ts | 71 +- .../GetDatasetFilesTotalDownloadSize.test.ts | 83 +- test/unit/files/GetFile.test.ts | 102 +- test/unit/files/GetFileDataTables.test.ts | 56 +- test/unit/files/GetFileDownloadCount.test.ts | 73 +- .../unit/files/GetFileUserPermissions.test.ts | 54 +- .../unit/info/DataverseInfoRepository.test.ts | 151 +- test/unit/info/GetDataverseVersion.test.ts | 46 +- .../GetMaxEmbargoDurationInMonths.test.ts | 52 +- test/unit/info/GetZipDownloadLimit.test.ts | 46 +- .../GetMetadataBlockByName.test.ts | 60 +- .../MetadataBlocksRepository.test.ts | 79 +- .../users/GetCurrentAuthenticatedUser.test.ts | 48 +- test/unit/users/UsersRepository.test.ts | 85 +- tsconfig.json | 40 +- 134 files changed, 5890 insertions(+), 3644 deletions(-) delete mode 100644 jest.config.integration.js create mode 100644 jest.config.integration.ts rename jest.config.js => jest.config.ts (53%) delete mode 100644 jest.config.unit.js create mode 100644 jest.config.unit.ts delete mode 100644 test/integration/environment/setup.js create mode 100644 test/integration/environment/setup.ts diff --git a/.eslintrc b/.eslintrc index d328bdd1..9fce12e4 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,10 +1,61 @@ { - "root": true, "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "jest"], + "plugins": ["@typescript-eslint", "simple-import-sort", "import", "unused-imports", "jest"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", "plugin:jest/recommended" - ] + ], + "settings": { + "import/resolver": { + "node": { + "extensions": [".js", ".ts"] + } + } + }, + "env": { + "browser": true, + "es2021": true, + "jest": true, + "node": true + }, + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "module", + "project": [ + "./tsconfig.json" + ] + }, + "rules": { + "@typescript-eslint/no-unused-vars": "off", + "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-vars": [ + "warn", + { + "vars": "all", + "varsIgnorePattern": "^_", + "args": "after-used", + "argsIgnorePattern": "^_" + } + ], + "@typescript-eslint/no-empty-function": [ + "error", + { + "allow": ["arrowFunctions"] + } + ], + "prettier/prettier": [ + "error", + { + "semi": false, + "tabWidth": 2, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "none", + "bracketSameLine": true + } + ] + } } diff --git a/.github/workflows/deploy_pr.yml b/.github/workflows/deploy_pr.yml index f073e30a..572b4579 100644 --- a/.github/workflows/deploy_pr.yml +++ b/.github/workflows/deploy_pr.yml @@ -38,9 +38,9 @@ jobs: - name: Build package run: npm run build - + - name: Update package version - run: | + run: | SHORT_SHA=$(git rev-parse --short "${{ github.event.pull_request.head.sha }}") CURRENT_PACKAGE_VERSION=$(cat package.json | jq -r '.version') npm version "${CURRENT_PACKAGE_VERSION}-pr${{ github.event.number }}.${SHORT_SHA}" --no-git-tag-version diff --git a/.prettierrc b/.prettierrc index a0d1c9a9..cce0a4c7 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,8 @@ { - "printWidth": 120, - "trailingComma": "all", - "singleQuote": true -} + "semi": false, + "tabWidth": 2, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "none", + "bracketSameLine": true +} \ No newline at end of file diff --git a/docs/installation.md b/docs/installation.md index d3177635..ef17168e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -40,20 +40,24 @@ function App() { } export default App -```` +``` The same example but with example values set: ```typescript -ApiConfig.init('http://localhost:8000/api/v1', DataverseApiAuthMechanism.API_KEY, 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx') +ApiConfig.init( + 'http://localhost:8000/api/v1', + DataverseApiAuthMechanism.API_KEY, + 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' +) function App() { /* Yor App code */ } export default App -```` +``` -We can initialize the `ApiConfig` object as an unauthenticated user, by setting `undefined` as the API Key value. +We can initialize the `ApiConfig` object as an unauthenticated user, by setting `undefined` as the API Key value. This will allow use cases that do not require authentication to be successfully executed, but those that do require authentication will fail. diff --git a/docs/localDevelopment.md b/docs/localDevelopment.md index 9527a778..368a4389 100644 --- a/docs/localDevelopment.md +++ b/docs/localDevelopment.md @@ -92,4 +92,4 @@ Fix linting checks on the code: ```bash npm run lint:fix -``` \ No newline at end of file +``` diff --git a/docs/useCases.md b/docs/useCases.md index ff12bae6..b64a047b 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -49,16 +49,16 @@ Returns a [Dataset](../src/datasets/domain/models/Dataset.ts) instance, given th ##### Example call: ```typescript -import { getAllDatasetPreviews } from '@iqss/dataverse-client-javascript'; +import { getAllDatasetPreviews } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId = 'doi:10.77777/FK2/AAAAAA'; -const datasetVersionId = '1.0'; +const datasetId = 'doi:10.77777/FK2/AAAAAA' +const datasetVersionId = '1.0' getDataset.execute(datasetId, datasetVersionId).then((dataset: Dataset) => { /* ... */ -}); +}) /* ... */ ``` @@ -76,15 +76,15 @@ There is an optional third parameter called `includeDeaccessioned`, which indica Returns a [Dataset](../src/datasets/domain/models/Dataset.ts) instance, given an associated Private URL Token. ```typescript -import { getPrivateUrlDataset } from '@iqss/dataverse-client-javascript'; +import { getPrivateUrlDataset } from '@iqss/dataverse-client-javascript' /* ... */ -const token = 'a56444bc-7697-4711-8964-e0577f055fd2'; +const token = 'a56444bc-7697-4711-8964-e0577f055fd2' getPrivateUrlDataset.execute(token).then((dataset: Dataset) => { /* ... */ -}); +}) /* ... */ ``` @@ -98,16 +98,16 @@ Returns the Dataset citation text. ##### Example call: ```typescript -import { getDatasetCitation } from '@iqss/dataverse-client-javascript'; +import { getDatasetCitation } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId = 2; -const datasetVersionId = '1.0'; +const datasetId = 2 +const datasetVersionId = '1.0' getDatasetCitation.execute(datasetId, datasetVersionId).then((citationText: string) => { /* ... */ -}); +}) /* ... */ ``` @@ -125,15 +125,15 @@ Returns the Dataset citation text, given an associated Private URL Token. ##### Example call: ```typescript -import { getPrivateUrlDatasetCitation } from '@iqss/dataverse-client-javascript'; +import { getPrivateUrlDatasetCitation } from '@iqss/dataverse-client-javascript' /* ... */ -const token = 'a56444bc-7697-4711-8964-e0577f055fd2'; +const token = 'a56444bc-7697-4711-8964-e0577f055fd2' getPrivateUrlDatasetCitation.execute(token).then((citationText: string) => { /* ... */ -}); +}) /* ... */ ``` @@ -147,15 +147,15 @@ Returns a [DatasetLock](../src/datasets/domain/models/DatasetLock.ts) array of a ##### Example call: ```typescript -import { getDatasetLocks } from '@iqss/dataverse-client-javascript'; +import { getDatasetLocks } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId = 'doi:10.77777/FK2/AAAAAA'; +const datasetId = 'doi:10.77777/FK2/AAAAAA' getDatasetLocks.execute(datasetId).then((datasetLocks: DatasetLock[]) => { /* ... */ -}); +}) /* ... */ ``` @@ -171,13 +171,13 @@ Returns the names of the dataset summary fields configured in the installation. ##### Example call: ```typescript -import { getDatasetSummaryFieldNames } from '@iqss/dataverse-client-javascript'; +import { getDatasetSummaryFieldNames } from '@iqss/dataverse-client-javascript' /* ... */ getDatasetSummaryFieldNames.execute().then((names: string[]) => { /* ... */ -}); +}) /* ... */ ``` @@ -191,15 +191,15 @@ Returns an instance of [DatasetUserPermissions](../src/datasets/domain/models/Da ##### Example call: ```typescript -import { getDatasetUserPermissions } from '@iqss/dataverse-client-javascript'; +import { getDatasetUserPermissions } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId = 'doi:10.77777/FK2/AAAAAA'; +const datasetId = 'doi:10.77777/FK2/AAAAAA' getDatasetUserPermissions.execute(datasetId).then((permissions: DatasetUserPermissions) => { /* ... */ -}); +}) /* ... */ ``` @@ -215,16 +215,16 @@ Returns an instance of [DatasetPreviewSubset](../src/datasets/domain/models/Data ##### Example call: ```typescript -import { getAllDatasetPreviews } from '@iqss/dataverse-client-javascript'; +import { getAllDatasetPreviews } from '@iqss/dataverse-client-javascript' /* ... */ -const limit = 10; -const offset = 20; +const limit = 10 +const offset = 20 getAllDatasetPreviews.execute(limit, offset).then((subset: DatasetPreviewSubset) => { /* ... */ -}); +}) /* ... */ ``` @@ -246,16 +246,16 @@ Returns a [File](../src/files/domain/models/File.ts) instance, given the search ##### Example call: ```typescript -import { getFile } from '@iqss/dataverse-client-javascript'; +import { getFile } from '@iqss/dataverse-client-javascript' /* ... */ -const fileId = 2; -const datasetVersionId = '1.0'; +const fileId = 2 +const datasetVersionId = '1.0' getFile.execute(fileId, datasetVersionId).then((file: File) => { /* ... */ -}); +}) /* ... */ ``` @@ -278,16 +278,16 @@ Returns an instance of [FileCounts](../src/files/domain/models/FileCounts.ts), c ##### Example call: ```typescript -import { getDatasetFileCounts } from '@iqss/dataverse-client-javascript'; +import { getDatasetFileCounts } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId = 2; -const datasetVersionId = '1.0'; +const datasetId = 2 +const datasetVersionId = '1.0' getDatasetFileCounts.execute(datasetId, datasetVersionId).then((fileCounts: FileCounts) => { /* ... */ -}); +}) /* ... */ ``` @@ -303,22 +303,22 @@ An optional fourth parameter `fileSearchCriteria` receives a [FileSearchCriteria ##### Example call using optional parameters: ```typescript -import { getDatasetFileCounts } from '@iqss/dataverse-client-javascript'; +import { getDatasetFileCounts } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId: number = 2; -const datasetVersionId: string = '1.0'; -const includeDeaccessioned: boolean = true; +const datasetId: number = 2 +const datasetVersionId: string = '1.0' +const includeDeaccessioned: boolean = true const searchCriteria: FileSearchCriteria = { - categoryName: 'physics', -}; + categoryName: 'physics' +} getDatasetFileCounts .execute(datasetId, datasetVersionId, includeDeaccessioned, searchCriteria) .then((fileCounts: FileCounts) => { /* ... */ - }); + }) /* ... */ ``` @@ -330,15 +330,15 @@ This use case is oriented toward tabular files and provides an array of [FileDat ##### Example call: ```typescript -import { getFileDataTables } from '@iqss/dataverse-client-javascript'; +import { getFileDataTables } from '@iqss/dataverse-client-javascript' /* ... */ -const fileId = 2; +const fileId = 2 getFileDataTables.execute(fileId).then((dataTables: FileDataTable[]) => { /* ... */ -}); +}) /* ... */ ``` @@ -354,15 +354,15 @@ Provides the download count for a particular File. ##### Example call: ```typescript -import { getFileDownloadCount } from '@iqss/dataverse-client-javascript'; +import { getFileDownloadCount } from '@iqss/dataverse-client-javascript' /* ... */ -const fileId: number = 2; +const fileId: number = 2 getFileDownloadCount.execute(fileId).then((count: number) => { /* ... */ -}); +}) /* ... */ ``` @@ -378,16 +378,16 @@ Returns the combined size in bytes of all the files available for download from ##### Example call: ```typescript -import { getDatasetFilesTotalDownloadSize } from '@iqss/dataverse-client-javascript'; +import { getDatasetFilesTotalDownloadSize } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId: number = 2; -const datasetVersionId: string = '1.0'; +const datasetId: number = 2 +const datasetVersionId: string = '1.0' getDatasetFilesTotalDownloadSize.execute(datasetId, datasetVersionId).then((size: number) => { /* ... */ -}); +}) /* ... */ ``` @@ -409,23 +409,23 @@ An optional fifth parameter called `includeDeaccessioned` indicates whether to c ##### Example call using optional parameters: ```typescript -import { getDatasetFilesTotalDownloadSize } from '@iqss/dataverse-client-javascript'; +import { getDatasetFilesTotalDownloadSize } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId: number = 2; -const datasetVersionId: string = '1.0'; -const mode: FileDownloadSizeMode = FileDownloadSizeMode.ARCHIVAL; +const datasetId: number = 2 +const datasetVersionId: string = '1.0' +const mode: FileDownloadSizeMode = FileDownloadSizeMode.ARCHIVAL const searchCriteria: FileDownloadSizeMode = { - categoryName: 'physics', -}; -const includeDeaccessioned: boolean = true; + categoryName: 'physics' +} +const includeDeaccessioned: boolean = true getDatasetFilesTotalDownloadSize .execute(datasetId, datasetVersionId, mode, searchCriteria, includeDeaccessioned) .then((size: number) => { /* ... */ - }); + }) /* ... */ ``` @@ -443,15 +443,15 @@ The returned _FileUserPermissions_ object contains the following permissions, as ##### Example call: ```typescript -import { getFileUserPermissions } from '@iqss/dataverse-client-javascript'; +import { getFileUserPermissions } from '@iqss/dataverse-client-javascript' /* ... */ -const fileId: number = 2; +const fileId: number = 2 getFileUserPermissions.execute(fileId).then((permissions: FileUserPermissions) => { /* ... */ -}); +}) /* ... */ ``` @@ -467,16 +467,16 @@ Returns an instance of [FilesSubset](../src/files/domain/models/FilesSubset.ts), ##### Example call: ```typescript -import { getDatasetFiles } from '@iqss/dataverse-client-javascript'; +import { getDatasetFiles } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId = 2; -const datasetVersionId = '1.0'; +const datasetId = 2 +const datasetVersionId = '1.0' getDatasetFiles.execute(datasetId, datasetVersionId).then((subset: FilesSubset) => { /* ... */ -}); +}) /* ... */ ``` @@ -496,25 +496,33 @@ This use case supports the following optional parameters depending on the search ##### Example call using optional parameters: ```typescript -import { getDatasetFiles } from '@iqss/dataverse-client-javascript'; +import { getDatasetFiles } from '@iqss/dataverse-client-javascript' /* ... */ -const datasetId: number = 2; -const datasetVersionId: string = '1.0'; -const includeDeaccessioned: boolean = true; -const limit: number = 10; -const offset: number = 20; +const datasetId: number = 2 +const datasetVersionId: string = '1.0' +const includeDeaccessioned: boolean = true +const limit: number = 10 +const offset: number = 20 const searchCriteria: FileSearchCriteria = { - searchText: 'file title', -}; -const orderCriteria: FileOrderCriteria = FileOrderCriteria.NEWEST; + searchText: 'file title' +} +const orderCriteria: FileOrderCriteria = FileOrderCriteria.NEWEST getDatasetFiles - .execute(datasetId, datasetVersionId, includeDeaccessioned, limit, offset, searchCriteria, orderCriteria) + .execute( + datasetId, + datasetVersionId, + includeDeaccessioned, + limit, + offset, + searchCriteria, + orderCriteria + ) .then((subset: FilesSubset) => { /* ... */ - }); + }) /* ... */ ``` @@ -530,15 +538,15 @@ Returns a [MetadataBlock](../src/metadataBlocks/domain/models/MetadataBlock.ts) ##### Example call: ```typescript -import { getMetadataBlockByName } from '@iqss/dataverse-client-javascript'; +import { getMetadataBlockByName } from '@iqss/dataverse-client-javascript' /* ... */ -const name = 'citation'; +const name = 'citation' getMetadataBlockByName.execute(name).then((metadataBlock: MetadataBlock) => { /* ... */ -}); +}) /* ... */ ``` @@ -556,13 +564,13 @@ Returns the current [AuthenticatedUser](../src/users/domain/models/Authenticated ##### Example call: ```typescript -import { getCurrentAuthenticatedUser } from '@iqss/dataverse-client-javascript'; +import { getCurrentAuthenticatedUser } from '@iqss/dataverse-client-javascript' /* ... */ getCurrentAuthenticatedUser.execute().then((user: AuthenticatedUser) => { /* ... */ -}); +}) /* ... */ ``` @@ -578,13 +586,13 @@ Returns a [DataverseVersion](../src/info/domain/models/DataverseVersion.ts) obje ##### Example call: ```typescript -import { getDataverseVersion } from '@iqss/dataverse-client-javascript'; +import { getDataverseVersion } from '@iqss/dataverse-client-javascript' /* ... */ getDataverseVersion.execute().then((version: DataverseVersion) => { /* ... */ -}); +}) /* ... */ ``` @@ -598,13 +606,13 @@ Returns a number indicating the configured maximum embargo duration in months. ##### Example call: ```typescript -import { getMaxEmbargoDurationInMonths } from '@iqss/dataverse-client-javascript'; +import { getMaxEmbargoDurationInMonths } from '@iqss/dataverse-client-javascript' /* ... */ getMaxEmbargoDurationInMonths.execute().then((months: number) => { /* ... */ -}); +}) /* ... */ ``` @@ -618,13 +626,13 @@ Returns a number indicating the configured ZIP download limit in bytes. ##### Example call: ```typescript -import { getZipDownloadLimit } from '@iqss/dataverse-client-javascript'; +import { getZipDownloadLimit } from '@iqss/dataverse-client-javascript' /* ... */ getZipDownloadLimit.execute().then((downloadLimit: number) => { /* ... */ -}); +}) /* ... */ ``` diff --git a/jest.config.integration.js b/jest.config.integration.js deleted file mode 100644 index 002052be..00000000 --- a/jest.config.integration.js +++ /dev/null @@ -1,4 +0,0 @@ -var config = require('./jest.config'); -config.modulePathIgnorePatterns = ['/test/unit']; -console.log('RUNNING INTEGRATION TESTS'); -module.exports = config; diff --git a/jest.config.integration.ts b/jest.config.integration.ts new file mode 100644 index 00000000..ffa03b3d --- /dev/null +++ b/jest.config.integration.ts @@ -0,0 +1,6 @@ +import config from './jest.config' + +config.modulePathIgnorePatterns = ['/test/unit'] +console.log('RUNNING INTEGRATION TESTS') + +export default config diff --git a/jest.config.js b/jest.config.ts similarity index 53% rename from jest.config.js rename to jest.config.ts index 8c380e1c..55f4668b 100644 --- a/jest.config.js +++ b/jest.config.ts @@ -1,11 +1,15 @@ -module.exports = { +import type { Config } from 'jest' + +const config: Config = { roots: ['/test'], transform: { - '^.+\\.ts$': 'ts-jest', + '^.+\\.ts$': 'ts-jest' }, testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.ts$', moduleFileExtensions: ['ts', 'js', 'json', 'node'], coveragePathIgnorePatterns: ['node_modules', 'testHelpers'], - globalSetup: '/test/integration/environment/setup.js', - testTimeout: 25000, -}; + globalSetup: '/test/integration/environment/setup.ts', + testTimeout: 25000 +} + +export default config; diff --git a/jest.config.unit.js b/jest.config.unit.js deleted file mode 100644 index 845173e7..00000000 --- a/jest.config.unit.js +++ /dev/null @@ -1,6 +0,0 @@ -var config = require('./jest.config'); -config.modulePathIgnorePatterns = ['/test/integration']; -delete config.globalSetup; -delete config.testTimeout; -console.log('RUNNING UNIT TESTS'); -module.exports = config; diff --git a/jest.config.unit.ts b/jest.config.unit.ts new file mode 100644 index 00000000..a4b2af75 --- /dev/null +++ b/jest.config.unit.ts @@ -0,0 +1,8 @@ +import config from './jest.config' + +config.modulePathIgnorePatterns = ['/test/integration'] +delete config.globalSetup +delete config.testTimeout +console.log('RUNNING UNIT TESTS') + +export default config diff --git a/package-lock.json b/package-lock.json index d54b28f2..7cdd9637 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,16 +19,22 @@ "@types/chai": "^4.3.4", "@types/jest": "^29.4.0", "@types/sinon": "^10.0.13", - "@typescript-eslint/eslint-plugin": "^5.54.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", "chai": "^4.3.7", - "eslint": "^8.35.0", - "eslint-plugin-jest": "^27.2.1", + "eslint": "8.33.0", + "eslint-config-prettier": "8.6.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-jest": "27.2.1", + "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-unused-imports": "2.0.0", "jest": "^29.4.3", - "prettier": "^2.8.4", + "prettier": "2.8.4", "sinon": "^15.0.3", "testcontainers": "^9.9.1", - "ts-jest": "^29.0.5" + "ts-jest": "^29.0.5", + "ts-node": "^10.9.2" } }, "node_modules/@ampproject/remapping": { @@ -642,6 +648,28 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -657,24 +685,15 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.4.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -689,15 +708,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -1256,6 +1266,30 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.2.tgz", @@ -1381,6 +1415,12 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", @@ -1467,19 +1507,19 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", + "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/type-utils": "5.51.0", + "@typescript-eslint/utils": "5.51.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1500,15 +1540,115 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", + "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz", - "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", + "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", "debug": "^4.3.4" }, "engines": { @@ -1527,14 +1667,88 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1545,13 +1759,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", + "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/utils": "5.51.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1571,10 +1785,110 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", + "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1585,13 +1899,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1612,17 +1926,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1638,12 +1952,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1655,9 +1969,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1675,6 +1989,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1830,12 +2153,53 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1845,6 +2209,64 @@ "node": ">=8" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -1880,6 +2302,18 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", @@ -2156,6 +2590,24 @@ "node": ">=0.10.0" } }, + "node_modules/call-bind": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2405,6 +2857,12 @@ "node": ">= 10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2469,6 +2927,38 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2628,6 +3118,108 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2647,15 +3239,12 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", + "@eslint/eslintrc": "^1.4.1", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2665,10 +3254,11 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -2689,6 +3279,7 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", + "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -2703,6 +3294,123 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-jest": { "version": "27.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", @@ -2727,6 +3435,66 @@ } } }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -2740,6 +3508,33 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -2802,12 +3597,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -2945,6 +3740,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -3069,6 +3870,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3109,10 +3919,40 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -3141,6 +3981,25 @@ "node": "*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3174,6 +4033,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.1.tgz", + "integrity": "sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3207,9 +4082,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3221,6 +4096,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3241,6 +4131,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3265,6 +4167,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3274,6 +4185,69 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3378,19 +4352,104 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "has": "^1.0.3" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3435,6 +4494,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3444,6 +4515,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3453,6 +4539,34 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3465,6 +4579,63 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -4462,6 +5633,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -4580,6 +5760,59 @@ "node": ">=8" } }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4851,9 +6084,9 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -4865,6 +6098,18 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-format": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", @@ -4938,9 +6183,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -5032,6 +6277,35 @@ "node": ">=10" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5042,12 +6316,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5145,6 +6419,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5165,6 +6463,23 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5186,6 +6501,37 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5207,6 +6553,24 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -5372,6 +6736,51 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5600,6 +7009,91 @@ } } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -5668,6 +7162,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", + "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -5680,6 +7239,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -5725,6 +7299,12 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -5785,6 +7365,41 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -5881,6 +7496,15 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 3a9330ba..5d06f009 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,15 @@ ], "scripts": { "build": "tsc", - "test": "jest -c jest.config.js", - "test:unit": "jest -c jest.config.unit.js", - "test:integration": "jest -c jest.config.integration.js", - "test:coverage": "jest --coverage -c jest.config.js", - "format": "prettier --write \"src/**/*.(js|ts)\"", - "lint": "eslint src --ext .js,.ts", - "lint:fix": "eslint src --fix --ext .js,.ts" + "test": "jest -c jest.config.ts", + "test:unit": "jest -c jest.config.unit.ts", + "test:integration": "jest -c jest.config.integration.ts", + "test:coverage": "jest --coverage -c jest.config.ts", + "lint": "npm run lint:eslint && npm run lint:prettier", + "lint:fix": "eslint --fix --ext .ts ./src --ignore-path .gitignore .", + "lint:eslint": "eslint --ignore-path .gitignore .", + "lint:prettier": "prettier --check '**/*.(yml|json|md)'", + "format": "prettier --write './**/*.{js,ts,md,json,yml,md}' --config ./.prettierrc" }, "repository": { "type": "git", @@ -31,25 +33,31 @@ }, "homepage": "https://github.com/IQSS/dataverse-client-javascript#readme", "devDependencies": { + "@types/chai": "^4.3.4", "@types/jest": "^29.4.0", "@types/sinon": "^10.0.13", - "@types/chai": "^4.3.4", - "@typescript-eslint/eslint-plugin": "^5.54.0", - "@typescript-eslint/parser": "^5.52.0", - "eslint": "^8.35.0", - "eslint-plugin-jest": "^27.2.1", - "jest": "^29.4.3", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", "chai": "^4.3.7", - "prettier": "^2.8.4", - "ts-jest": "^29.0.5", + "eslint": "8.33.0", + "eslint-config-prettier": "8.6.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-jest": "27.2.1", + "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-unused-imports": "2.0.0", + "jest": "^29.4.3", + "prettier": "2.8.4", "sinon": "^15.0.3", - "testcontainers": "^9.9.1" + "testcontainers": "^9.9.1", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.2" }, "dependencies": { "@types/node": "^18.15.11", "@types/turndown": "^5.0.1", "axios": "^1.3.4", - "typescript": "^4.9.5", - "turndown": "^7.1.2" + "turndown": "^7.1.2", + "typescript": "^4.9.5" } } diff --git a/src/auth/domain/repositories/IAuthRepository.ts b/src/auth/domain/repositories/IAuthRepository.ts index b9d2e14f..2236b6d1 100644 --- a/src/auth/domain/repositories/IAuthRepository.ts +++ b/src/auth/domain/repositories/IAuthRepository.ts @@ -1,3 +1,3 @@ export interface IAuthRepository { - logout(): Promise; + logout(): Promise } diff --git a/src/auth/domain/useCases/Logout.ts b/src/auth/domain/useCases/Logout.ts index 49eb226f..b7b800e1 100644 --- a/src/auth/domain/useCases/Logout.ts +++ b/src/auth/domain/useCases/Logout.ts @@ -1,14 +1,14 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IAuthRepository } from '../repositories/IAuthRepository'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IAuthRepository } from '../repositories/IAuthRepository' export class Logout implements UseCase { - private authRepository: IAuthRepository; + private authRepository: IAuthRepository constructor(logoutRepository: IAuthRepository) { - this.authRepository = logoutRepository; + this.authRepository = logoutRepository } async execute(): Promise { - await this.authRepository.logout(); + await this.authRepository.logout() } } diff --git a/src/auth/index.ts b/src/auth/index.ts index 0e453517..198d0b20 100644 --- a/src/auth/index.ts +++ b/src/auth/index.ts @@ -1,6 +1,6 @@ -import { AuthRepository } from './infra/repositories/AuthRepository'; -import { Logout } from './domain/useCases/Logout'; +import { AuthRepository } from './infra/repositories/AuthRepository' +import { Logout } from './domain/useCases/Logout' -const logout = new Logout(new AuthRepository()); +const logout = new Logout(new AuthRepository()) -export { logout }; +export { logout } diff --git a/src/auth/infra/repositories/AuthRepository.ts b/src/auth/infra/repositories/AuthRepository.ts index eb1f2149..a4893ded 100644 --- a/src/auth/infra/repositories/AuthRepository.ts +++ b/src/auth/infra/repositories/AuthRepository.ts @@ -1,12 +1,12 @@ -import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'; -import { IAuthRepository } from '../../domain/repositories/IAuthRepository'; +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IAuthRepository } from '../../domain/repositories/IAuthRepository' export class AuthRepository extends ApiRepository implements IAuthRepository { public async logout(): Promise { return this.doPost('/logout', '') .then(() => undefined) .catch((error) => { - throw error; - }); + throw error + }) } } diff --git a/src/core/domain/repositories/ReadError.ts b/src/core/domain/repositories/ReadError.ts index a9b42660..67028c8b 100644 --- a/src/core/domain/repositories/ReadError.ts +++ b/src/core/domain/repositories/ReadError.ts @@ -1,7 +1,7 @@ -import { RepositoryError } from './RepositoryError'; +import { RepositoryError } from './RepositoryError' export class ReadError extends RepositoryError { constructor(reason?: string) { - super('There was an error when reading the resource.', reason); + super('There was an error when reading the resource.', reason) } } diff --git a/src/core/domain/repositories/RepositoryError.ts b/src/core/domain/repositories/RepositoryError.ts index d2fbc329..3a5495a6 100644 --- a/src/core/domain/repositories/RepositoryError.ts +++ b/src/core/domain/repositories/RepositoryError.ts @@ -1,8 +1,8 @@ export abstract class RepositoryError extends Error { constructor(message: string, reason?: string) { if (reason) { - message += ` Reason was: ${reason}`; + message += ` Reason was: ${reason}` } - super(message); + super(message) } } diff --git a/src/core/domain/repositories/WriteError.ts b/src/core/domain/repositories/WriteError.ts index 907916f1..2d00be6c 100644 --- a/src/core/domain/repositories/WriteError.ts +++ b/src/core/domain/repositories/WriteError.ts @@ -1,7 +1,7 @@ -import { RepositoryError } from './RepositoryError'; +import { RepositoryError } from './RepositoryError' export class WriteError extends RepositoryError { constructor(reason?: string) { - super('There was an error when writing the resource.', reason); + super('There was an error when writing the resource.', reason) } } diff --git a/src/core/domain/useCases/UseCase.ts b/src/core/domain/useCases/UseCase.ts index 5e401bf9..df58c6c9 100644 --- a/src/core/domain/useCases/UseCase.ts +++ b/src/core/domain/useCases/UseCase.ts @@ -1,4 +1,4 @@ export interface UseCase { // eslint-disable-next-line @typescript-eslint/no-explicit-any - execute(...args: any[]): Promise; + execute(...args: any[]): Promise } diff --git a/src/core/index.ts b/src/core/index.ts index 66d49fb9..2477a70c 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,3 +1,3 @@ -export { ReadError } from './domain/repositories/ReadError'; -export { WriteError } from './domain/repositories/WriteError'; -export { ApiConfig } from './infra/repositories/ApiConfig'; +export { ReadError } from './domain/repositories/ReadError' +export { WriteError } from './domain/repositories/WriteError' +export { ApiConfig } from './infra/repositories/ApiConfig' diff --git a/src/core/infra/repositories/ApiConfig.ts b/src/core/infra/repositories/ApiConfig.ts index d861bb22..aa6c3cbd 100644 --- a/src/core/infra/repositories/ApiConfig.ts +++ b/src/core/infra/repositories/ApiConfig.ts @@ -1,16 +1,20 @@ export class ApiConfig { - static dataverseApiUrl: string; - static dataverseApiAuthMechanism: DataverseApiAuthMechanism; - static dataverseApiKey?: string; + static dataverseApiUrl: string + static dataverseApiAuthMechanism: DataverseApiAuthMechanism + static dataverseApiKey?: string - static init(dataverseApiUrl: string, dataverseApiAuthMechanism: DataverseApiAuthMechanism, dataverseApiKey?: string) { - this.dataverseApiUrl = dataverseApiUrl; - this.dataverseApiAuthMechanism = dataverseApiAuthMechanism; - this.dataverseApiKey = dataverseApiKey; + static init( + dataverseApiUrl: string, + dataverseApiAuthMechanism: DataverseApiAuthMechanism, + dataverseApiKey?: string + ) { + this.dataverseApiUrl = dataverseApiUrl + this.dataverseApiAuthMechanism = dataverseApiAuthMechanism + this.dataverseApiKey = dataverseApiKey } } export enum DataverseApiAuthMechanism { API_KEY = 'api-key', - SESSION_COOKIE = 'session-cookie', // Temporal and only for dev purposes + SESSION_COOKIE = 'session-cookie' // Temporal and only for dev purposes } diff --git a/src/core/infra/repositories/ApiRepository.ts b/src/core/infra/repositories/ApiRepository.ts index a58fe658..5850c96a 100644 --- a/src/core/infra/repositories/ApiRepository.ts +++ b/src/core/infra/repositories/ApiRepository.ts @@ -1,50 +1,70 @@ -import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'; -import { ApiConfig, DataverseApiAuthMechanism } from './ApiConfig'; -import { ReadError } from '../../domain/repositories/ReadError'; -import { WriteError } from '../../domain/repositories/WriteError'; +import axios, { AxiosResponse, AxiosRequestConfig } from 'axios' +import { ApiConfig, DataverseApiAuthMechanism } from './ApiConfig' +import { ReadError } from '../../domain/repositories/ReadError' +import { WriteError } from '../../domain/repositories/WriteError' export abstract class ApiRepository { - public async doGet(apiEndpoint: string, authRequired = false, queryParams: object = {}): Promise { + public async doGet( + apiEndpoint: string, + authRequired = false, + queryParams: object = {} + ): Promise { return await axios .get(this.buildRequestUrl(apiEndpoint), this.buildRequestConfig(authRequired, queryParams)) .then((response) => response) .catch((error) => { throw new ReadError( - `[${error.response.status}]${error.response.data ? ` ${error.response.data.message}` : ''}`, - ); - }); + `[${error.response.status}]${ + error.response.data ? ` ${error.response.data.message}` : '' + }` + ) + }) } - public async doPost(apiEndpoint: string, data: string | object, queryParams: object = {}): Promise { + public async doPost( + apiEndpoint: string, + data: string | object, + queryParams: object = {} + ): Promise { return await axios - .post(this.buildRequestUrl(apiEndpoint), JSON.stringify(data), this.buildRequestConfig(true, queryParams)) + .post( + this.buildRequestUrl(apiEndpoint), + JSON.stringify(data), + this.buildRequestConfig(true, queryParams) + ) .then((response) => response) .catch((error) => { throw new WriteError( - `[${error.response.status}]${error.response.data ? ` ${error.response.data.message}` : ''}`, - ); - }); + `[${error.response.status}]${ + error.response.data ? ` ${error.response.data.message}` : '' + }` + ) + }) } - protected buildApiEndpoint(resourceName: string, operation: string, resourceId: number | string = undefined) { - let endpoint; + protected buildApiEndpoint( + resourceName: string, + operation: string, + resourceId: number | string = undefined + ) { + let endpoint if (typeof resourceId === 'number') { - endpoint = `/${resourceName}/${resourceId}/${operation}`; + endpoint = `/${resourceName}/${resourceId}/${operation}` } else if (typeof resourceId === 'string') { - endpoint = `/${resourceName}/:persistentId/${operation}?persistentId=${resourceId}`; + endpoint = `/${resourceName}/:persistentId/${operation}?persistentId=${resourceId}` } else { - endpoint = `/${resourceName}/${operation}`; + endpoint = `/${resourceName}/${operation}` } - return endpoint; + return endpoint } private buildRequestConfig(authRequired: boolean, queryParams: object): AxiosRequestConfig { const requestConfig: AxiosRequestConfig = { params: queryParams, - headers: { 'Content-Type': 'application/json' }, - }; + headers: { 'Content-Type': 'application/json' } + } if (!authRequired) { - return requestConfig; + return requestConfig } switch (ApiConfig.dataverseApiAuthMechanism) { case DataverseApiAuthMechanism.SESSION_COOKIE: @@ -53,16 +73,16 @@ export abstract class ApiRepository { This is required, along with the session auth feature flag enabled in the backend, to be able to authenticate using the JSESSIONID cookie. Auth mechanisms like this are configurable to set the one that fits the particular use case of js-dataverse. (For the SPA MVP, it is the session cookie API auth). */ - requestConfig.withCredentials = true; - break; + requestConfig.withCredentials = true + break case DataverseApiAuthMechanism.API_KEY: - requestConfig.headers['X-Dataverse-Key'] = ApiConfig.dataverseApiKey; - break; + requestConfig.headers['X-Dataverse-Key'] = ApiConfig.dataverseApiKey + break } - return requestConfig; + return requestConfig } private buildRequestUrl(apiEndpoint: string): string { - return `${ApiConfig.dataverseApiUrl}${apiEndpoint}`; + return `${ApiConfig.dataverseApiUrl}${apiEndpoint}` } } diff --git a/src/datasets/domain/models/Dataset.ts b/src/datasets/domain/models/Dataset.ts index f105475f..6f0423ba 100644 --- a/src/datasets/domain/models/Dataset.ts +++ b/src/datasets/domain/models/Dataset.ts @@ -1,182 +1,182 @@ export interface Dataset { - id: number; - persistentId: string; - versionId: number; - versionInfo: DatasetVersionInfo; - license?: DatasetLicense; - alternativePersistentId?: string; - publicationDate?: string; - citationDate?: string; - metadataBlocks: DatasetMetadataBlocks; + id: number + persistentId: string + versionId: number + versionInfo: DatasetVersionInfo + license?: DatasetLicense + alternativePersistentId?: string + publicationDate?: string + citationDate?: string + metadataBlocks: DatasetMetadataBlocks } export interface DatasetVersionInfo { - majorNumber: number; - minorNumber: number; - state: DatasetVersionState; - createTime: Date; - lastUpdateTime: Date; - releaseTime?: Date; + majorNumber: number + minorNumber: number + state: DatasetVersionState + createTime: Date + lastUpdateTime: Date + releaseTime?: Date } export enum DatasetVersionState { DRAFT = 'DRAFT', RELEASED = 'RELEASED', ARCHIVED = 'ARCHIVED', - DEACCESSIONED = 'DEACCESSIONED', + DEACCESSIONED = 'DEACCESSIONED' } export interface DatasetLicense { - name: string; - uri: string; - iconUri?: string; + name: string + uri: string + iconUri?: string } -export type DatasetMetadataBlocks = [CitationMetadataBlock, ...DatasetMetadataBlock[]]; +export type DatasetMetadataBlocks = [CitationMetadataBlock, ...DatasetMetadataBlock[]] export interface DatasetMetadataBlock { - name: string; - fields: DatasetMetadataFields; + name: string + fields: DatasetMetadataFields } -export const ANONYMIZED_FIELD_VALUE = 'withheld'; -type AnonymizedField = typeof ANONYMIZED_FIELD_VALUE; +export const ANONYMIZED_FIELD_VALUE = 'withheld' +type AnonymizedField = typeof ANONYMIZED_FIELD_VALUE -export type DatasetMetadataFields = Record; +export type DatasetMetadataFields = Record export type DatasetMetadataFieldValue = | string | string[] | DatasetMetadataSubField | DatasetMetadataSubField[] - | AnonymizedField; + | AnonymizedField -export type DatasetMetadataSubField = Record; +export type DatasetMetadataSubField = Record export interface CitationMetadataBlock extends DatasetMetadataBlock { - name: 'citation'; + name: 'citation' fields: { - title: string; - author: Author[] | AnonymizedField; - datasetContact: DatasetContact[] | AnonymizedField; - dsDescription: DatasetDescription[] | AnonymizedField; - subject: string[] | AnonymizedField; - subtitle?: string; - alternativeTitle?: string; - alternativeURL?: string; - otherId?: OtherId[] | AnonymizedField; - keyword?: Keyword[] | AnonymizedField; - topicClassification?: TopicClassification[] | AnonymizedField; - publication?: Publication[] | AnonymizedField; - notesText?: string; - language?: string[] | AnonymizedField; - producer?: Producer[] | AnonymizedField; - productionDate?: string; - productionPlace?: string[] | AnonymizedField; - contributor?: Contributor[] | AnonymizedField; - grantNumber?: GrantNumber[] | AnonymizedField; - distributor?: Distributor[] | AnonymizedField; - distributionDate?: string; - depositor?: string; - dateOfDeposit?: string; - timePeriodCovered?: TimePeriodCovered[] | AnonymizedField; - dateOfCollection?: DateOfCollection[] | AnonymizedField; - kindOfData?: string[] | AnonymizedField; - series?: Series[] | AnonymizedField; - software?: Software[] | AnonymizedField; - relatedMaterial?: string[] | AnonymizedField; - relatedDatasets?: string[] | AnonymizedField; - otherReferences?: string[] | AnonymizedField; - dataSources?: string[] | AnonymizedField; - originOfSources?: string; - characteristicOfSources?: string; - accessToSources?: string; - }; + title: string + author: Author[] | AnonymizedField + datasetContact: DatasetContact[] | AnonymizedField + dsDescription: DatasetDescription[] | AnonymizedField + subject: string[] | AnonymizedField + subtitle?: string + alternativeTitle?: string + alternativeURL?: string + otherId?: OtherId[] | AnonymizedField + keyword?: Keyword[] | AnonymizedField + topicClassification?: TopicClassification[] | AnonymizedField + publication?: Publication[] | AnonymizedField + notesText?: string + language?: string[] | AnonymizedField + producer?: Producer[] | AnonymizedField + productionDate?: string + productionPlace?: string[] | AnonymizedField + contributor?: Contributor[] | AnonymizedField + grantNumber?: GrantNumber[] | AnonymizedField + distributor?: Distributor[] | AnonymizedField + distributionDate?: string + depositor?: string + dateOfDeposit?: string + timePeriodCovered?: TimePeriodCovered[] | AnonymizedField + dateOfCollection?: DateOfCollection[] | AnonymizedField + kindOfData?: string[] | AnonymizedField + series?: Series[] | AnonymizedField + software?: Software[] | AnonymizedField + relatedMaterial?: string[] | AnonymizedField + relatedDatasets?: string[] | AnonymizedField + otherReferences?: string[] | AnonymizedField + dataSources?: string[] | AnonymizedField + originOfSources?: string + characteristicOfSources?: string + accessToSources?: string + } } interface OtherId extends DatasetMetadataSubField { - otherIdAgency?: string; - otherIdValue?: string; + otherIdAgency?: string + otherIdValue?: string } export interface Author extends DatasetMetadataSubField { - authorName: string; - authorAffiliation: string; - authorIdentifierScheme?: string; - authorIdentifier?: string; + authorName: string + authorAffiliation: string + authorIdentifierScheme?: string + authorIdentifier?: string } export interface DatasetContact extends DatasetMetadataSubField { - datasetContactName: string; - datasetContactEmail: string; - datasetContactAffiliation?: string; + datasetContactName: string + datasetContactEmail: string + datasetContactAffiliation?: string } export interface DatasetDescription extends DatasetMetadataSubField { - dsDescriptionValue: string; - dsDescriptionDate?: string; + dsDescriptionValue: string + dsDescriptionDate?: string } interface Keyword extends DatasetMetadataSubField { - keywordValue?: string; - keywordVocabulary?: string; - keywordVocabularyURI?: string; + keywordValue?: string + keywordVocabulary?: string + keywordVocabularyURI?: string } interface TopicClassification extends DatasetMetadataSubField { - topicClassValue?: string; - topicClassVocab?: string; - topicClassVocabURI?: string; + topicClassValue?: string + topicClassVocab?: string + topicClassVocabURI?: string } interface Publication extends DatasetMetadataSubField { - publicationCitation?: string; - publicationIDType?: string; - publicationIDNumber?: string; - publicationURL?: string; + publicationCitation?: string + publicationIDType?: string + publicationIDNumber?: string + publicationURL?: string } interface Producer extends DatasetMetadataSubField { - producerName?: string; - producerAffiliation?: string; - producerAbbreviation?: string; - producerURL?: string; - producerLogoURL?: string; + producerName?: string + producerAffiliation?: string + producerAbbreviation?: string + producerURL?: string + producerLogoURL?: string } interface Contributor extends DatasetMetadataSubField { - contributorType?: string; - contributorName?: string; + contributorType?: string + contributorName?: string } interface GrantNumber extends DatasetMetadataSubField { - grantNumberAgency?: string; - grantNumberValue?: string; + grantNumberAgency?: string + grantNumberValue?: string } interface Distributor extends DatasetMetadataSubField { - distributorName?: string; - distributorAffiliation?: string; - distributorAbbreviation?: string; - distributorURL?: string; - distributorLogoURL?: string; + distributorName?: string + distributorAffiliation?: string + distributorAbbreviation?: string + distributorURL?: string + distributorLogoURL?: string } interface TimePeriodCovered extends DatasetMetadataSubField { - timePeriodCoveredStart?: string; - timePeriodCoveredEnd?: string; + timePeriodCoveredStart?: string + timePeriodCoveredEnd?: string } interface DateOfCollection extends DatasetMetadataSubField { - dateOfCollectionStart?: string; - dateOfCollectionEnd?: string; + dateOfCollectionStart?: string + dateOfCollectionEnd?: string } interface Series extends DatasetMetadataSubField { - seriesName?: string; - seriesInformation?: string; + seriesName?: string + seriesInformation?: string } interface Software extends DatasetMetadataSubField { - softwareName?: string; - softwareVersion?: string; + softwareName?: string + softwareVersion?: string } diff --git a/src/datasets/domain/models/DatasetLock.ts b/src/datasets/domain/models/DatasetLock.ts index 42d9e423..cc1413e1 100644 --- a/src/datasets/domain/models/DatasetLock.ts +++ b/src/datasets/domain/models/DatasetLock.ts @@ -1,9 +1,9 @@ export interface DatasetLock { - lockType: DatasetLockType; - date?: string; - userId: string; - datasetPersistentId: string; - message?: string; + lockType: DatasetLockType + date?: string + userId: string + datasetPersistentId: string + message?: string } export enum DatasetLockType { @@ -14,5 +14,5 @@ export enum DatasetLockType { GLOBUS_UPLOAD = 'GlobusUpload', FINALIZE_PUBLICATION = 'finalizePublication', EDIT_IN_PROGRESS = 'EditInProgress', - FILE_VALIDATION_FAILED = 'FileValidationFailed', + FILE_VALIDATION_FAILED = 'FileValidationFailed' } diff --git a/src/datasets/domain/models/DatasetNotNumberedVersion.ts b/src/datasets/domain/models/DatasetNotNumberedVersion.ts index a646b5be..8d8264dd 100644 --- a/src/datasets/domain/models/DatasetNotNumberedVersion.ts +++ b/src/datasets/domain/models/DatasetNotNumberedVersion.ts @@ -1,4 +1,4 @@ export enum DatasetNotNumberedVersion { DRAFT = ':draft', - LATEST = ':latest', + LATEST = ':latest' } diff --git a/src/datasets/domain/models/DatasetPreview.ts b/src/datasets/domain/models/DatasetPreview.ts index 83323582..260ba4be 100644 --- a/src/datasets/domain/models/DatasetPreview.ts +++ b/src/datasets/domain/models/DatasetPreview.ts @@ -1,10 +1,10 @@ -import { DatasetVersionInfo } from './Dataset'; +import { DatasetVersionInfo } from './Dataset' export interface DatasetPreview { - persistentId: string; - title: string; - versionId: number; - versionInfo: DatasetVersionInfo; - citation: string; - description: string; + persistentId: string + title: string + versionId: number + versionInfo: DatasetVersionInfo + citation: string + description: string } diff --git a/src/datasets/domain/models/DatasetPreviewSubset.ts b/src/datasets/domain/models/DatasetPreviewSubset.ts index 091a47a8..628101f8 100644 --- a/src/datasets/domain/models/DatasetPreviewSubset.ts +++ b/src/datasets/domain/models/DatasetPreviewSubset.ts @@ -1,6 +1,6 @@ -import { DatasetPreview } from './DatasetPreview'; +import { DatasetPreview } from './DatasetPreview' export interface DatasetPreviewSubset { - datasetPreviews: DatasetPreview[]; - totalDatasetCount: number; + datasetPreviews: DatasetPreview[] + totalDatasetCount: number } diff --git a/src/datasets/domain/models/DatasetUserPermissions.ts b/src/datasets/domain/models/DatasetUserPermissions.ts index e6c301a3..51423ce7 100644 --- a/src/datasets/domain/models/DatasetUserPermissions.ts +++ b/src/datasets/domain/models/DatasetUserPermissions.ts @@ -1,7 +1,7 @@ export interface DatasetUserPermissions { - canViewUnpublishedDataset: boolean; - canEditDataset: boolean; - canPublishDataset: boolean; - canManageDatasetPermissions: boolean; - canDeleteDatasetDraft: boolean; + canViewUnpublishedDataset: boolean + canEditDataset: boolean + canPublishDataset: boolean + canManageDatasetPermissions: boolean + canDeleteDatasetDraft: boolean } diff --git a/src/datasets/domain/repositories/IDatasetsRepository.ts b/src/datasets/domain/repositories/IDatasetsRepository.ts index bc16c3f7..f12e3134 100644 --- a/src/datasets/domain/repositories/IDatasetsRepository.ts +++ b/src/datasets/domain/repositories/IDatasetsRepository.ts @@ -1,15 +1,23 @@ -import { Dataset } from '../models/Dataset'; -import { DatasetUserPermissions } from '../models/DatasetUserPermissions'; -import { DatasetLock } from '../models/DatasetLock'; -import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset'; +import { Dataset } from '../models/Dataset' +import { DatasetUserPermissions } from '../models/DatasetUserPermissions' +import { DatasetLock } from '../models/DatasetLock' +import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset' export interface IDatasetsRepository { - getDatasetSummaryFieldNames(): Promise; - getDataset(datasetId: number | string, datasetVersionId: string, includeDeaccessioned: boolean): Promise; - getPrivateUrlDataset(token: string): Promise; - getDatasetCitation(datasetId: number, datasetVersionId: string, includeDeaccessioned: boolean): Promise; - getPrivateUrlDatasetCitation(token: string): Promise; - getDatasetUserPermissions(datasetId: number | string): Promise; - getDatasetLocks(datasetId: number | string): Promise; - getAllDatasetPreviews(limit?: number, offset?: number): Promise; + getDatasetSummaryFieldNames(): Promise + getDataset( + datasetId: number | string, + datasetVersionId: string, + includeDeaccessioned: boolean + ): Promise + getPrivateUrlDataset(token: string): Promise + getDatasetCitation( + datasetId: number, + datasetVersionId: string, + includeDeaccessioned: boolean + ): Promise + getPrivateUrlDatasetCitation(token: string): Promise + getDatasetUserPermissions(datasetId: number | string): Promise + getDatasetLocks(datasetId: number | string): Promise + getAllDatasetPreviews(limit?: number, offset?: number): Promise } diff --git a/src/datasets/domain/useCases/GetAllDatasetPreviews.ts b/src/datasets/domain/useCases/GetAllDatasetPreviews.ts index baa0c7ea..008c0ef3 100644 --- a/src/datasets/domain/useCases/GetAllDatasetPreviews.ts +++ b/src/datasets/domain/useCases/GetAllDatasetPreviews.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset' export class GetAllDatasetPreviews implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -17,6 +17,6 @@ export class GetAllDatasetPreviews implements UseCase { * @returns {Promise} */ async execute(limit?: number, offset?: number): Promise { - return await this.datasetsRepository.getAllDatasetPreviews(limit, offset); + return await this.datasetsRepository.getAllDatasetPreviews(limit, offset) } } diff --git a/src/datasets/domain/useCases/GetDataset.ts b/src/datasets/domain/useCases/GetDataset.ts index ca3075a6..b133615e 100644 --- a/src/datasets/domain/useCases/GetDataset.ts +++ b/src/datasets/domain/useCases/GetDataset.ts @@ -1,13 +1,13 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { Dataset } from '../models/Dataset'; -import { DatasetNotNumberedVersion } from '../models/DatasetNotNumberedVersion'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { Dataset } from '../models/Dataset' +import { DatasetNotNumberedVersion } from '../models/DatasetNotNumberedVersion' export class GetDataset implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -21,8 +21,12 @@ export class GetDataset implements UseCase { async execute( datasetId: number | string, datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, - includeDeaccessioned = false, + includeDeaccessioned = false ): Promise { - return await this.datasetsRepository.getDataset(datasetId, datasetVersionId, includeDeaccessioned); + return await this.datasetsRepository.getDataset( + datasetId, + datasetVersionId, + includeDeaccessioned + ) } } diff --git a/src/datasets/domain/useCases/GetDatasetCitation.ts b/src/datasets/domain/useCases/GetDatasetCitation.ts index fd158f84..23f97c79 100644 --- a/src/datasets/domain/useCases/GetDatasetCitation.ts +++ b/src/datasets/domain/useCases/GetDatasetCitation.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { DatasetNotNumberedVersion } from '../models/DatasetNotNumberedVersion'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { DatasetNotNumberedVersion } from '../models/DatasetNotNumberedVersion' export class GetDatasetCitation implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -20,8 +20,12 @@ export class GetDatasetCitation implements UseCase { async execute( datasetId: number, datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, - includeDeaccessioned = false, + includeDeaccessioned = false ): Promise { - return await this.datasetsRepository.getDatasetCitation(datasetId, datasetVersionId, includeDeaccessioned); + return await this.datasetsRepository.getDatasetCitation( + datasetId, + datasetVersionId, + includeDeaccessioned + ) } } diff --git a/src/datasets/domain/useCases/GetDatasetLocks.ts b/src/datasets/domain/useCases/GetDatasetLocks.ts index b4164567..aa55924d 100644 --- a/src/datasets/domain/useCases/GetDatasetLocks.ts +++ b/src/datasets/domain/useCases/GetDatasetLocks.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { DatasetLock } from '../models/DatasetLock'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { DatasetLock } from '../models/DatasetLock' export class GetDatasetLocks implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -16,6 +16,6 @@ export class GetDatasetLocks implements UseCase { * @returns {Promise} */ async execute(datasetId: number | string): Promise { - return await this.datasetsRepository.getDatasetLocks(datasetId); + return await this.datasetsRepository.getDatasetLocks(datasetId) } } diff --git a/src/datasets/domain/useCases/GetDatasetSummaryFieldNames.ts b/src/datasets/domain/useCases/GetDatasetSummaryFieldNames.ts index 4b67afc3..ab1e253c 100644 --- a/src/datasets/domain/useCases/GetDatasetSummaryFieldNames.ts +++ b/src/datasets/domain/useCases/GetDatasetSummaryFieldNames.ts @@ -1,11 +1,11 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' export class GetDatasetSummaryFieldNames implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -14,6 +14,6 @@ export class GetDatasetSummaryFieldNames implements UseCase { * @returns {Promise} */ async execute(): Promise { - return await this.datasetsRepository.getDatasetSummaryFieldNames(); + return await this.datasetsRepository.getDatasetSummaryFieldNames() } } diff --git a/src/datasets/domain/useCases/GetDatasetUserPermissions.ts b/src/datasets/domain/useCases/GetDatasetUserPermissions.ts index 13055977..09c43ffe 100644 --- a/src/datasets/domain/useCases/GetDatasetUserPermissions.ts +++ b/src/datasets/domain/useCases/GetDatasetUserPermissions.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { DatasetUserPermissions } from '../models/DatasetUserPermissions'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { DatasetUserPermissions } from '../models/DatasetUserPermissions' export class GetDatasetUserPermissions implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -16,6 +16,6 @@ export class GetDatasetUserPermissions implements UseCase} */ async execute(datasetId: number | string): Promise { - return await this.datasetsRepository.getDatasetUserPermissions(datasetId); + return await this.datasetsRepository.getDatasetUserPermissions(datasetId) } } diff --git a/src/datasets/domain/useCases/GetPrivateUrlDataset.ts b/src/datasets/domain/useCases/GetPrivateUrlDataset.ts index 2e05906d..e2d3c918 100644 --- a/src/datasets/domain/useCases/GetPrivateUrlDataset.ts +++ b/src/datasets/domain/useCases/GetPrivateUrlDataset.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { Dataset } from '../models/Dataset'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { Dataset } from '../models/Dataset' export class GetPrivateUrlDataset implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -16,6 +16,6 @@ export class GetPrivateUrlDataset implements UseCase { * @returns {Promise} */ async execute(token: string): Promise { - return await this.datasetsRepository.getPrivateUrlDataset(token); + return await this.datasetsRepository.getPrivateUrlDataset(token) } } diff --git a/src/datasets/domain/useCases/GetPrivateUrlDatasetCitation.ts b/src/datasets/domain/useCases/GetPrivateUrlDatasetCitation.ts index 508376e8..9579efe5 100644 --- a/src/datasets/domain/useCases/GetPrivateUrlDatasetCitation.ts +++ b/src/datasets/domain/useCases/GetPrivateUrlDatasetCitation.ts @@ -1,11 +1,11 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' export class GetPrivateUrlDatasetCitation implements UseCase { - private datasetsRepository: IDatasetsRepository; + private datasetsRepository: IDatasetsRepository constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository; + this.datasetsRepository = datasetsRepository } /** @@ -15,6 +15,6 @@ export class GetPrivateUrlDatasetCitation implements UseCase { * @returns {Promise} */ async execute(token: string): Promise { - return await this.datasetsRepository.getPrivateUrlDatasetCitation(token); + return await this.datasetsRepository.getPrivateUrlDatasetCitation(token) } } diff --git a/src/datasets/index.ts b/src/datasets/index.ts index 07a1574a..175afacd 100644 --- a/src/datasets/index.ts +++ b/src/datasets/index.ts @@ -1,23 +1,23 @@ -import { DatasetsRepository } from './infra/repositories/DatasetsRepository'; -import { GetDatasetSummaryFieldNames } from './domain/useCases/GetDatasetSummaryFieldNames'; -import { GetDataset } from './domain/useCases/GetDataset'; -import { GetPrivateUrlDataset } from './domain/useCases/GetPrivateUrlDataset'; -import { GetDatasetCitation } from './domain/useCases/GetDatasetCitation'; -import { GetPrivateUrlDatasetCitation } from './domain/useCases/GetPrivateUrlDatasetCitation'; -import { GetDatasetUserPermissions } from './domain/useCases/GetDatasetUserPermissions'; -import { GetDatasetLocks } from './domain/useCases/GetDatasetLocks'; -import { GetAllDatasetPreviews } from './domain/useCases/GetAllDatasetPreviews'; +import { DatasetsRepository } from './infra/repositories/DatasetsRepository' +import { GetDatasetSummaryFieldNames } from './domain/useCases/GetDatasetSummaryFieldNames' +import { GetDataset } from './domain/useCases/GetDataset' +import { GetPrivateUrlDataset } from './domain/useCases/GetPrivateUrlDataset' +import { GetDatasetCitation } from './domain/useCases/GetDatasetCitation' +import { GetPrivateUrlDatasetCitation } from './domain/useCases/GetPrivateUrlDatasetCitation' +import { GetDatasetUserPermissions } from './domain/useCases/GetDatasetUserPermissions' +import { GetDatasetLocks } from './domain/useCases/GetDatasetLocks' +import { GetAllDatasetPreviews } from './domain/useCases/GetAllDatasetPreviews' -const datasetsRepository = new DatasetsRepository(); +const datasetsRepository = new DatasetsRepository() -const getDatasetSummaryFieldNames = new GetDatasetSummaryFieldNames(datasetsRepository); -const getDataset = new GetDataset(datasetsRepository); -const getPrivateUrlDataset = new GetPrivateUrlDataset(datasetsRepository); -const getDatasetCitation = new GetDatasetCitation(datasetsRepository); -const getPrivateUrlDatasetCitation = new GetPrivateUrlDatasetCitation(datasetsRepository); -const getDatasetUserPermissions = new GetDatasetUserPermissions(datasetsRepository); -const getDatasetLocks = new GetDatasetLocks(datasetsRepository); -const getAllDatasetPreviews = new GetAllDatasetPreviews(datasetsRepository); +const getDatasetSummaryFieldNames = new GetDatasetSummaryFieldNames(datasetsRepository) +const getDataset = new GetDataset(datasetsRepository) +const getPrivateUrlDataset = new GetPrivateUrlDataset(datasetsRepository) +const getDatasetCitation = new GetDatasetCitation(datasetsRepository) +const getPrivateUrlDatasetCitation = new GetPrivateUrlDatasetCitation(datasetsRepository) +const getDatasetUserPermissions = new GetDatasetUserPermissions(datasetsRepository) +const getDatasetLocks = new GetDatasetLocks(datasetsRepository) +const getAllDatasetPreviews = new GetAllDatasetPreviews(datasetsRepository) export { getDatasetSummaryFieldNames, @@ -27,11 +27,11 @@ export { getPrivateUrlDatasetCitation, getDatasetUserPermissions, getDatasetLocks, - getAllDatasetPreviews, -}; -export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'; -export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'; -export { DatasetLock, DatasetLockType } from './domain/models/DatasetLock'; + getAllDatasetPreviews +} +export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion' +export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions' +export { DatasetLock, DatasetLockType } from './domain/models/DatasetLock' export { Dataset, DatasetVersionInfo, @@ -41,7 +41,7 @@ export { DatasetMetadataBlock, DatasetMetadataFields, DatasetMetadataFieldValue, - DatasetMetadataSubField, -} from './domain/models/Dataset'; -export { DatasetPreview } from './domain/models/DatasetPreview'; -export { DatasetPreviewSubset } from './domain/models/DatasetPreviewSubset'; + DatasetMetadataSubField +} from './domain/models/Dataset' +export { DatasetPreview } from './domain/models/DatasetPreview' +export { DatasetPreviewSubset } from './domain/models/DatasetPreviewSubset' diff --git a/src/datasets/infra/repositories/DatasetsRepository.ts b/src/datasets/infra/repositories/DatasetsRepository.ts index 541f1698..47ea3ffa 100644 --- a/src/datasets/infra/repositories/DatasetsRepository.ts +++ b/src/datasets/infra/repositories/DatasetsRepository.ts @@ -1,109 +1,125 @@ -import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'; -import { IDatasetsRepository } from '../../domain/repositories/IDatasetsRepository'; -import { Dataset } from '../../domain/models/Dataset'; -import { transformVersionResponseToDataset } from './transformers/datasetTransformers'; -import { DatasetUserPermissions } from '../../domain/models/DatasetUserPermissions'; -import { transformDatasetUserPermissionsResponseToDatasetUserPermissions } from './transformers/datasetUserPermissionsTransformers'; -import { DatasetLock } from '../../domain/models/DatasetLock'; -import { transformDatasetLocksResponseToDatasetLocks } from './transformers/datasetLocksTransformers'; -import { transformDatasetPreviewsResponseToDatasetPreviewSubset } from './transformers/datasetPreviewsTransformers'; -import { DatasetPreviewSubset } from '../../domain/models/DatasetPreviewSubset'; +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IDatasetsRepository } from '../../domain/repositories/IDatasetsRepository' +import { Dataset } from '../../domain/models/Dataset' +import { transformVersionResponseToDataset } from './transformers/datasetTransformers' +import { DatasetUserPermissions } from '../../domain/models/DatasetUserPermissions' +import { transformDatasetUserPermissionsResponseToDatasetUserPermissions } from './transformers/datasetUserPermissionsTransformers' +import { DatasetLock } from '../../domain/models/DatasetLock' +import { transformDatasetLocksResponseToDatasetLocks } from './transformers/datasetLocksTransformers' +import { transformDatasetPreviewsResponseToDatasetPreviewSubset } from './transformers/datasetPreviewsTransformers' +import { DatasetPreviewSubset } from '../../domain/models/DatasetPreviewSubset' export interface GetAllDatasetPreviewsQueryParams { - per_page?: number; - start?: number; + per_page?: number + start?: number } export class DatasetsRepository extends ApiRepository implements IDatasetsRepository { - private readonly datasetsResourceName: string = 'datasets'; + private readonly datasetsResourceName: string = 'datasets' public async getDatasetSummaryFieldNames(): Promise { return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'summaryFieldNames')) .then((response) => response.data.data) .catch((error) => { - throw error; - }); + throw error + }) } public async getPrivateUrlDataset(token: string): Promise { - return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, `privateUrlDatasetVersion/${token}`)) + return this.doGet( + this.buildApiEndpoint(this.datasetsResourceName, `privateUrlDatasetVersion/${token}`) + ) .then((response) => transformVersionResponseToDataset(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getDataset( datasetId: number | string, datasetVersionId: string, - includeDeaccessioned: boolean, + includeDeaccessioned: boolean ): Promise { return this.doGet( this.buildApiEndpoint(this.datasetsResourceName, `versions/${datasetVersionId}`, datasetId), true, { includeDeaccessioned: includeDeaccessioned, - includeFiles: false, - }, + includeFiles: false + } ) .then((response) => transformVersionResponseToDataset(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getDatasetCitation( datasetId: number, datasetVersionId: string, - includeDeaccessioned: boolean, + includeDeaccessioned: boolean ): Promise { return this.doGet( - this.buildApiEndpoint(this.datasetsResourceName, `versions/${datasetVersionId}/citation`, datasetId), + this.buildApiEndpoint( + this.datasetsResourceName, + `versions/${datasetVersionId}/citation`, + datasetId + ), true, - { includeDeaccessioned: includeDeaccessioned }, + { includeDeaccessioned: includeDeaccessioned } ) .then((response) => response.data.data.message) .catch((error) => { - throw error; - }); + throw error + }) } public async getPrivateUrlDatasetCitation(token: string): Promise { - return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, `privateUrlDatasetVersion/${token}/citation`)) + return this.doGet( + this.buildApiEndpoint(this.datasetsResourceName, `privateUrlDatasetVersion/${token}/citation`) + ) .then((response) => response.data.data.message) .catch((error) => { - throw error; - }); + throw error + }) } - public async getDatasetUserPermissions(datasetId: string | number): Promise { - return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, `userPermissions`, datasetId), true) + public async getDatasetUserPermissions( + datasetId: string | number + ): Promise { + return this.doGet( + this.buildApiEndpoint(this.datasetsResourceName, `userPermissions`, datasetId), + true + ) .then((response) => transformDatasetUserPermissionsResponseToDatasetUserPermissions(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getDatasetLocks(datasetId: string | number): Promise { return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, `locks`, datasetId), true) .then((response) => transformDatasetLocksResponseToDatasetLocks(response)) .catch((error) => { - throw error; - }); + throw error + }) } - public async getAllDatasetPreviews(limit?: number, offset?: number): Promise { - const queryParams: GetAllDatasetPreviewsQueryParams = {}; + public async getAllDatasetPreviews( + limit?: number, + offset?: number + ): Promise { + const queryParams: GetAllDatasetPreviewsQueryParams = {} if (limit !== undefined) { - queryParams.per_page = limit; + queryParams.per_page = limit } if (offset !== undefined) { - queryParams.start = offset; + queryParams.start = offset } return this.doGet('/search?q=*&type=dataset&sort=date&order=desc', true, queryParams) .then((response) => transformDatasetPreviewsResponseToDatasetPreviewSubset(response)) .catch((error) => { - throw error; - }); + throw error + }) } } diff --git a/src/datasets/infra/repositories/transformers/datasetLocksTransformers.ts b/src/datasets/infra/repositories/transformers/datasetLocksTransformers.ts index 81a824f8..dcb95520 100644 --- a/src/datasets/infra/repositories/transformers/datasetLocksTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetLocksTransformers.ts @@ -1,29 +1,33 @@ -import { AxiosResponse } from 'axios'; -import { DatasetLock, DatasetLockType } from '../../../domain/models/DatasetLock'; +import { AxiosResponse } from 'axios' +import { DatasetLock, DatasetLockType } from '../../../domain/models/DatasetLock' export interface DatasetLockPayload { - lockType: string; - date?: string; - user: string; - dataset: string; - message?: string; + lockType: string + date?: string + user: string + dataset: string + message?: string } -export const transformDatasetLocksResponseToDatasetLocks = (response: AxiosResponse): DatasetLock[] => { - const datasetLocks: DatasetLock[] = []; - const datasetLocksPayload = response.data.data; +export const transformDatasetLocksResponseToDatasetLocks = ( + response: AxiosResponse +): DatasetLock[] => { + const datasetLocks: DatasetLock[] = [] + const datasetLocksPayload = response.data.data datasetLocksPayload.forEach(function (datasetLockPayload: DatasetLockPayload) { - datasetLocks.push(transformDatasetLockPayloadToDatasetLock(datasetLockPayload)); - }); - return datasetLocks; -}; + datasetLocks.push(transformDatasetLockPayloadToDatasetLock(datasetLockPayload)) + }) + return datasetLocks +} -const transformDatasetLockPayloadToDatasetLock = (datasetLockPayload: DatasetLockPayload): DatasetLock => { +const transformDatasetLockPayloadToDatasetLock = ( + datasetLockPayload: DatasetLockPayload +): DatasetLock => { return { lockType: datasetLockPayload.lockType as DatasetLockType, ...(datasetLockPayload.date && { date: datasetLockPayload.date }), userId: datasetLockPayload.user, datasetPersistentId: datasetLockPayload.dataset, - ...(datasetLockPayload.message && { message: datasetLockPayload.message }), - }; -}; + ...(datasetLockPayload.message && { message: datasetLockPayload.message }) + } +} diff --git a/src/datasets/infra/repositories/transformers/datasetPreviewsTransformers.ts b/src/datasets/infra/repositories/transformers/datasetPreviewsTransformers.ts index c7d2b9a2..917f65a3 100644 --- a/src/datasets/infra/repositories/transformers/datasetPreviewsTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetPreviewsTransformers.ts @@ -1,39 +1,39 @@ -import { AxiosResponse } from 'axios'; -import { DatasetPreview } from '../../../domain/models/DatasetPreview'; -import { DatasetVersionState } from '../../../domain/models/Dataset'; -import { DatasetPreviewSubset } from '../../../domain/models/DatasetPreviewSubset'; +import { AxiosResponse } from 'axios' +import { DatasetPreview } from '../../../domain/models/DatasetPreview' +import { DatasetVersionState } from '../../../domain/models/Dataset' +import { DatasetPreviewSubset } from '../../../domain/models/DatasetPreviewSubset' export interface DatasetPreviewPayload { - global_id: string; - name: string; - versionId: number; - majorVersion: number; - minorVersion: number; - versionState: string; - createdAt: string; - updatedAt: string; - published_at?: string; - citation: string; - description: string; + global_id: string + name: string + versionId: number + majorVersion: number + minorVersion: number + versionState: string + createdAt: string + updatedAt: string + published_at?: string + citation: string + description: string } export const transformDatasetPreviewsResponseToDatasetPreviewSubset = ( - response: AxiosResponse, + response: AxiosResponse ): DatasetPreviewSubset => { - const responseDataPayload = response.data.data; - const datasetPreviewsPayload = responseDataPayload.items; - const datasetPreviews: DatasetPreview[] = []; + const responseDataPayload = response.data.data + const datasetPreviewsPayload = responseDataPayload.items + const datasetPreviews: DatasetPreview[] = [] datasetPreviewsPayload.forEach(function (datasetPreviewPayload: DatasetPreviewPayload) { - datasetPreviews.push(transformDatasetPreviewPayloadToDatasetPreview(datasetPreviewPayload)); - }); + datasetPreviews.push(transformDatasetPreviewPayloadToDatasetPreview(datasetPreviewPayload)) + }) return { datasetPreviews: datasetPreviews, - totalDatasetCount: responseDataPayload.total_count, - }; -}; + totalDatasetCount: responseDataPayload.total_count + } +} const transformDatasetPreviewPayloadToDatasetPreview = ( - datasetPreviewPayload: DatasetPreviewPayload, + datasetPreviewPayload: DatasetPreviewPayload ): DatasetPreview => { return { persistentId: datasetPreviewPayload.global_id, @@ -45,9 +45,11 @@ const transformDatasetPreviewPayloadToDatasetPreview = ( state: datasetPreviewPayload.versionState as DatasetVersionState, createTime: new Date(datasetPreviewPayload.createdAt), lastUpdateTime: new Date(datasetPreviewPayload.updatedAt), - ...(datasetPreviewPayload.published_at && { releaseTime: new Date(datasetPreviewPayload.published_at) }), + ...(datasetPreviewPayload.published_at && { + releaseTime: new Date(datasetPreviewPayload.published_at) + }) }, citation: datasetPreviewPayload.citation, - description: datasetPreviewPayload.description, - }; -}; + description: datasetPreviewPayload.description + } +} diff --git a/src/datasets/infra/repositories/transformers/datasetTransformers.ts b/src/datasets/infra/repositories/transformers/datasetTransformers.ts index 758e832d..b8af6d9d 100644 --- a/src/datasets/infra/repositories/transformers/datasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetTransformers.ts @@ -5,17 +5,17 @@ import { DatasetMetadataSubField, DatasetMetadataFieldValue, DatasetLicense, - DatasetMetadataBlocks, -} from '../../../domain/models/Dataset'; -import { AxiosResponse } from 'axios'; -import TurndownService from 'turndown'; + DatasetMetadataBlocks +} from '../../../domain/models/Dataset' +import { AxiosResponse } from 'axios' +import TurndownService from 'turndown' -const turndownService = new TurndownService(); +const turndownService = new TurndownService() export const transformVersionResponseToDataset = (response: AxiosResponse): Dataset => { - const versionPayload = response.data.data; - return transformVersionPayloadToDataset(versionPayload); -}; + const versionPayload = response.data.data + return transformVersionPayloadToDataset(versionPayload) +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformVersionPayloadToDataset = (versionPayload: any): Dataset => { const datasetModel: Dataset = { @@ -28,81 +28,93 @@ const transformVersionPayloadToDataset = (versionPayload: any): Dataset => { state: versionPayload.versionState as DatasetVersionState, createTime: new Date(versionPayload.createTime), lastUpdateTime: new Date(versionPayload.lastUpdateTime), - releaseTime: new Date(versionPayload.releaseTime), + releaseTime: new Date(versionPayload.releaseTime) }, - metadataBlocks: transformPayloadToDatasetMetadataBlocks(versionPayload.metadataBlocks), - }; + metadataBlocks: transformPayloadToDatasetMetadataBlocks(versionPayload.metadataBlocks) + } if ('license' in versionPayload) { - datasetModel.license = transformPayloadToDatasetLicense(versionPayload.license); + datasetModel.license = transformPayloadToDatasetLicense(versionPayload.license) } if ('alternativePersistentId' in versionPayload) { - datasetModel.alternativePersistentId = versionPayload.alternativePersistentId; + datasetModel.alternativePersistentId = versionPayload.alternativePersistentId } if ('publicationDate' in versionPayload) { - datasetModel.publicationDate = versionPayload.publicationDate; + datasetModel.publicationDate = versionPayload.publicationDate } if ('citationDate' in versionPayload) { - datasetModel.citationDate = versionPayload.citationDate; + datasetModel.citationDate = versionPayload.citationDate } - return datasetModel; -}; + return datasetModel +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToDatasetLicense = (licensePayload: any): DatasetLicense => { const datasetLicense: DatasetLicense = { name: licensePayload.name, - uri: licensePayload.uri, - }; + uri: licensePayload.uri + } if ('iconUri' in licensePayload) { - datasetLicense.iconUri = licensePayload.iconUri; + datasetLicense.iconUri = licensePayload.iconUri } - return datasetLicense; -}; + return datasetLicense +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -const transformPayloadToDatasetMetadataBlocks = (metadataBlocksPayload: any): DatasetMetadataBlocks => { +const transformPayloadToDatasetMetadataBlocks = ( + metadataBlocksPayload: any +): DatasetMetadataBlocks => { return Object.keys(metadataBlocksPayload).map((metadataBlockKey) => { return { name: metadataBlockKey, - fields: transformPayloadToDatasetMetadataFields(metadataBlocksPayload[metadataBlockKey].fields), - }; - }) as DatasetMetadataBlocks; -}; + fields: transformPayloadToDatasetMetadataFields( + metadataBlocksPayload[metadataBlockKey].fields + ) + } + }) as DatasetMetadataBlocks +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -const transformPayloadToDatasetMetadataFields = (metadataFieldsPayload: any): DatasetMetadataFields => { - const metadataFieldKeys = Object.keys(metadataFieldsPayload); - const metadataFields: DatasetMetadataFields = {}; +const transformPayloadToDatasetMetadataFields = ( + metadataFieldsPayload: any +): DatasetMetadataFields => { + const metadataFieldKeys = Object.keys(metadataFieldsPayload) + const metadataFields: DatasetMetadataFields = {} for (const metadataFieldKey of metadataFieldKeys) { - const metadataField = metadataFieldsPayload[metadataFieldKey]; - const metadataFieldTypeName = metadataField.typeName; - metadataFields[metadataFieldTypeName] = transformPayloadToDatasetMetadataFieldValue(metadataField.value); + const metadataField = metadataFieldsPayload[metadataFieldKey] + const metadataFieldTypeName = metadataField.typeName + metadataFields[metadataFieldTypeName] = transformPayloadToDatasetMetadataFieldValue( + metadataField.value + ) } - return metadataFields; -}; + return metadataFields +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -const transformPayloadToDatasetMetadataFieldValue = (metadataFieldValuePayload: any): DatasetMetadataFieldValue => { - let metadataFieldValue: DatasetMetadataFieldValue; +const transformPayloadToDatasetMetadataFieldValue = ( + metadataFieldValuePayload: any +): DatasetMetadataFieldValue => { + let metadataFieldValue: DatasetMetadataFieldValue if (Array.isArray(metadataFieldValuePayload)) { - const isArrayOfObjects = typeof metadataFieldValuePayload[0] === 'object'; + const isArrayOfObjects = typeof metadataFieldValuePayload[0] === 'object' if (!isArrayOfObjects) { - metadataFieldValue = metadataFieldValuePayload.map(transformHtmlToMarkdown); + metadataFieldValue = metadataFieldValuePayload.map(transformHtmlToMarkdown) } else { - const datasetMetadataSubfields: DatasetMetadataSubField[] = []; + const datasetMetadataSubfields: DatasetMetadataSubField[] = [] metadataFieldValuePayload.forEach(function (metadataSubFieldValuePayload) { - const subFieldKeys = Object.keys(metadataSubFieldValuePayload); - const record: DatasetMetadataSubField = {}; + const subFieldKeys = Object.keys(metadataSubFieldValuePayload) + const record: DatasetMetadataSubField = {} for (const subFieldKey of subFieldKeys) { - record[subFieldKey] = transformHtmlToMarkdown(metadataSubFieldValuePayload[subFieldKey].value); + record[subFieldKey] = transformHtmlToMarkdown( + metadataSubFieldValuePayload[subFieldKey].value + ) } - datasetMetadataSubfields.push(record); - }); - metadataFieldValue = datasetMetadataSubfields; + datasetMetadataSubfields.push(record) + }) + metadataFieldValue = datasetMetadataSubfields } } else { - metadataFieldValue = transformHtmlToMarkdown(metadataFieldValuePayload); + metadataFieldValue = transformHtmlToMarkdown(metadataFieldValuePayload) } - return metadataFieldValue; -}; + return metadataFieldValue +} const transformHtmlToMarkdown = (source: string): string => { - return turndownService.turndown(source); -}; + return turndownService.turndown(source) +} diff --git a/src/datasets/infra/repositories/transformers/datasetUserPermissionsTransformers.ts b/src/datasets/infra/repositories/transformers/datasetUserPermissionsTransformers.ts index bca496f9..cf11d764 100644 --- a/src/datasets/infra/repositories/transformers/datasetUserPermissionsTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetUserPermissionsTransformers.ts @@ -1,15 +1,15 @@ -import { AxiosResponse } from 'axios'; -import { DatasetUserPermissions } from '../../../domain/models/DatasetUserPermissions'; +import { AxiosResponse } from 'axios' +import { DatasetUserPermissions } from '../../../domain/models/DatasetUserPermissions' export const transformDatasetUserPermissionsResponseToDatasetUserPermissions = ( - response: AxiosResponse, + response: AxiosResponse ): DatasetUserPermissions => { - const datasetUserPermissionsPayload = response.data.data; + const datasetUserPermissionsPayload = response.data.data return { canViewUnpublishedDataset: datasetUserPermissionsPayload.canViewUnpublishedDataset, canEditDataset: datasetUserPermissionsPayload.canEditDataset, canPublishDataset: datasetUserPermissionsPayload.canPublishDataset, canManageDatasetPermissions: datasetUserPermissionsPayload.canManageDatasetPermissions, - canDeleteDatasetDraft: datasetUserPermissionsPayload.canDeleteDatasetDraft, - }; -}; + canDeleteDatasetDraft: datasetUserPermissionsPayload.canDeleteDatasetDraft + } +} diff --git a/src/files/domain/models/File.ts b/src/files/domain/models/File.ts index 2830d5dd..b14593c9 100644 --- a/src/files/domain/models/File.ts +++ b/src/files/domain/models/File.ts @@ -1,44 +1,44 @@ export interface File { - id: number; - persistentId: string; - name: string; - pidURL?: string; - sizeBytes: number; - version: number; - description?: string; - restricted: boolean; - latestRestricted: boolean; - directoryLabel?: string; - datasetVersionId?: number; - categories?: string[]; - contentType: string; - friendlyType: string; - embargo?: FileEmbargo; - storageIdentifier?: string; - originalFormat?: string; - originalFormatLabel?: string; - originalSize?: number; - originalName?: string; - UNF?: string; - rootDataFileId?: number; - previousDataFileId?: number; - md5?: string; - checksum?: FileChecksum; - metadataId?: number; - tabularTags?: string[]; - creationDate?: Date; - publicationDate?: Date; - deleted: boolean; - tabularData: boolean; - fileAccessRequest?: boolean; + id: number + persistentId: string + name: string + pidURL?: string + sizeBytes: number + version: number + description?: string + restricted: boolean + latestRestricted: boolean + directoryLabel?: string + datasetVersionId?: number + categories?: string[] + contentType: string + friendlyType: string + embargo?: FileEmbargo + storageIdentifier?: string + originalFormat?: string + originalFormatLabel?: string + originalSize?: number + originalName?: string + UNF?: string + rootDataFileId?: number + previousDataFileId?: number + md5?: string + checksum?: FileChecksum + metadataId?: number + tabularTags?: string[] + creationDate?: Date + publicationDate?: Date + deleted: boolean + tabularData: boolean + fileAccessRequest?: boolean } export interface FileEmbargo { - dateAvailable: Date; - reason?: string; + dateAvailable: Date + reason?: string } export interface FileChecksum { - type: string; - value: string; + type: string + value: string } diff --git a/src/files/domain/models/FileCounts.ts b/src/files/domain/models/FileCounts.ts index e27200c1..5a564baf 100644 --- a/src/files/domain/models/FileCounts.ts +++ b/src/files/domain/models/FileCounts.ts @@ -1,23 +1,23 @@ -import { FileAccessStatus } from './FileCriteria'; +import { FileAccessStatus } from './FileCriteria' export interface FileCounts { - total: number; - perContentType: FileContentTypeCount[]; - perAccessStatus: FileAccessStatusCount[]; - perCategoryName: FileCategoryNameCount[]; + total: number + perContentType: FileContentTypeCount[] + perAccessStatus: FileAccessStatusCount[] + perCategoryName: FileCategoryNameCount[] } export interface FileContentTypeCount { - contentType: string; - count: number; + contentType: string + count: number } export interface FileAccessStatusCount { - accessStatus: FileAccessStatus; - count: number; + accessStatus: FileAccessStatus + count: number } export interface FileCategoryNameCount { - categoryName: string; - count: number; + categoryName: string + count: number } diff --git a/src/files/domain/models/FileCriteria.ts b/src/files/domain/models/FileCriteria.ts index 3285624a..637542ba 100644 --- a/src/files/domain/models/FileCriteria.ts +++ b/src/files/domain/models/FileCriteria.ts @@ -4,7 +4,7 @@ export class FileSearchCriteria { public readonly accessStatus?: FileAccessStatus, public readonly categoryName?: string, public readonly tabularTagName?: string, - public readonly searchText?: string, + public readonly searchText?: string ) {} withContentType(contentType: string | undefined): FileSearchCriteria { @@ -13,8 +13,8 @@ export class FileSearchCriteria { this.accessStatus, this.categoryName, this.tabularTagName, - this.searchText, - ); + this.searchText + ) } withAccessStatus(accessStatus: FileAccessStatus | undefined): FileSearchCriteria { @@ -23,8 +23,8 @@ export class FileSearchCriteria { accessStatus, this.categoryName, this.tabularTagName, - this.searchText, - ); + this.searchText + ) } withCategoryName(categoryName: string | undefined): FileSearchCriteria { @@ -33,8 +33,8 @@ export class FileSearchCriteria { this.accessStatus, categoryName, this.tabularTagName, - this.searchText, - ); + this.searchText + ) } withTabularTagName(tabularTagName: string | undefined): FileSearchCriteria { @@ -43,8 +43,8 @@ export class FileSearchCriteria { this.accessStatus, this.categoryName, tabularTagName, - this.searchText, - ); + this.searchText + ) } withSearchText(searchText: string | undefined): FileSearchCriteria { @@ -53,8 +53,8 @@ export class FileSearchCriteria { this.accessStatus, this.categoryName, this.tabularTagName, - searchText, - ); + searchText + ) } } @@ -64,12 +64,12 @@ export enum FileOrderCriteria { NEWEST = 'Newest', OLDEST = 'Oldest', SIZE = 'Size', - TYPE = 'Type', + TYPE = 'Type' } export enum FileAccessStatus { PUBLIC = 'Public', RESTRICTED = 'Restricted', EMBARGOED = 'EmbargoedThenRestricted', - EMBARGOED_RESTRICTED = 'EmbargoedThenPublic', + EMBARGOED_RESTRICTED = 'EmbargoedThenPublic' } diff --git a/src/files/domain/models/FileDataTable.ts b/src/files/domain/models/FileDataTable.ts index 2c110370..f261e296 100644 --- a/src/files/domain/models/FileDataTable.ts +++ b/src/files/domain/models/FileDataTable.ts @@ -1,82 +1,82 @@ export interface FileDataTable { - varQuantity?: number; - caseQuantity?: number; - recordsPerCase?: number; - UNF: string; - dataVariables: FileDataVariable[]; + varQuantity?: number + caseQuantity?: number + recordsPerCase?: number + UNF: string + dataVariables: FileDataVariable[] } export interface FileDataVariable { - id: number; - name: string; - label?: string; - weighted: boolean; - variableIntervalType?: FileDataVariableIntervalType; - variableFormatType?: FileDataVariableFormatType; - formatCategory?: string; - format?: string; - isOrderedCategorical: boolean; - fileOrder: number; - UNF: string; - fileStartPosition?: number; - fileEndPosition?: number; - recordSegmentNumber?: number; - numberOfDecimalPoints?: number; - variableMetadata?: FileDataVariableMetadata[]; - invalidRanges?: FileDataVariableInvalidRanges[]; - summaryStatistics?: object; - variableCategories?: FileDataVariableCategory[]; + id: number + name: string + label?: string + weighted: boolean + variableIntervalType?: FileDataVariableIntervalType + variableFormatType?: FileDataVariableFormatType + formatCategory?: string + format?: string + isOrderedCategorical: boolean + fileOrder: number + UNF: string + fileStartPosition?: number + fileEndPosition?: number + recordSegmentNumber?: number + numberOfDecimalPoints?: number + variableMetadata?: FileDataVariableMetadata[] + invalidRanges?: FileDataVariableInvalidRanges[] + summaryStatistics?: object + variableCategories?: FileDataVariableCategory[] } export interface FileDataVariableMetadata { - id: number; - metadataId: number; - label?: string; - isWeightVar: boolean; - isWeighted: boolean; - weightVariableId?: number; - literalQuestion?: string; - interviewInstruction?: string; - postQuestion?: string; - universe?: string; - notes?: string; - categoryMetadatas: FileDataVariableCategoryMetadata[]; + id: number + metadataId: number + label?: string + isWeightVar: boolean + isWeighted: boolean + weightVariableId?: number + literalQuestion?: string + interviewInstruction?: string + postQuestion?: string + universe?: string + notes?: string + categoryMetadatas: FileDataVariableCategoryMetadata[] } export interface FileDataVariableCategoryMetadata { - wFreq?: number; - categoryValue?: string; + wFreq?: number + categoryValue?: string } export interface FileDataVariableInvalidRanges { - beginValue?: string; - hasBeginValueType: boolean; - isBeginValueTypePoint: boolean; - isBeginValueTypeMin: boolean; - isBeginValueTypeMinExcl: boolean; - isBeginValueTypeMax: boolean; - isBeginValueTypeMaxExcl: boolean; - endValue?: string; - hasEndValueType: boolean; - endValueTypeMax: boolean; - endValueTypeMaxExcl: boolean; + beginValue?: string + hasBeginValueType: boolean + isBeginValueTypePoint: boolean + isBeginValueTypeMin: boolean + isBeginValueTypeMinExcl: boolean + isBeginValueTypeMax: boolean + isBeginValueTypeMaxExcl: boolean + endValue?: string + hasEndValueType: boolean + endValueTypeMax: boolean + endValueTypeMaxExcl: boolean } export interface FileDataVariableCategory { - label?: string; - value?: string; - isMissing: boolean; - frequency?: number; + label?: string + value?: string + isMissing: boolean + frequency?: number } export enum FileDataVariableIntervalType { DISCRETE = 'discrete', CONTIN = 'contin', NOMINAL = 'nominal', - DICHOTOMOUS = 'dichotomous', + DICHOTOMOUS = 'dichotomous' } export enum FileDataVariableFormatType { NUMERIC = 'NUMERIC', - CHARACTER = 'CHARACTER', + CHARACTER = 'CHARACTER' } diff --git a/src/files/domain/models/FileDownloadSizeMode.ts b/src/files/domain/models/FileDownloadSizeMode.ts index 027010b0..aa098357 100644 --- a/src/files/domain/models/FileDownloadSizeMode.ts +++ b/src/files/domain/models/FileDownloadSizeMode.ts @@ -1,5 +1,5 @@ export enum FileDownloadSizeMode { ALL = 'All', ORIGINAL = 'Original', - ARCHIVAL = 'Archival', + ARCHIVAL = 'Archival' } diff --git a/src/files/domain/models/FileUserPermissions.ts b/src/files/domain/models/FileUserPermissions.ts index fd826965..ee575d53 100644 --- a/src/files/domain/models/FileUserPermissions.ts +++ b/src/files/domain/models/FileUserPermissions.ts @@ -1,5 +1,5 @@ export interface FileUserPermissions { - canDownloadFile: boolean; - canManageFilePermissions: boolean; - canEditOwnerDataset: boolean; + canDownloadFile: boolean + canManageFilePermissions: boolean + canEditOwnerDataset: boolean } diff --git a/src/files/domain/models/FilesSubset.ts b/src/files/domain/models/FilesSubset.ts index 0b2ef6f4..09697438 100644 --- a/src/files/domain/models/FilesSubset.ts +++ b/src/files/domain/models/FilesSubset.ts @@ -1,6 +1,6 @@ -import { File } from './File'; +import { File } from './File' export interface FilesSubset { - files: File[]; - totalFilesCount: number; + files: File[] + totalFilesCount: number } diff --git a/src/files/domain/repositories/IFilesRepository.ts b/src/files/domain/repositories/IFilesRepository.ts index fc9b6dda..a30bd474 100644 --- a/src/files/domain/repositories/IFilesRepository.ts +++ b/src/files/domain/repositories/IFilesRepository.ts @@ -1,10 +1,10 @@ -import { FilesSubset } from '../models/FilesSubset'; -import { FileDataTable } from '../models/FileDataTable'; -import { FileUserPermissions } from '../models/FileUserPermissions'; -import { FileSearchCriteria, FileOrderCriteria } from '../models/FileCriteria'; -import { FileCounts } from '../models/FileCounts'; -import { FileDownloadSizeMode } from '../models/FileDownloadSizeMode'; -import { File } from '../models/File'; +import { FilesSubset } from '../models/FilesSubset' +import { FileDataTable } from '../models/FileDataTable' +import { FileUserPermissions } from '../models/FileUserPermissions' +import { FileSearchCriteria, FileOrderCriteria } from '../models/FileCriteria' +import { FileCounts } from '../models/FileCounts' +import { FileDownloadSizeMode } from '../models/FileDownloadSizeMode' +import { File } from '../models/File' export interface IFilesRepository { getDatasetFiles( @@ -14,29 +14,29 @@ export interface IFilesRepository { fileOrderCriteria: FileOrderCriteria, limit?: number, offset?: number, - fileSearchCriteria?: FileSearchCriteria, - ): Promise; + fileSearchCriteria?: FileSearchCriteria + ): Promise getDatasetFileCounts( datasetId: number | string, datasetVersionId: string, includeDeaccessioned: boolean, - fileSearchCriteria?: FileSearchCriteria, - ): Promise; + fileSearchCriteria?: FileSearchCriteria + ): Promise getDatasetFilesTotalDownloadSize( datasetId: number | string, datasetVersionId: string, includeDeaccessioned: boolean, fileDownloadSizeMode: FileDownloadSizeMode, - fileSearchCriteria?: FileSearchCriteria, - ): Promise; + fileSearchCriteria?: FileSearchCriteria + ): Promise - getFileDownloadCount(fileId: number | string): Promise; + getFileDownloadCount(fileId: number | string): Promise - getFileUserPermissions(fileId: number | string): Promise; + getFileUserPermissions(fileId: number | string): Promise - getFileDataTables(fileId: number | string): Promise; + getFileDataTables(fileId: number | string): Promise - getFile(fileId: number | string, datasetVersionId: string): Promise; + getFile(fileId: number | string, datasetVersionId: string): Promise } diff --git a/src/files/domain/useCases/GetDatasetFileCounts.ts b/src/files/domain/useCases/GetDatasetFileCounts.ts index f164dcf9..17c94ba9 100644 --- a/src/files/domain/useCases/GetDatasetFileCounts.ts +++ b/src/files/domain/useCases/GetDatasetFileCounts.ts @@ -1,14 +1,14 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { DatasetNotNumberedVersion } from '../../../datasets'; -import { FileCounts } from '../models/FileCounts'; -import { FileSearchCriteria } from '../models/FileCriteria'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' +import { DatasetNotNumberedVersion } from '../../../datasets' +import { FileCounts } from '../models/FileCounts' +import { FileSearchCriteria } from '../models/FileCriteria' export class GetDatasetFileCounts implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -24,13 +24,13 @@ export class GetDatasetFileCounts implements UseCase { datasetId: number | string, datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, includeDeaccessioned = false, - fileSearchCriteria?: FileSearchCriteria, + fileSearchCriteria?: FileSearchCriteria ): Promise { return await this.filesRepository.getDatasetFileCounts( datasetId, datasetVersionId, includeDeaccessioned, - fileSearchCriteria, - ); + fileSearchCriteria + ) } } diff --git a/src/files/domain/useCases/GetDatasetFiles.ts b/src/files/domain/useCases/GetDatasetFiles.ts index 642d7c18..3b2bf86a 100644 --- a/src/files/domain/useCases/GetDatasetFiles.ts +++ b/src/files/domain/useCases/GetDatasetFiles.ts @@ -1,14 +1,14 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { FilesSubset } from '../models/FilesSubset'; -import { FileSearchCriteria, FileOrderCriteria } from '../models/FileCriteria'; -import { DatasetNotNumberedVersion } from '../../../datasets'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' +import { FilesSubset } from '../models/FilesSubset' +import { FileSearchCriteria, FileOrderCriteria } from '../models/FileCriteria' +import { DatasetNotNumberedVersion } from '../../../datasets' export class GetDatasetFiles implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -30,7 +30,7 @@ export class GetDatasetFiles implements UseCase { limit?: number, offset?: number, fileSearchCriteria?: FileSearchCriteria, - fileOrderCriteria: FileOrderCriteria = FileOrderCriteria.NAME_AZ, + fileOrderCriteria: FileOrderCriteria = FileOrderCriteria.NAME_AZ ): Promise { return await this.filesRepository.getDatasetFiles( datasetId, @@ -39,7 +39,7 @@ export class GetDatasetFiles implements UseCase { fileOrderCriteria, limit, offset, - fileSearchCriteria, - ); + fileSearchCriteria + ) } } diff --git a/src/files/domain/useCases/GetDatasetFilesTotalDownloadSize.ts b/src/files/domain/useCases/GetDatasetFilesTotalDownloadSize.ts index 53fdb25e..b1d5dec3 100644 --- a/src/files/domain/useCases/GetDatasetFilesTotalDownloadSize.ts +++ b/src/files/domain/useCases/GetDatasetFilesTotalDownloadSize.ts @@ -1,14 +1,14 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { DatasetNotNumberedVersion } from '../../../datasets'; -import { FileDownloadSizeMode } from '../models/FileDownloadSizeMode'; -import { FileSearchCriteria } from '../models/FileCriteria'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' +import { DatasetNotNumberedVersion } from '../../../datasets' +import { FileDownloadSizeMode } from '../models/FileDownloadSizeMode' +import { FileSearchCriteria } from '../models/FileCriteria' export class GetDatasetFilesTotalDownloadSize implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -26,14 +26,14 @@ export class GetDatasetFilesTotalDownloadSize implements UseCase { datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, fileDownloadSizeMode: FileDownloadSizeMode = FileDownloadSizeMode.ALL, fileSearchCriteria?: FileSearchCriteria, - includeDeaccessioned = false, + includeDeaccessioned = false ): Promise { return await this.filesRepository.getDatasetFilesTotalDownloadSize( datasetId, datasetVersionId, includeDeaccessioned, fileDownloadSizeMode, - fileSearchCriteria, - ); + fileSearchCriteria + ) } } diff --git a/src/files/domain/useCases/GetFile.ts b/src/files/domain/useCases/GetFile.ts index 6eb65991..dc44f745 100644 --- a/src/files/domain/useCases/GetFile.ts +++ b/src/files/domain/useCases/GetFile.ts @@ -1,6 +1,6 @@ -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { File } from '../models/File'; -import { DatasetNotNumberedVersion } from '../../../datasets'; +import { IFilesRepository } from '../repositories/IFilesRepository' +import { File } from '../models/File' +import { DatasetNotNumberedVersion } from '../../../datasets' export class GetFile { constructor(private readonly filesRepository: IFilesRepository) {} @@ -14,8 +14,8 @@ export class GetFile { */ async execute( fileId: number | string, - datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, + datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST ): Promise { - return await this.filesRepository.getFile(fileId, datasetVersionId); + return await this.filesRepository.getFile(fileId, datasetVersionId) } } diff --git a/src/files/domain/useCases/GetFileDataTables.ts b/src/files/domain/useCases/GetFileDataTables.ts index 07ffdeda..6e4987cf 100644 --- a/src/files/domain/useCases/GetFileDataTables.ts +++ b/src/files/domain/useCases/GetFileDataTables.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { FileDataTable } from '../models/FileDataTable'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' +import { FileDataTable } from '../models/FileDataTable' export class GetFileDataTables implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -16,6 +16,6 @@ export class GetFileDataTables implements UseCase { * @returns {Promise} */ async execute(fileId: number | string): Promise { - return await this.filesRepository.getFileDataTables(fileId); + return await this.filesRepository.getFileDataTables(fileId) } } diff --git a/src/files/domain/useCases/GetFileDownloadCount.ts b/src/files/domain/useCases/GetFileDownloadCount.ts index e527e1ef..18596c77 100644 --- a/src/files/domain/useCases/GetFileDownloadCount.ts +++ b/src/files/domain/useCases/GetFileDownloadCount.ts @@ -1,11 +1,11 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' export class GetFileDownloadCount implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -15,6 +15,6 @@ export class GetFileDownloadCount implements UseCase { * @returns {Promise} */ async execute(fileId: number | string): Promise { - return await this.filesRepository.getFileDownloadCount(fileId); + return await this.filesRepository.getFileDownloadCount(fileId) } } diff --git a/src/files/domain/useCases/GetFileUserPermissions.ts b/src/files/domain/useCases/GetFileUserPermissions.ts index ed2ee266..7780535b 100644 --- a/src/files/domain/useCases/GetFileUserPermissions.ts +++ b/src/files/domain/useCases/GetFileUserPermissions.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { FileUserPermissions } from '../models/FileUserPermissions'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' +import { FileUserPermissions } from '../models/FileUserPermissions' export class GetFileUserPermissions implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -16,6 +16,6 @@ export class GetFileUserPermissions implements UseCase { * @returns {Promise} */ async execute(fileId: number | string): Promise { - return await this.filesRepository.getFileUserPermissions(fileId); + return await this.filesRepository.getFileUserPermissions(fileId) } } diff --git a/src/files/index.ts b/src/files/index.ts index 45b8f270..d5abc913 100644 --- a/src/files/index.ts +++ b/src/files/index.ts @@ -1,21 +1,21 @@ -import { FilesRepository } from './infra/repositories/FilesRepository'; -import { GetDatasetFiles } from './domain/useCases/GetDatasetFiles'; -import { GetDatasetFileCounts } from './domain/useCases/GetDatasetFileCounts'; -import { GetFileDownloadCount } from './domain/useCases/GetFileDownloadCount'; -import { GetFileUserPermissions } from './domain/useCases/GetFileUserPermissions'; -import { GetFileDataTables } from './domain/useCases/GetFileDataTables'; -import { GetDatasetFilesTotalDownloadSize } from './domain/useCases/GetDatasetFilesTotalDownloadSize'; -import { GetFile } from './domain/useCases/GetFile'; +import { FilesRepository } from './infra/repositories/FilesRepository' +import { GetDatasetFiles } from './domain/useCases/GetDatasetFiles' +import { GetDatasetFileCounts } from './domain/useCases/GetDatasetFileCounts' +import { GetFileDownloadCount } from './domain/useCases/GetFileDownloadCount' +import { GetFileUserPermissions } from './domain/useCases/GetFileUserPermissions' +import { GetFileDataTables } from './domain/useCases/GetFileDataTables' +import { GetDatasetFilesTotalDownloadSize } from './domain/useCases/GetDatasetFilesTotalDownloadSize' +import { GetFile } from './domain/useCases/GetFile' -const filesRepository = new FilesRepository(); +const filesRepository = new FilesRepository() -const getDatasetFiles = new GetDatasetFiles(filesRepository); -const getDatasetFileCounts = new GetDatasetFileCounts(filesRepository); -const getFileDownloadCount = new GetFileDownloadCount(filesRepository); -const getFileUserPermissions = new GetFileUserPermissions(filesRepository); -const getFileDataTables = new GetFileDataTables(filesRepository); -const getDatasetFilesTotalDownloadSize = new GetDatasetFilesTotalDownloadSize(filesRepository); -const getFile = new GetFile(filesRepository); +const getDatasetFiles = new GetDatasetFiles(filesRepository) +const getDatasetFileCounts = new GetDatasetFileCounts(filesRepository) +const getFileDownloadCount = new GetFileDownloadCount(filesRepository) +const getFileUserPermissions = new GetFileUserPermissions(filesRepository) +const getFileDataTables = new GetFileDataTables(filesRepository) +const getDatasetFilesTotalDownloadSize = new GetDatasetFilesTotalDownloadSize(filesRepository) +const getFile = new GetFile(filesRepository) export { getDatasetFiles, @@ -24,18 +24,22 @@ export { getFileDataTables, getDatasetFileCounts, getDatasetFilesTotalDownloadSize, - getFile, -}; + getFile +} -export { File, FileEmbargo, FileChecksum } from './domain/models/File'; -export { FileUserPermissions } from './domain/models/FileUserPermissions'; -export { FileSearchCriteria, FileOrderCriteria, FileAccessStatus } from './domain/models/FileCriteria'; +export { File, FileEmbargo, FileChecksum } from './domain/models/File' +export { FileUserPermissions } from './domain/models/FileUserPermissions' +export { + FileSearchCriteria, + FileOrderCriteria, + FileAccessStatus +} from './domain/models/FileCriteria' export { FileCounts, FileContentTypeCount, FileAccessStatusCount, - FileCategoryNameCount, -} from './domain/models/FileCounts'; + FileCategoryNameCount +} from './domain/models/FileCounts' export { FileDataTable, FileDataVariable, @@ -44,7 +48,7 @@ export { FileDataVariableCategoryMetadata, FileDataVariableCategory, FileDataVariableIntervalType, - FileDataVariableFormatType, -} from './domain/models/FileDataTable'; -export { FileDownloadSizeMode } from './domain/models/FileDownloadSizeMode'; -export { FilesSubset } from './domain/models/FilesSubset'; + FileDataVariableFormatType +} from './domain/models/FileDataTable' +export { FileDownloadSizeMode } from './domain/models/FileDownloadSizeMode' +export { FilesSubset } from './domain/models/FilesSubset' diff --git a/src/files/infra/repositories/FilesRepository.ts b/src/files/infra/repositories/FilesRepository.ts index dff4031b..0940706a 100644 --- a/src/files/infra/repositories/FilesRepository.ts +++ b/src/files/infra/repositories/FilesRepository.ts @@ -1,44 +1,47 @@ -import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'; -import { IFilesRepository } from '../../domain/repositories/IFilesRepository'; -import { File } from '../../domain/models/File'; -import { transformFileResponseToFile, transformFilesResponseToFilesSubset } from './transformers/fileTransformers'; -import { FilesSubset } from '../../domain/models/FilesSubset'; -import { FileDataTable } from '../../domain/models/FileDataTable'; -import { transformDataTablesResponseToDataTables } from './transformers/fileDataTableTransformers'; -import { FileUserPermissions } from '../../domain/models/FileUserPermissions'; -import { transformFileUserPermissionsResponseToFileUserPermissions } from './transformers/fileUserPermissionsTransformers'; -import { FileSearchCriteria, FileOrderCriteria } from '../../domain/models/FileCriteria'; -import { FileCounts } from '../../domain/models/FileCounts'; -import { transformFileCountsResponseToFileCounts } from './transformers/fileCountsTransformers'; -import { FileDownloadSizeMode } from '../../domain/models/FileDownloadSizeMode'; -import { DatasetNotNumberedVersion } from '../../../datasets'; +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IFilesRepository } from '../../domain/repositories/IFilesRepository' +import { File } from '../../domain/models/File' +import { + transformFileResponseToFile, + transformFilesResponseToFilesSubset +} from './transformers/fileTransformers' +import { FilesSubset } from '../../domain/models/FilesSubset' +import { FileDataTable } from '../../domain/models/FileDataTable' +import { transformDataTablesResponseToDataTables } from './transformers/fileDataTableTransformers' +import { FileUserPermissions } from '../../domain/models/FileUserPermissions' +import { transformFileUserPermissionsResponseToFileUserPermissions } from './transformers/fileUserPermissionsTransformers' +import { FileSearchCriteria, FileOrderCriteria } from '../../domain/models/FileCriteria' +import { FileCounts } from '../../domain/models/FileCounts' +import { transformFileCountsResponseToFileCounts } from './transformers/fileCountsTransformers' +import { FileDownloadSizeMode } from '../../domain/models/FileDownloadSizeMode' +import { DatasetNotNumberedVersion } from '../../../datasets' export interface GetFilesQueryParams { - includeDeaccessioned: boolean; - limit?: number; - offset?: number; - orderCriteria?: string; - contentType?: string; - accessStatus?: string; - categoryName?: string; - tabularTagName?: string; - searchText?: string; + includeDeaccessioned: boolean + limit?: number + offset?: number + orderCriteria?: string + contentType?: string + accessStatus?: string + categoryName?: string + tabularTagName?: string + searchText?: string } export interface GetFilesTotalDownloadSizeQueryParams { - includeDeaccessioned: boolean; - mode?: string; - contentType?: string; - accessStatus?: string; - categoryName?: string; - tabularTagName?: string; - searchText?: string; + includeDeaccessioned: boolean + mode?: string + contentType?: string + accessStatus?: string + categoryName?: string + tabularTagName?: string + searchText?: string } export class FilesRepository extends ApiRepository implements IFilesRepository { - private readonly datasetsResourceName: string = 'datasets'; - private readonly filesResourceName: string = 'files'; - private readonly accessResourceName: string = 'access/datafile'; + private readonly datasetsResourceName: string = 'datasets' + private readonly filesResourceName: string = 'files' + private readonly accessResourceName: string = 'access/datafile' public async getDatasetFiles( datasetId: number | string, @@ -47,53 +50,61 @@ export class FilesRepository extends ApiRepository implements IFilesRepository { fileOrderCriteria: FileOrderCriteria, limit?: number, offset?: number, - fileSearchCriteria?: FileSearchCriteria, + fileSearchCriteria?: FileSearchCriteria ): Promise { const queryParams: GetFilesQueryParams = { includeDeaccessioned: includeDeaccessioned, - orderCriteria: fileOrderCriteria.toString(), - }; + orderCriteria: fileOrderCriteria.toString() + } if (limit !== undefined) { - queryParams.limit = limit; + queryParams.limit = limit } if (offset !== undefined) { - queryParams.offset = offset; + queryParams.offset = offset } if (fileSearchCriteria !== undefined) { - this.applyFileSearchCriteriaToQueryParams(queryParams, fileSearchCriteria); + this.applyFileSearchCriteriaToQueryParams(queryParams, fileSearchCriteria) } return this.doGet( - this.buildApiEndpoint(this.datasetsResourceName, `versions/${datasetVersionId}/files`, datasetId), + this.buildApiEndpoint( + this.datasetsResourceName, + `versions/${datasetVersionId}/files`, + datasetId + ), true, - queryParams, + queryParams ) .then((response) => transformFilesResponseToFilesSubset(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getDatasetFileCounts( datasetId: string | number, datasetVersionId: string, includeDeaccessioned: boolean, - fileSearchCriteria?: FileSearchCriteria, + fileSearchCriteria?: FileSearchCriteria ): Promise { const queryParams: GetFilesQueryParams = { - includeDeaccessioned: includeDeaccessioned, - }; + includeDeaccessioned: includeDeaccessioned + } if (fileSearchCriteria !== undefined) { - this.applyFileSearchCriteriaToQueryParams(queryParams, fileSearchCriteria); + this.applyFileSearchCriteriaToQueryParams(queryParams, fileSearchCriteria) } return this.doGet( - this.buildApiEndpoint(this.datasetsResourceName, `versions/${datasetVersionId}/files/counts`, datasetId), + this.buildApiEndpoint( + this.datasetsResourceName, + `versions/${datasetVersionId}/files/counts`, + datasetId + ), true, - queryParams, + queryParams ) .then((response) => transformFileCountsResponseToFileCounts(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getDatasetFilesTotalDownloadSize( @@ -101,89 +112,96 @@ export class FilesRepository extends ApiRepository implements IFilesRepository { datasetVersionId: string, includeDeaccessioned: boolean, fileDownloadSizeMode: FileDownloadSizeMode, - fileSearchCriteria?: FileSearchCriteria, + fileSearchCriteria?: FileSearchCriteria ): Promise { const queryParams: GetFilesTotalDownloadSizeQueryParams = { includeDeaccessioned: includeDeaccessioned, - mode: fileDownloadSizeMode.toString(), - }; + mode: fileDownloadSizeMode.toString() + } if (fileSearchCriteria !== undefined) { - this.applyFileSearchCriteriaToQueryParams(queryParams, fileSearchCriteria); + this.applyFileSearchCriteriaToQueryParams(queryParams, fileSearchCriteria) } return this.doGet( - this.buildApiEndpoint(this.datasetsResourceName, `versions/${datasetVersionId}/downloadsize`, datasetId), + this.buildApiEndpoint( + this.datasetsResourceName, + `versions/${datasetVersionId}/downloadsize`, + datasetId + ), true, - queryParams, + queryParams ) .then((response) => response.data.data.storageSize) .catch((error) => { - throw error; - }); + throw error + }) } public async getFileDownloadCount(fileId: number | string): Promise { return this.doGet(this.buildApiEndpoint(this.filesResourceName, `downloadCount`, fileId), true) .then((response) => response.data.data.message as number) .catch((error) => { - throw error; - }); + throw error + }) } public async getFileUserPermissions(fileId: number | string): Promise { - return this.doGet(this.buildApiEndpoint(this.accessResourceName, `userPermissions`, fileId), true) + return this.doGet( + this.buildApiEndpoint(this.accessResourceName, `userPermissions`, fileId), + true + ) .then((response) => transformFileUserPermissionsResponseToFileUserPermissions(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getFileDataTables(fileId: string | number): Promise { return this.doGet(this.buildApiEndpoint(this.filesResourceName, `dataTables`, fileId), true) .then((response) => transformDataTablesResponseToDataTables(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getFile(fileId: number | string, datasetVersionId: string): Promise { return this.doGet(this.getFileEndpoint(fileId, datasetVersionId), true) .then((response) => transformFileResponseToFile(response)) .catch((error) => { - throw error; - }); + throw error + }) } private getFileEndpoint(fileId: number | string, datasetVersionId: string): string { if (datasetVersionId === DatasetNotNumberedVersion.DRAFT) { - return this.buildApiEndpoint(this.filesResourceName, 'draft', fileId); + return this.buildApiEndpoint(this.filesResourceName, 'draft', fileId) } if (datasetVersionId === DatasetNotNumberedVersion.LATEST) { - return this.buildApiEndpoint(this.filesResourceName, '', fileId); + return this.buildApiEndpoint(this.filesResourceName, '', fileId) } // TODO: Implement once it is supported by the API https://github.com/IQSS/dataverse/issues/10280 throw new Error( - `Requesting a file by its dataset version is not yet supported. Requested version: ${datasetVersionId}. Please try using the :latest or :draft version instead.`, - ); + `Requesting a file by its dataset version is not yet supported. Requested version: ${datasetVersionId}. Please try using the :latest or :draft version instead.` + ) } private applyFileSearchCriteriaToQueryParams( queryParams: GetFilesQueryParams | GetFilesTotalDownloadSizeQueryParams, - fileSearchCriteria: FileSearchCriteria, + fileSearchCriteria: FileSearchCriteria ) { if (fileSearchCriteria.accessStatus !== undefined) { - queryParams.accessStatus = fileSearchCriteria.accessStatus.toString(); + queryParams.accessStatus = fileSearchCriteria.accessStatus.toString() } if (fileSearchCriteria.categoryName !== undefined) { - queryParams.categoryName = fileSearchCriteria.categoryName; + queryParams.categoryName = fileSearchCriteria.categoryName } if (fileSearchCriteria.tabularTagName !== undefined) { - queryParams.tabularTagName = fileSearchCriteria.tabularTagName; + queryParams.tabularTagName = fileSearchCriteria.tabularTagName } if (fileSearchCriteria.contentType !== undefined) { - queryParams.contentType = fileSearchCriteria.contentType; + queryParams.contentType = fileSearchCriteria.contentType } if (fileSearchCriteria.searchText !== undefined) { - queryParams.searchText = fileSearchCriteria.searchText; + queryParams.searchText = fileSearchCriteria.searchText } } } diff --git a/src/files/infra/repositories/transformers/fileCountsTransformers.ts b/src/files/infra/repositories/transformers/fileCountsTransformers.ts index fe4f7f60..0d7a57aa 100644 --- a/src/files/infra/repositories/transformers/fileCountsTransformers.ts +++ b/src/files/infra/repositories/transformers/fileCountsTransformers.ts @@ -1,57 +1,63 @@ -import { AxiosResponse } from 'axios'; +import { AxiosResponse } from 'axios' import { FileCounts, FileContentTypeCount, FileCategoryNameCount, - FileAccessStatusCount, -} from '../../../domain/models/FileCounts'; -import { FileAccessStatus } from '../../../domain/models/FileCriteria'; + FileAccessStatusCount +} from '../../../domain/models/FileCounts' +import { FileAccessStatus } from '../../../domain/models/FileCriteria' export const transformFileCountsResponseToFileCounts = (response: AxiosResponse): FileCounts => { - const fileCountsPayload = response.data.data; + const fileCountsPayload = response.data.data return { total: fileCountsPayload.total, perContentType: transformCountsPerContentTypePayload(fileCountsPayload.perContentType), perAccessStatus: transformCountsPerAccessStatusPayload(fileCountsPayload.perAccessStatus), - perCategoryName: transformCountsPerCategoryNamePayload(fileCountsPayload.perCategoryName), - }; -}; + perCategoryName: transformCountsPerCategoryNamePayload(fileCountsPayload.perCategoryName) + } +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const transformCountsPerContentTypePayload = (countsPerContentTypePayload: any): FileContentTypeCount[] => { - const fileContentTypeCounts: FileContentTypeCount[] = []; - const fileContentTypeCountKeys = Object.keys(countsPerContentTypePayload); +export const transformCountsPerContentTypePayload = ( + countsPerContentTypePayload: any +): FileContentTypeCount[] => { + const fileContentTypeCounts: FileContentTypeCount[] = [] + const fileContentTypeCountKeys = Object.keys(countsPerContentTypePayload) for (const fileContentTypeCountKey of fileContentTypeCountKeys) { fileContentTypeCounts.push({ contentType: fileContentTypeCountKey, - count: countsPerContentTypePayload[fileContentTypeCountKey], - }); + count: countsPerContentTypePayload[fileContentTypeCountKey] + }) } - return fileContentTypeCounts; -}; + return fileContentTypeCounts +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const transformCountsPerCategoryNamePayload = (countsPerCategoryNamePayload: any): FileCategoryNameCount[] => { - const fileCategoryNameCounts: FileCategoryNameCount[] = []; - const fileCategoryNameCountKeys = Object.keys(countsPerCategoryNamePayload); +export const transformCountsPerCategoryNamePayload = ( + countsPerCategoryNamePayload: any +): FileCategoryNameCount[] => { + const fileCategoryNameCounts: FileCategoryNameCount[] = [] + const fileCategoryNameCountKeys = Object.keys(countsPerCategoryNamePayload) for (const fileCategoryNameCountKey of fileCategoryNameCountKeys) { fileCategoryNameCounts.push({ categoryName: fileCategoryNameCountKey, - count: countsPerCategoryNamePayload[fileCategoryNameCountKey], - }); + count: countsPerCategoryNamePayload[fileCategoryNameCountKey] + }) } - return fileCategoryNameCounts; -}; + return fileCategoryNameCounts +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const transformCountsPerAccessStatusPayload = (countsPerAccessStatusPayload: any): FileAccessStatusCount[] => { - const fileAccessStatusCounts: FileAccessStatusCount[] = []; - const fileAccessStatusCountKeys = Object.keys(countsPerAccessStatusPayload); +export const transformCountsPerAccessStatusPayload = ( + countsPerAccessStatusPayload: any +): FileAccessStatusCount[] => { + const fileAccessStatusCounts: FileAccessStatusCount[] = [] + const fileAccessStatusCountKeys = Object.keys(countsPerAccessStatusPayload) for (const fileAccessStatusCountKey of fileAccessStatusCountKeys) { fileAccessStatusCounts.push({ accessStatus: fileAccessStatusCountKey as FileAccessStatus, - count: countsPerAccessStatusPayload[fileAccessStatusCountKey], - }); + count: countsPerAccessStatusPayload[fileAccessStatusCountKey] + }) } - return fileAccessStatusCounts; -}; + return fileAccessStatusCounts +} diff --git a/src/files/infra/repositories/transformers/fileDataTableTransformers.ts b/src/files/infra/repositories/transformers/fileDataTableTransformers.ts index 55ed3019..69b1a901 100644 --- a/src/files/infra/repositories/transformers/fileDataTableTransformers.ts +++ b/src/files/infra/repositories/transformers/fileDataTableTransformers.ts @@ -1,4 +1,4 @@ -import { AxiosResponse } from 'axios'; +import { AxiosResponse } from 'axios' import { FileDataTable, FileDataVariable, @@ -7,33 +7,37 @@ import { FileDataVariableMetadata, FileDataVariableInvalidRanges, FileDataVariableCategory, - FileDataVariableCategoryMetadata, -} from '../../../domain/models/FileDataTable'; + FileDataVariableCategoryMetadata +} from '../../../domain/models/FileDataTable' -export const transformDataTablesResponseToDataTables = (response: AxiosResponse): FileDataTable[] => { - const files: FileDataTable[] = []; - const fileDataTablesPayload = response.data.data; +export const transformDataTablesResponseToDataTables = ( + response: AxiosResponse +): FileDataTable[] => { + const files: FileDataTable[] = [] + const fileDataTablesPayload = response.data.data // eslint-disable-next-line @typescript-eslint/no-explicit-any fileDataTablesPayload.forEach(function (fileDataTablePayload: any) { - files.push(transformPayloadToFileDataTable(fileDataTablePayload)); - }); - return files; -}; + files.push(transformPayloadToFileDataTable(fileDataTablePayload)) + }) + return files +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToFileDataTable = (fileDataTablePayload: any): FileDataTable => { return { ...(fileDataTablePayload.varQuantity && { varQuantity: fileDataTablePayload.varQuantity }), ...(fileDataTablePayload.caseQuantity && { caseQuantity: fileDataTablePayload.caseQuantity }), - ...(fileDataTablePayload.recordsPerCase && { recordsPerCase: fileDataTablePayload.recordsPerCase }), + ...(fileDataTablePayload.recordsPerCase && { + recordsPerCase: fileDataTablePayload.recordsPerCase + }), UNF: fileDataTablePayload.UNF, - dataVariables: transformPayloadToDataVariables(fileDataTablePayload.dataVariables), - }; -}; + dataVariables: transformPayloadToDataVariables(fileDataTablePayload.dataVariables) + } +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToDataVariables = (fileDataVariablesPayload: any): FileDataVariable[] => { - const fileDataVariables: FileDataVariable[] = []; + const fileDataVariables: FileDataVariable[] = [] fileDataVariablesPayload.forEach(function (fileDataVariablePayload: any) { fileDataVariables.push({ id: fileDataVariablePayload.id, @@ -41,124 +45,155 @@ const transformPayloadToDataVariables = (fileDataVariablesPayload: any): FileDat ...(fileDataVariablePayload.label && { label: fileDataVariablePayload.label }), weighted: fileDataVariablePayload.weighted, ...(fileDataVariablePayload.variableIntervalType && { - variableIntervalType: fileDataVariablePayload.variableIntervalType as FileDataVariableIntervalType, + variableIntervalType: + fileDataVariablePayload.variableIntervalType as FileDataVariableIntervalType }), ...(fileDataVariablePayload.variableFormatType && { - variableFormatType: fileDataVariablePayload.variableFormatType as FileDataVariableFormatType, + variableFormatType: fileDataVariablePayload.variableFormatType as FileDataVariableFormatType + }), + ...(fileDataVariablePayload.formatCategory && { + formatCategory: fileDataVariablePayload.formatCategory }), - ...(fileDataVariablePayload.formatCategory && { formatCategory: fileDataVariablePayload.formatCategory }), ...(fileDataVariablePayload.format && { format: fileDataVariablePayload.format }), isOrderedCategorical: fileDataVariablePayload.isOrderedCategorical, fileOrder: fileDataVariablePayload.fileOrder, UNF: fileDataVariablePayload.UNF, ...(fileDataVariablePayload.fileStartPosition && { - fileStartPosition: fileDataVariablePayload.fileStartPosition, + fileStartPosition: fileDataVariablePayload.fileStartPosition + }), + ...(fileDataVariablePayload.fileEndPosition && { + fileEndPosition: fileDataVariablePayload.fileEndPosition }), - ...(fileDataVariablePayload.fileEndPosition && { fileEndPosition: fileDataVariablePayload.fileEndPosition }), ...(fileDataVariablePayload.recordSegmentNumber && { - recordSegmentNumber: fileDataVariablePayload.recordSegmentNumber, + recordSegmentNumber: fileDataVariablePayload.recordSegmentNumber }), ...(fileDataVariablePayload.numberOfDecimalPoints && { - numberOfDecimalPoints: fileDataVariablePayload.numberOfDecimalPoints, + numberOfDecimalPoints: fileDataVariablePayload.numberOfDecimalPoints }), ...(fileDataVariablePayload.variableMetadata && { - variableMetadata: transformPayloadToFileVariableMetadata(fileDataVariablePayload.variableMetadata), + variableMetadata: transformPayloadToFileVariableMetadata( + fileDataVariablePayload.variableMetadata + ) }), ...(fileDataVariablePayload.invalidRanges && { - invalidRanges: transformPayloadToDataVariableInvalidRanges(fileDataVariablePayload.invalidRanges), + invalidRanges: transformPayloadToDataVariableInvalidRanges( + fileDataVariablePayload.invalidRanges + ) }), ...(fileDataVariablePayload.summaryStatistics && { - summaryStatistics: fileDataVariablePayload.summaryStatistics, + summaryStatistics: fileDataVariablePayload.summaryStatistics }), ...(fileDataVariablePayload.variableCategories && { - variableCategories: transformPayloadToFileDataVariableCategories(fileDataVariablePayload.variableCategories), - }), - }); - }); - return fileDataVariables; -}; + variableCategories: transformPayloadToFileDataVariableCategories( + fileDataVariablePayload.variableCategories + ) + }) + }) + }) + return fileDataVariables +} // eslint-disable-next-line @typescript-eslint/no-explicit-any -const transformPayloadToFileVariableMetadata = (fileVariableMetadataPayload: any): FileDataVariableMetadata[] => { - const fileDataVariableMetadata: FileDataVariableMetadata[] = []; +const transformPayloadToFileVariableMetadata = ( + fileVariableMetadataPayload: any +): FileDataVariableMetadata[] => { + const fileDataVariableMetadata: FileDataVariableMetadata[] = [] fileVariableMetadataPayload.forEach(function (fileVariableMetadataElementPayload: any) { fileDataVariableMetadata.push({ id: fileVariableMetadataElementPayload.id, metadataId: fileVariableMetadataElementPayload.metadataId, - ...(fileVariableMetadataElementPayload.label && { label: fileVariableMetadataElementPayload.label }), + ...(fileVariableMetadataElementPayload.label && { + label: fileVariableMetadataElementPayload.label + }), isWeightVar: fileVariableMetadataElementPayload.isWeightVar, isWeighted: fileVariableMetadataElementPayload.isWeighted, ...(fileVariableMetadataElementPayload.weightVariableId && { - weightVariableId: fileVariableMetadataElementPayload.weightVariableId, + weightVariableId: fileVariableMetadataElementPayload.weightVariableId }), ...(fileVariableMetadataElementPayload.literalQuestion && { - literalQuestion: fileVariableMetadataElementPayload.literalQuestion, + literalQuestion: fileVariableMetadataElementPayload.literalQuestion }), ...(fileVariableMetadataElementPayload.interviewInstruction && { - interviewInstruction: fileVariableMetadataElementPayload.interviewInstruction, + interviewInstruction: fileVariableMetadataElementPayload.interviewInstruction }), ...(fileVariableMetadataElementPayload.postQuestion && { - postQuestion: fileVariableMetadataElementPayload.postQuestion, + postQuestion: fileVariableMetadataElementPayload.postQuestion + }), + ...(fileVariableMetadataElementPayload.universe && { + universe: fileVariableMetadataElementPayload.universe + }), + ...(fileVariableMetadataElementPayload.notes && { + notes: fileVariableMetadataElementPayload.notes }), - ...(fileVariableMetadataElementPayload.universe && { universe: fileVariableMetadataElementPayload.universe }), - ...(fileVariableMetadataElementPayload.notes && { notes: fileVariableMetadataElementPayload.notes }), categoryMetadatas: transformPayloadToFileDataVariableCategoryMetadatas( - fileVariableMetadataElementPayload.categoryMetadatas, - ), - }); - }); - return fileDataVariableMetadata; -}; + fileVariableMetadataElementPayload.categoryMetadatas + ) + }) + }) + return fileDataVariableMetadata +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToFileDataVariableCategoryMetadatas = ( - categoryMetadatasPayload: any, + categoryMetadatasPayload: any ): FileDataVariableCategoryMetadata[] => { - const fileDataVariableCategoryMetadatas: FileDataVariableCategoryMetadata[] = []; + const fileDataVariableCategoryMetadatas: FileDataVariableCategoryMetadata[] = [] categoryMetadatasPayload.forEach(function (categoryMetadataPayload: any) { fileDataVariableCategoryMetadatas.push({ ...(categoryMetadataPayload.wFreq && { wFreq: categoryMetadataPayload.wFreq }), - ...(categoryMetadataPayload.categoryValue && { categoryValue: categoryMetadataPayload.categoryValue }), - }); - }); - return fileDataVariableCategoryMetadatas; -}; + ...(categoryMetadataPayload.categoryValue && { + categoryValue: categoryMetadataPayload.categoryValue + }) + }) + }) + return fileDataVariableCategoryMetadatas +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToDataVariableInvalidRanges = ( - dataVariableInvalidRangesPayload: any, + dataVariableInvalidRangesPayload: any ): FileDataVariableInvalidRanges[] => { - const dataVariableInvalidRanges: FileDataVariableInvalidRanges[] = []; + const dataVariableInvalidRanges: FileDataVariableInvalidRanges[] = [] dataVariableInvalidRangesPayload.forEach(function (dataVariableInvalidRangePayload: any) { dataVariableInvalidRanges.push({ - ...(dataVariableInvalidRangePayload.beginValue && { beginValue: dataVariableInvalidRangePayload.beginValue }), + ...(dataVariableInvalidRangePayload.beginValue && { + beginValue: dataVariableInvalidRangePayload.beginValue + }), hasBeginValueType: dataVariableInvalidRangePayload.hasBeginValueType, isBeginValueTypePoint: dataVariableInvalidRangePayload.isBeginValueTypePoint, isBeginValueTypeMin: dataVariableInvalidRangePayload.isBeginValueTypeMin, isBeginValueTypeMinExcl: dataVariableInvalidRangePayload.isBeginValueTypeMinExcl, isBeginValueTypeMax: dataVariableInvalidRangePayload.isBeginValueTypeMax, isBeginValueTypeMaxExcl: dataVariableInvalidRangePayload.isBeginValueTypeMaxExcl, - ...(dataVariableInvalidRangePayload.endValue && { endValue: dataVariableInvalidRangePayload.endValue }), + ...(dataVariableInvalidRangePayload.endValue && { + endValue: dataVariableInvalidRangePayload.endValue + }), hasEndValueType: dataVariableInvalidRangePayload.hasEndValueType, endValueTypeMax: dataVariableInvalidRangePayload.endValueTypeMax, - endValueTypeMaxExcl: dataVariableInvalidRangePayload.endValueTypeMaxExcl, - }); - }); - return dataVariableInvalidRanges; -}; + endValueTypeMaxExcl: dataVariableInvalidRangePayload.endValueTypeMaxExcl + }) + }) + return dataVariableInvalidRanges +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToFileDataVariableCategories = ( - fileDataVariableCategoriesPayload: any, + fileDataVariableCategoriesPayload: any ): FileDataVariableCategory[] => { - const fileDataVariableCategories: FileDataVariableCategory[] = []; + const fileDataVariableCategories: FileDataVariableCategory[] = [] fileDataVariableCategoriesPayload.forEach(function (fileDataVariableCategoryPayload: any) { fileDataVariableCategories.push({ - ...(fileDataVariableCategoryPayload.label && { label: fileDataVariableCategoryPayload.label }), - ...(fileDataVariableCategoryPayload.value && { value: fileDataVariableCategoryPayload.value }), + ...(fileDataVariableCategoryPayload.label && { + label: fileDataVariableCategoryPayload.label + }), + ...(fileDataVariableCategoryPayload.value && { + value: fileDataVariableCategoryPayload.value + }), isMissing: fileDataVariableCategoryPayload.isMissing, - ...(fileDataVariableCategoryPayload.frequency && { frequency: fileDataVariableCategoryPayload.frequency }), - }); - }); - return fileDataVariableCategories; -}; + ...(fileDataVariableCategoryPayload.frequency && { + frequency: fileDataVariableCategoryPayload.frequency + }) + }) + }) + return fileDataVariableCategories +} diff --git a/src/files/infra/repositories/transformers/fileTransformers.ts b/src/files/infra/repositories/transformers/fileTransformers.ts index 04821fa6..d1cb81ee 100644 --- a/src/files/infra/repositories/transformers/fileTransformers.ts +++ b/src/files/infra/repositories/transformers/fileTransformers.ts @@ -1,25 +1,25 @@ -import { File, FileEmbargo, FileChecksum } from '../../../domain/models/File'; -import { AxiosResponse } from 'axios'; -import { FilesSubset } from '../../../domain/models/FilesSubset'; +import { File, FileEmbargo, FileChecksum } from '../../../domain/models/File' +import { AxiosResponse } from 'axios' +import { FilesSubset } from '../../../domain/models/FilesSubset' export const transformFilesResponseToFilesSubset = (response: AxiosResponse): FilesSubset => { - const filesPayload = response.data.data; - const files: File[] = []; + const filesPayload = response.data.data + const files: File[] = [] // eslint-disable-next-line @typescript-eslint/no-explicit-any filesPayload.forEach(function (filePayload: any) { - files.push(transformFilePayloadToFile(filePayload)); - }); + files.push(transformFilePayloadToFile(filePayload)) + }) return { files: files, - totalFilesCount: response.data.totalCount, - }; -}; + totalFilesCount: response.data.totalCount + } +} export const transformFileResponseToFile = (response: AxiosResponse): File => { - const filePayload = response.data.data; - return transformFilePayloadToFile(filePayload); -}; + const filePayload = response.data.data + return transformFilePayloadToFile(filePayload) +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformFilePayloadToFile = (filePayload: any): File => { @@ -33,46 +33,68 @@ const transformFilePayloadToFile = (filePayload: any): File => { ...(filePayload.dataFile.description && { description: filePayload.dataFile.description }), restricted: filePayload.restricted, latestRestricted: filePayload.dataFile.restricted, - ...(filePayload.dataFile.directoryLabel && { directoryLabel: filePayload.dataFile.directoryLabel }), - ...(filePayload.dataFile.datasetVersionId && { datasetVersionId: filePayload.dataFile.datasetVersionId }), + ...(filePayload.dataFile.directoryLabel && { + directoryLabel: filePayload.dataFile.directoryLabel + }), + ...(filePayload.dataFile.datasetVersionId && { + datasetVersionId: filePayload.dataFile.datasetVersionId + }), ...(filePayload.dataFile.categories && { categories: filePayload.dataFile.categories }), contentType: filePayload.dataFile.contentType, friendlyType: filePayload.dataFile.friendlyType, - ...(filePayload.dataFile.embargo && { embargo: transformEmbargoPayloadToEmbargo(filePayload.dataFile.embargo) }), - ...(filePayload.dataFile.storageIdentifier && { storageIdentifier: filePayload.dataFile.storageIdentifier }), - ...(filePayload.dataFile.originalFormat && { originalFormat: filePayload.dataFile.originalFormat }), - ...(filePayload.dataFile.originalFormatLabel && { originalFormatLabel: filePayload.dataFile.originalFormatLabel }), + ...(filePayload.dataFile.embargo && { + embargo: transformEmbargoPayloadToEmbargo(filePayload.dataFile.embargo) + }), + ...(filePayload.dataFile.storageIdentifier && { + storageIdentifier: filePayload.dataFile.storageIdentifier + }), + ...(filePayload.dataFile.originalFormat && { + originalFormat: filePayload.dataFile.originalFormat + }), + ...(filePayload.dataFile.originalFormatLabel && { + originalFormatLabel: filePayload.dataFile.originalFormatLabel + }), ...(filePayload.dataFile.originalSize && { originalSize: filePayload.dataFile.originalSize }), ...(filePayload.dataFile.originalName && { originalName: filePayload.dataFile.originalName }), ...(filePayload.dataFile.UNF && { UNF: filePayload.dataFile.UNF }), - ...(filePayload.dataFile.rootDataFileId && { rootDataFileId: filePayload.dataFile.rootDataFileId }), - ...(filePayload.dataFile.previousDataFileId && { previousDataFileId: filePayload.dataFile.previousDataFileId }), + ...(filePayload.dataFile.rootDataFileId && { + rootDataFileId: filePayload.dataFile.rootDataFileId + }), + ...(filePayload.dataFile.previousDataFileId && { + previousDataFileId: filePayload.dataFile.previousDataFileId + }), ...(filePayload.dataFile.md5 && { md5: filePayload.dataFile.md5 }), ...(filePayload.dataFile.checksum && { - checksum: transformChecksumPayloadToChecksum(filePayload.dataFile.checksum), + checksum: transformChecksumPayloadToChecksum(filePayload.dataFile.checksum) }), ...(filePayload.dataFile.fileMetadataId && { metadataId: filePayload.dataFile.fileMetadataId }), ...(filePayload.dataFile.tabularTags && { tabularTags: filePayload.dataFile.tabularTags }), - ...(filePayload.dataFile.creationDate && { creationDate: new Date(filePayload.dataFile.creationDate) }), - ...(filePayload.dataFile.publicationDate && { publicationDate: new Date(filePayload.dataFile.publicationDate) }), + ...(filePayload.dataFile.creationDate && { + creationDate: new Date(filePayload.dataFile.creationDate) + }), + ...(filePayload.dataFile.publicationDate && { + publicationDate: new Date(filePayload.dataFile.publicationDate) + }), deleted: filePayload.dataFile.deleted, tabularData: filePayload.dataFile.tabularData, - ...(filePayload.dataFile.fileAccessRequest && { fileAccessRequest: filePayload.dataFile.fileAccessRequest }), - }; -}; + ...(filePayload.dataFile.fileAccessRequest && { + fileAccessRequest: filePayload.dataFile.fileAccessRequest + }) + } +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformEmbargoPayloadToEmbargo = (embargoPayload: any): FileEmbargo => { return { dateAvailable: new Date(embargoPayload.dateAvailable), - ...(embargoPayload.reason && { reason: embargoPayload.reason }), - }; -}; + ...(embargoPayload.reason && { reason: embargoPayload.reason }) + } +} // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformChecksumPayloadToChecksum = (checksumPayload: any): FileChecksum => { return { type: checksumPayload.type, - value: checksumPayload.value, - }; -}; + value: checksumPayload.value + } +} diff --git a/src/files/infra/repositories/transformers/fileUserPermissionsTransformers.ts b/src/files/infra/repositories/transformers/fileUserPermissionsTransformers.ts index c2896a16..f474f0dc 100644 --- a/src/files/infra/repositories/transformers/fileUserPermissionsTransformers.ts +++ b/src/files/infra/repositories/transformers/fileUserPermissionsTransformers.ts @@ -1,13 +1,13 @@ -import { AxiosResponse } from 'axios'; -import { FileUserPermissions } from '../../../domain/models/FileUserPermissions'; +import { AxiosResponse } from 'axios' +import { FileUserPermissions } from '../../../domain/models/FileUserPermissions' export const transformFileUserPermissionsResponseToFileUserPermissions = ( - response: AxiosResponse, + response: AxiosResponse ): FileUserPermissions => { - const fileUserPermissionsPayload = response.data.data; + const fileUserPermissionsPayload = response.data.data return { canDownloadFile: fileUserPermissionsPayload.canDownloadFile, canManageFilePermissions: fileUserPermissionsPayload.canManageFilePermissions, - canEditOwnerDataset: fileUserPermissionsPayload.canEditOwnerDataset, - }; -}; + canEditOwnerDataset: fileUserPermissionsPayload.canEditOwnerDataset + } +} diff --git a/src/index.ts b/src/index.ts index d5479039..4d702cb5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ -export * from './core'; -export * from './info'; -export * from './users'; -export * from './auth'; -export * from './datasets'; -export * from './metadataBlocks'; -export * from './files'; +export * from './core' +export * from './info' +export * from './users' +export * from './auth' +export * from './datasets' +export * from './metadataBlocks' +export * from './files' diff --git a/src/info/domain/models/DataverseVersion.ts b/src/info/domain/models/DataverseVersion.ts index 14b6b993..30450d19 100644 --- a/src/info/domain/models/DataverseVersion.ts +++ b/src/info/domain/models/DataverseVersion.ts @@ -1,4 +1,4 @@ export interface DataverseVersion { - number: string; - build: string; + number: string + build: string } diff --git a/src/info/domain/repositories/IDataverseInfoRepository.ts b/src/info/domain/repositories/IDataverseInfoRepository.ts index c9e1c2d1..2adbb89a 100644 --- a/src/info/domain/repositories/IDataverseInfoRepository.ts +++ b/src/info/domain/repositories/IDataverseInfoRepository.ts @@ -1,7 +1,7 @@ -import { DataverseVersion } from '../models/DataverseVersion'; +import { DataverseVersion } from '../models/DataverseVersion' export interface IDataverseInfoRepository { - getDataverseVersion(): Promise; - getZipDownloadLimit(): Promise; - getMaxEmbargoDurationInMonths(): Promise; + getDataverseVersion(): Promise + getZipDownloadLimit(): Promise + getMaxEmbargoDurationInMonths(): Promise } diff --git a/src/info/domain/useCases/GetDataverseVersion.ts b/src/info/domain/useCases/GetDataverseVersion.ts index 51455549..40fb5398 100644 --- a/src/info/domain/useCases/GetDataverseVersion.ts +++ b/src/info/domain/useCases/GetDataverseVersion.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'; -import { DataverseVersion } from '../models/DataverseVersion'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository' +import { DataverseVersion } from '../models/DataverseVersion' export class GetDataverseVersion implements UseCase { - private dataverseInfoRepository: IDataverseInfoRepository; + private dataverseInfoRepository: IDataverseInfoRepository constructor(dataverseInfoRepository: IDataverseInfoRepository) { - this.dataverseInfoRepository = dataverseInfoRepository; + this.dataverseInfoRepository = dataverseInfoRepository } /** @@ -15,6 +15,6 @@ export class GetDataverseVersion implements UseCase { * @returns {Promise} */ async execute(): Promise { - return await this.dataverseInfoRepository.getDataverseVersion(); + return await this.dataverseInfoRepository.getDataverseVersion() } } diff --git a/src/info/domain/useCases/GetMaxEmbargoDurationInMonths.ts b/src/info/domain/useCases/GetMaxEmbargoDurationInMonths.ts index 3c3b62be..cec8304f 100644 --- a/src/info/domain/useCases/GetMaxEmbargoDurationInMonths.ts +++ b/src/info/domain/useCases/GetMaxEmbargoDurationInMonths.ts @@ -1,11 +1,11 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository' export class GetMaxEmbargoDurationInMonths implements UseCase { - private dataverseInfoRepository: IDataverseInfoRepository; + private dataverseInfoRepository: IDataverseInfoRepository constructor(dataverseInfoRepository: IDataverseInfoRepository) { - this.dataverseInfoRepository = dataverseInfoRepository; + this.dataverseInfoRepository = dataverseInfoRepository } /** @@ -14,6 +14,6 @@ export class GetMaxEmbargoDurationInMonths implements UseCase { * @returns {Promise} */ async execute(): Promise { - return await this.dataverseInfoRepository.getMaxEmbargoDurationInMonths(); + return await this.dataverseInfoRepository.getMaxEmbargoDurationInMonths() } } diff --git a/src/info/domain/useCases/GetZipDownloadLimit.ts b/src/info/domain/useCases/GetZipDownloadLimit.ts index aa93bb6b..fb2eb626 100644 --- a/src/info/domain/useCases/GetZipDownloadLimit.ts +++ b/src/info/domain/useCases/GetZipDownloadLimit.ts @@ -1,11 +1,11 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository' export class GetZipDownloadLimit implements UseCase { - private dataverseInfoRepository: IDataverseInfoRepository; + private dataverseInfoRepository: IDataverseInfoRepository constructor(dataverseInfoRepository: IDataverseInfoRepository) { - this.dataverseInfoRepository = dataverseInfoRepository; + this.dataverseInfoRepository = dataverseInfoRepository } /** @@ -14,6 +14,6 @@ export class GetZipDownloadLimit implements UseCase { * @returns {Promise} */ async execute(): Promise { - return await this.dataverseInfoRepository.getZipDownloadLimit(); + return await this.dataverseInfoRepository.getZipDownloadLimit() } } diff --git a/src/info/index.ts b/src/info/index.ts index af30081b..32513ad1 100644 --- a/src/info/index.ts +++ b/src/info/index.ts @@ -1,12 +1,12 @@ -import { DataverseInfoRepository } from './infra/repositories/DataverseInfoRepository'; -import { GetDataverseVersion } from './domain/useCases/GetDataverseVersion'; -import { GetZipDownloadLimit } from './domain/useCases/GetZipDownloadLimit'; -import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDurationInMonths'; +import { DataverseInfoRepository } from './infra/repositories/DataverseInfoRepository' +import { GetDataverseVersion } from './domain/useCases/GetDataverseVersion' +import { GetZipDownloadLimit } from './domain/useCases/GetZipDownloadLimit' +import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDurationInMonths' -const dataverseInfoRepository = new DataverseInfoRepository(); +const dataverseInfoRepository = new DataverseInfoRepository() -const getDataverseVersion = new GetDataverseVersion(dataverseInfoRepository); -const getZipDownloadLimit = new GetZipDownloadLimit(dataverseInfoRepository); -const getMaxEmbargoDurationInMonths = new GetMaxEmbargoDurationInMonths(dataverseInfoRepository); +const getDataverseVersion = new GetDataverseVersion(dataverseInfoRepository) +const getZipDownloadLimit = new GetZipDownloadLimit(dataverseInfoRepository) +const getMaxEmbargoDurationInMonths = new GetMaxEmbargoDurationInMonths(dataverseInfoRepository) -export { getDataverseVersion, getZipDownloadLimit, getMaxEmbargoDurationInMonths }; +export { getDataverseVersion, getZipDownloadLimit, getMaxEmbargoDurationInMonths } diff --git a/src/info/infra/repositories/DataverseInfoRepository.ts b/src/info/infra/repositories/DataverseInfoRepository.ts index ad3c83e3..963401d4 100644 --- a/src/info/infra/repositories/DataverseInfoRepository.ts +++ b/src/info/infra/repositories/DataverseInfoRepository.ts @@ -1,40 +1,42 @@ -import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'; -import { IDataverseInfoRepository } from '../../domain/repositories/IDataverseInfoRepository'; -import { DataverseVersion } from '../../domain/models/DataverseVersion'; -import { AxiosResponse } from 'axios'; +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IDataverseInfoRepository } from '../../domain/repositories/IDataverseInfoRepository' +import { DataverseVersion } from '../../domain/models/DataverseVersion' +import { AxiosResponse } from 'axios' export class DataverseInfoRepository extends ApiRepository implements IDataverseInfoRepository { - private readonly infoResourceName: string = 'info'; + private readonly infoResourceName: string = 'info' public async getDataverseVersion(): Promise { return this.doGet(this.buildApiEndpoint(this.infoResourceName, `version`)) .then((response) => this.getVersionFromResponse(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async getZipDownloadLimit(): Promise { return this.doGet(this.buildApiEndpoint(this.infoResourceName, `zipDownloadLimit`)) .then((response) => response.data.data as number) .catch((error) => { - throw error; - }); + throw error + }) } public async getMaxEmbargoDurationInMonths(): Promise { - return this.doGet(this.buildApiEndpoint(this.infoResourceName, `settings/:MaxEmbargoDurationInMonths`)) + return this.doGet( + this.buildApiEndpoint(this.infoResourceName, `settings/:MaxEmbargoDurationInMonths`) + ) .then((response) => response.data.data.message as number) .catch((error) => { - throw error; - }); + throw error + }) } private getVersionFromResponse(response: AxiosResponse): DataverseVersion { - const responseData = response.data.data; + const responseData = response.data.data return { number: responseData.version, - build: responseData.build, - }; + build: responseData.build + } } } diff --git a/src/metadataBlocks/domain/models/MetadataBlock.ts b/src/metadataBlocks/domain/models/MetadataBlock.ts index b95bf799..2ca299cf 100644 --- a/src/metadataBlocks/domain/models/MetadataBlock.ts +++ b/src/metadataBlocks/domain/models/MetadataBlock.ts @@ -1,19 +1,19 @@ export interface MetadataBlock { - id: number; - name: string; - displayName: string; - metadataFields: Record; + id: number + name: string + displayName: string + metadataFields: Record } export interface MetadataFieldInfo { - name: string; - displayName: string; - title: string; - type: string; - watermark: string; - description: string; - multiple: boolean; - isControlledVocabulary: boolean; - displayFormat: string; - childMetadataFields?: Record; + name: string + displayName: string + title: string + type: string + watermark: string + description: string + multiple: boolean + isControlledVocabulary: boolean + displayFormat: string + childMetadataFields?: Record } diff --git a/src/metadataBlocks/domain/repositories/IMetadataBlocksRepository.ts b/src/metadataBlocks/domain/repositories/IMetadataBlocksRepository.ts index e50cf64d..658c4b5a 100644 --- a/src/metadataBlocks/domain/repositories/IMetadataBlocksRepository.ts +++ b/src/metadataBlocks/domain/repositories/IMetadataBlocksRepository.ts @@ -1,5 +1,5 @@ -import { MetadataBlock } from '../models/MetadataBlock'; +import { MetadataBlock } from '../models/MetadataBlock' export interface IMetadataBlocksRepository { - getMetadataBlockByName(metadataBlockName: string): Promise; + getMetadataBlockByName(metadataBlockName: string): Promise } diff --git a/src/metadataBlocks/domain/useCases/GetMetadataBlockByName.ts b/src/metadataBlocks/domain/useCases/GetMetadataBlockByName.ts index a34953e3..20a714f4 100644 --- a/src/metadataBlocks/domain/useCases/GetMetadataBlockByName.ts +++ b/src/metadataBlocks/domain/useCases/GetMetadataBlockByName.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IMetadataBlocksRepository } from '../repositories/IMetadataBlocksRepository'; -import { MetadataBlock } from '../models/MetadataBlock'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IMetadataBlocksRepository } from '../repositories/IMetadataBlocksRepository' +import { MetadataBlock } from '../models/MetadataBlock' export class GetMetadataBlockByName implements UseCase { - private metadataBlocksRepository: IMetadataBlocksRepository; + private metadataBlocksRepository: IMetadataBlocksRepository constructor(metadataBlocksRepository: IMetadataBlocksRepository) { - this.metadataBlocksRepository = metadataBlocksRepository; + this.metadataBlocksRepository = metadataBlocksRepository } /** @@ -16,6 +16,6 @@ export class GetMetadataBlockByName implements UseCase { * @returns {Promise} */ async execute(metadataBlockName: string): Promise { - return await this.metadataBlocksRepository.getMetadataBlockByName(metadataBlockName); + return await this.metadataBlocksRepository.getMetadataBlockByName(metadataBlockName) } } diff --git a/src/metadataBlocks/index.ts b/src/metadataBlocks/index.ts index db6d7a2f..beeecc0a 100644 --- a/src/metadataBlocks/index.ts +++ b/src/metadataBlocks/index.ts @@ -1,9 +1,9 @@ -import { GetMetadataBlockByName } from './domain/useCases/GetMetadataBlockByName'; -import { MetadataBlocksRepository } from './infra/repositories/MetadataBlocksRepository'; +import { GetMetadataBlockByName } from './domain/useCases/GetMetadataBlockByName' +import { MetadataBlocksRepository } from './infra/repositories/MetadataBlocksRepository' -const metadataBlocksRepository = new MetadataBlocksRepository(); +const metadataBlocksRepository = new MetadataBlocksRepository() -const getMetadataBlockByName = new GetMetadataBlockByName(metadataBlocksRepository); +const getMetadataBlockByName = new GetMetadataBlockByName(metadataBlocksRepository) -export { getMetadataBlockByName }; -export { MetadataBlock, MetadataFieldInfo } from './domain/models/MetadataBlock'; +export { getMetadataBlockByName } +export { MetadataBlock, MetadataFieldInfo } from './domain/models/MetadataBlock' diff --git a/src/metadataBlocks/infra/repositories/MetadataBlocksRepository.ts b/src/metadataBlocks/infra/repositories/MetadataBlocksRepository.ts index 740a13fd..e04e464a 100644 --- a/src/metadataBlocks/infra/repositories/MetadataBlocksRepository.ts +++ b/src/metadataBlocks/infra/repositories/MetadataBlocksRepository.ts @@ -1,14 +1,14 @@ -import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'; -import { IMetadataBlocksRepository } from '../../domain/repositories/IMetadataBlocksRepository'; -import { MetadataBlock } from '../../domain/models/MetadataBlock'; -import { transformMetadataBlockResponseToMetadataBlock } from './transformers/metadataBlockTransformers'; +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IMetadataBlocksRepository } from '../../domain/repositories/IMetadataBlocksRepository' +import { MetadataBlock } from '../../domain/models/MetadataBlock' +import { transformMetadataBlockResponseToMetadataBlock } from './transformers/metadataBlockTransformers' export class MetadataBlocksRepository extends ApiRepository implements IMetadataBlocksRepository { public async getMetadataBlockByName(metadataBlockName: string): Promise { return this.doGet(`/metadatablocks/${metadataBlockName}`) .then((response) => transformMetadataBlockResponseToMetadataBlock(response)) .catch((error) => { - throw error; - }); + throw error + }) } } diff --git a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts index ad47afdc..e6ad29b7 100644 --- a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts +++ b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts @@ -1,23 +1,28 @@ -import { AxiosResponse } from 'axios'; -import { MetadataBlock, MetadataFieldInfo } from '../../../domain/models/MetadataBlock'; +import { AxiosResponse } from 'axios' +import { MetadataBlock, MetadataFieldInfo } from '../../../domain/models/MetadataBlock' -export const transformMetadataBlockResponseToMetadataBlock = (response: AxiosResponse): MetadataBlock => { - const metadataBlockPayload = response.data.data; - const metadataFields: Record = {}; - const metadataBlockFieldsPayload = metadataBlockPayload.fields; +export const transformMetadataBlockResponseToMetadataBlock = ( + response: AxiosResponse +): MetadataBlock => { + const metadataBlockPayload = response.data.data + const metadataFields: Record = {} + const metadataBlockFieldsPayload = metadataBlockPayload.fields Object.keys(metadataBlockFieldsPayload).map((metadataFieldKey) => { - const metadataFieldInfoPayload = metadataBlockFieldsPayload[metadataFieldKey]; - metadataFields[metadataFieldKey] = transformPayloadMetadataFieldInfo(metadataFieldInfoPayload); - }); + const metadataFieldInfoPayload = metadataBlockFieldsPayload[metadataFieldKey] + metadataFields[metadataFieldKey] = transformPayloadMetadataFieldInfo(metadataFieldInfoPayload) + }) return { id: metadataBlockPayload.id, name: metadataBlockPayload.name, displayName: metadataBlockPayload.displayName, - metadataFields: metadataFields, - }; -}; + metadataFields: metadataFields + } +} -const transformPayloadMetadataFieldInfo = (metadataFieldInfoPayload: any, isChild = false): MetadataFieldInfo => { +const transformPayloadMetadataFieldInfo = ( + metadataFieldInfoPayload: any, + isChild = false +): MetadataFieldInfo => { const metadataFieldInfo: MetadataFieldInfo = { name: metadataFieldInfoPayload.name, displayName: metadataFieldInfoPayload.displayName, @@ -27,18 +32,18 @@ const transformPayloadMetadataFieldInfo = (metadataFieldInfoPayload: any, isChil description: metadataFieldInfoPayload.description, multiple: metadataFieldInfoPayload.multiple, isControlledVocabulary: metadataFieldInfoPayload.isControlledVocabulary, - displayFormat: metadataFieldInfoPayload.displayFormat, - }; - if (!isChild && metadataFieldInfoPayload.hasOwnProperty('childFields')) { - const childMetadataFieldsPayload = metadataFieldInfoPayload.childFields; - const childMetadataFields: Record = {}; + displayFormat: metadataFieldInfoPayload.displayFormat + } + if (!isChild && 'childFields' in metadataFieldInfoPayload) { + const childMetadataFieldsPayload = metadataFieldInfoPayload.childFields + const childMetadataFields: Record = {} Object.keys(childMetadataFieldsPayload).map((metadataFieldKey) => { childMetadataFields[metadataFieldKey] = transformPayloadMetadataFieldInfo( childMetadataFieldsPayload[metadataFieldKey], - true, - ); - }); - metadataFieldInfo.childMetadataFields = childMetadataFields; + true + ) + }) + metadataFieldInfo.childMetadataFields = childMetadataFields } - return metadataFieldInfo; -}; + return metadataFieldInfo +} diff --git a/src/users/domain/models/AuthenticatedUser.ts b/src/users/domain/models/AuthenticatedUser.ts index 730029d1..1fd0c475 100644 --- a/src/users/domain/models/AuthenticatedUser.ts +++ b/src/users/domain/models/AuthenticatedUser.ts @@ -1,19 +1,19 @@ export interface AuthenticatedUser { - id: number; - persistentUserId: string; - identifier: string; - displayName: string; - firstName: string; - lastName: string; - email: string; - superuser: boolean; - deactivated: boolean; - createdTime: string; - authenticationProviderId: string; - lastLoginTime?: string; - lastApiUseTime?: string; - deactivatedTime?: string; - affiliation?: string; - position?: string; - emailLastConfirmed?: string; + id: number + persistentUserId: string + identifier: string + displayName: string + firstName: string + lastName: string + email: string + superuser: boolean + deactivated: boolean + createdTime: string + authenticationProviderId: string + lastLoginTime?: string + lastApiUseTime?: string + deactivatedTime?: string + affiliation?: string + position?: string + emailLastConfirmed?: string } diff --git a/src/users/domain/repositories/IUsersRepository.ts b/src/users/domain/repositories/IUsersRepository.ts index 3ed0a442..5549c02e 100644 --- a/src/users/domain/repositories/IUsersRepository.ts +++ b/src/users/domain/repositories/IUsersRepository.ts @@ -1,5 +1,5 @@ -import { AuthenticatedUser } from '../models/AuthenticatedUser'; +import { AuthenticatedUser } from '../models/AuthenticatedUser' export interface IUsersRepository { - getCurrentAuthenticatedUser(): Promise; + getCurrentAuthenticatedUser(): Promise } diff --git a/src/users/domain/useCases/GetCurrentAuthenticatedUser.ts b/src/users/domain/useCases/GetCurrentAuthenticatedUser.ts index 6724b518..b9f7e2b6 100644 --- a/src/users/domain/useCases/GetCurrentAuthenticatedUser.ts +++ b/src/users/domain/useCases/GetCurrentAuthenticatedUser.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IUsersRepository } from '../repositories/IUsersRepository'; -import { AuthenticatedUser } from '../models/AuthenticatedUser'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IUsersRepository } from '../repositories/IUsersRepository' +import { AuthenticatedUser } from '../models/AuthenticatedUser' export class GetCurrentAuthenticatedUser implements UseCase { - private usersRepository: IUsersRepository; + private usersRepository: IUsersRepository constructor(usersRepository: IUsersRepository) { - this.usersRepository = usersRepository; + this.usersRepository = usersRepository } /** @@ -15,6 +15,6 @@ export class GetCurrentAuthenticatedUser implements UseCase { * @returns {Promise} */ async execute(): Promise { - return await this.usersRepository.getCurrentAuthenticatedUser(); + return await this.usersRepository.getCurrentAuthenticatedUser() } } diff --git a/src/users/index.ts b/src/users/index.ts index 97981403..26690ec6 100644 --- a/src/users/index.ts +++ b/src/users/index.ts @@ -1,7 +1,7 @@ -import { UsersRepository } from './infra/repositories/UsersRepository'; -import { GetCurrentAuthenticatedUser } from './domain/useCases/GetCurrentAuthenticatedUser'; +import { UsersRepository } from './infra/repositories/UsersRepository' +import { GetCurrentAuthenticatedUser } from './domain/useCases/GetCurrentAuthenticatedUser' -const getCurrentAuthenticatedUser = new GetCurrentAuthenticatedUser(new UsersRepository()); +const getCurrentAuthenticatedUser = new GetCurrentAuthenticatedUser(new UsersRepository()) -export { getCurrentAuthenticatedUser }; -export { AuthenticatedUser } from './domain/models/AuthenticatedUser'; +export { getCurrentAuthenticatedUser } +export { AuthenticatedUser } from './domain/models/AuthenticatedUser' diff --git a/src/users/infra/repositories/UsersRepository.ts b/src/users/infra/repositories/UsersRepository.ts index a9d5856d..a37cca8f 100644 --- a/src/users/infra/repositories/UsersRepository.ts +++ b/src/users/infra/repositories/UsersRepository.ts @@ -1,19 +1,19 @@ -import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'; -import { IUsersRepository } from '../../domain/repositories/IUsersRepository'; -import { AuthenticatedUser } from '../../domain/models/AuthenticatedUser'; -import { AxiosResponse } from 'axios'; +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IUsersRepository } from '../../domain/repositories/IUsersRepository' +import { AuthenticatedUser } from '../../domain/models/AuthenticatedUser' +import { AxiosResponse } from 'axios' export class UsersRepository extends ApiRepository implements IUsersRepository { public async getCurrentAuthenticatedUser(): Promise { return this.doGet('/users/:me', true) .then((response) => this.getAuthenticatedUserFromResponse(response)) .catch((error) => { - throw error; - }); + throw error + }) } private getAuthenticatedUserFromResponse(response: AxiosResponse): AuthenticatedUser { - const responseData = response.data.data; + const responseData = response.data.data return { id: responseData.id, persistentUserId: responseData.persistentUserId, @@ -31,7 +31,7 @@ export class UsersRepository extends ApiRepository implements IUsersRepository { deactivatedTime: responseData.deactivatedTime, affiliation: responseData.affiliation, position: responseData.position, - emailLastConfirmed: responseData.emailLastConfirmed, - }; + emailLastConfirmed: responseData.emailLastConfirmed + } } } diff --git a/test/integration/auth/AuthRepository.test.ts b/test/integration/auth/AuthRepository.test.ts index 64a0799d..8cdaf663 100644 --- a/test/integration/auth/AuthRepository.test.ts +++ b/test/integration/auth/AuthRepository.test.ts @@ -1,21 +1,28 @@ -import { AuthRepository } from '../../../src/auth/infra/repositories/AuthRepository'; -import { assert } from 'sinon'; -import { WriteError } from '../../../src/core/domain/repositories/WriteError'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { AuthRepository } from '../../../src/auth/infra/repositories/AuthRepository' +import { assert } from 'sinon' +import { WriteError } from '../../../src/core/domain/repositories/WriteError' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' describe('logout', () => { - const sut: AuthRepository = new AuthRepository(); + const sut: AuthRepository = new AuthRepository() - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) test('should return error due to disabled feature flag', async () => { - let error: WriteError = undefined; - await sut.logout().catch((e) => (error = e)); + let error: WriteError = undefined + await sut.logout().catch((e) => (error = e)) assert.match( error.message, - 'There was an error when writing the resource. Reason was: [500] This endpoint is only available when session authentication feature flag is enabled', - ); - }); -}); + 'There was an error when writing the resource. Reason was: [500] This endpoint is only available when session authentication feature flag is enabled' + ) + }) +}) diff --git a/test/integration/datasets/DatasetsRepository.test.ts b/test/integration/datasets/DatasetsRepository.test.ts index a3064195..1c4689c6 100644 --- a/test/integration/datasets/DatasetsRepository.test.ts +++ b/test/integration/datasets/DatasetsRepository.test.ts @@ -1,246 +1,266 @@ -import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository'; -import { assert } from 'sinon'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository' +import { assert } from 'sinon' +import { TestConstants } from '../../testHelpers/TestConstants' import { createPrivateUrlViaApi, publishDatasetViaApi, deaccessionDatasetViaApi, - waitForNoLocks, -} from '../../testHelpers/datasets/datasetHelper'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { DatasetNotNumberedVersion, DatasetLockType, DatasetPreviewSubset } from '../../../src/datasets'; -import { fail } from 'assert'; -import { ApiConfig } from '../../../src'; -import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; + waitForNoLocks +} from '../../testHelpers/datasets/datasetHelper' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + DatasetNotNumberedVersion, + DatasetLockType, + DatasetPreviewSubset +} from '../../../src/datasets' +import { fail } from 'assert' +import { ApiConfig } from '../../../src' +import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' describe('DatasetsRepository', () => { - const sut: DatasetsRepository = new DatasetsRepository(); - const nonExistentTestDatasetId = 100; + const sut: DatasetsRepository = new DatasetsRepository() + const nonExistentTestDatasetId = 100 - const latestVersionId = DatasetNotNumberedVersion.LATEST; + const latestVersionId = DatasetNotNumberedVersion.LATEST beforeAll(async () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) + }) describe('getAllDatasetPreviews', () => { - const testPageLimit = 1; + const testPageLimit = 1 test('should return all dataset previews when no pagination params are defined', async () => { - const actual: DatasetPreviewSubset = await sut.getAllDatasetPreviews(); - assert.match(actual.datasetPreviews.length, 2); - assert.match(actual.datasetPreviews[0].title, 'Second Dataset'); - assert.match(actual.totalDatasetCount, 2); - }); + const actual: DatasetPreviewSubset = await sut.getAllDatasetPreviews() + assert.match(actual.datasetPreviews.length, 2) + assert.match(actual.datasetPreviews[0].title, 'Second Dataset') + assert.match(actual.totalDatasetCount, 2) + }) test('should return first dataset preview page', async () => { - const actual = await sut.getAllDatasetPreviews(testPageLimit, 0); - assert.match(actual.datasetPreviews.length, 1); - assert.match(actual.datasetPreviews[0].title, 'Second Dataset'); - assert.match(actual.totalDatasetCount, 2); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 0) + assert.match(actual.datasetPreviews.length, 1) + assert.match(actual.datasetPreviews[0].title, 'Second Dataset') + assert.match(actual.totalDatasetCount, 2) + }) test('should return second dataset preview page', async () => { - const actual = await sut.getAllDatasetPreviews(testPageLimit, 1); - assert.match(actual.datasetPreviews.length, 1); - assert.match(actual.datasetPreviews[0].title, 'First Dataset'); - assert.match(actual.totalDatasetCount, 2); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 1) + assert.match(actual.datasetPreviews.length, 1) + assert.match(actual.datasetPreviews[0].title, 'First Dataset') + assert.match(actual.totalDatasetCount, 2) + }) test('should return third dataset preview page', async () => { - const actual = await sut.getAllDatasetPreviews(testPageLimit, 2); - assert.match(actual.datasetPreviews.length, 0); - assert.match(actual.totalDatasetCount, 2); - }); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 2) + assert.match(actual.datasetPreviews.length, 0) + assert.match(actual.totalDatasetCount, 2) + }) + }) describe('getDatasetSummaryFieldNames', () => { test('should return not empty field list on successful response', async () => { - const actual = await sut.getDatasetSummaryFieldNames(); + const actual = await sut.getDatasetSummaryFieldNames() - assert.pass(actual.length > 0); - }); - }); + assert.pass(actual.length > 0) + }) + }) describe('getDataset', () => { describe('by numeric id', () => { test('should return dataset when it exists filtering by id and version id', async () => { - const actual = await sut.getDataset(TestConstants.TEST_CREATED_DATASET_1_ID, latestVersionId, false); - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID); - }); - - test('should return dataset when it exists filtering by id and version id', async () => { - const actual = await sut.getDataset(TestConstants.TEST_CREATED_DATASET_1_ID, latestVersionId, false); - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID); - }); + const actual = await sut.getDataset( + TestConstants.TEST_CREATED_DATASET_1_ID, + latestVersionId, + false + ) + expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID) + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; - await sut.getDataset(nonExistentTestDatasetId, latestVersionId, false).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getDataset(nonExistentTestDatasetId, latestVersionId, false) + .catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.`, - ); - }); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + }) + }) describe('by persistent id', () => { test('should return dataset when it exists filtering by persistent id and version id', async () => { - const createdDataset = await sut.getDataset(TestConstants.TEST_CREATED_DATASET_1_ID, latestVersionId, false); - const actual = await sut.getDataset(createdDataset.persistentId, latestVersionId, false); - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID); - }); + const createdDataset = await sut.getDataset( + TestConstants.TEST_CREATED_DATASET_1_ID, + latestVersionId, + false + ) + const actual = await sut.getDataset(createdDataset.persistentId, latestVersionId, false) + expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID) + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - const testWrongPersistentId = 'wrongPersistentId'; - await sut.getDataset(testWrongPersistentId, latestVersionId, false).catch((e) => (error = e)); + const testWrongPersistentId = 'wrongPersistentId' + await sut + .getDataset(testWrongPersistentId, latestVersionId, false) + .catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.`, - ); - }); - }); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.` + ) + }) + }) + }) describe('Private URLs', () => { const expectedErrorInvalidToken = - 'There was an error when reading the resource. Reason was: [404] Private URL user not found'; - let privateUrlToken: string = undefined; + 'There was an error when reading the resource. Reason was: [404] Private URL user not found' + let privateUrlToken: string = undefined beforeAll(async () => { await createPrivateUrlViaApi(TestConstants.TEST_CREATED_DATASET_1_ID) .then((response) => { - privateUrlToken = response.data.data.token; + privateUrlToken = response.data.data.token }) .catch(() => { - fail('Tests beforeAll(): Error while creating Dataset private URL'); - }); - }); + fail('Tests beforeAll(): Error while creating Dataset private URL') + }) + }) describe('getPrivateUrlDataset', () => { test('should return dataset when token is valid', async () => { - const actual = await sut.getPrivateUrlDataset(privateUrlToken); + const actual = await sut.getPrivateUrlDataset(privateUrlToken) - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID); - }); + expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID) + }) test('should return error when token is not valid', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getPrivateUrlDataset('invalidToken').catch((e) => (error = e)); + await sut.getPrivateUrlDataset('invalidToken').catch((e) => (error = e)) - assert.match(error.message, expectedErrorInvalidToken); - }); - }); + assert.match(error.message, expectedErrorInvalidToken) + }) + }) describe('getPrivateUrlDatasetCitation', () => { test('should return dataset citation when token is valid', async () => { - const actual = await sut.getPrivateUrlDatasetCitation(privateUrlToken); + const actual = await sut.getPrivateUrlDatasetCitation(privateUrlToken) - expect(typeof actual).toBe('string'); - }); + expect(typeof actual).toBe('string') + }) test('should return error when token is not valid', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getPrivateUrlDataset('invalidToken').catch((e) => (error = e)); + await sut.getPrivateUrlDataset('invalidToken').catch((e) => (error = e)) - assert.match(error.message, expectedErrorInvalidToken); - }); - }); + assert.match(error.message, expectedErrorInvalidToken) + }) + }) describe('getDatasetUserPermissions', () => { test('should return user permissions filtering by dataset id', async () => { - const actual = await sut.getDatasetUserPermissions(TestConstants.TEST_CREATED_DATASET_1_ID); - assert.match(actual.canViewUnpublishedDataset, true); - assert.match(actual.canEditDataset, true); - assert.match(actual.canPublishDataset, true); - assert.match(actual.canManageDatasetPermissions, true); - assert.match(actual.canDeleteDatasetDraft, true); - }); + const actual = await sut.getDatasetUserPermissions(TestConstants.TEST_CREATED_DATASET_1_ID) + assert.match(actual.canViewUnpublishedDataset, true) + assert.match(actual.canEditDataset, true) + assert.match(actual.canPublishDataset, true) + assert.match(actual.canManageDatasetPermissions, true) + assert.match(actual.canDeleteDatasetDraft, true) + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getDatasetUserPermissions(nonExistentTestDatasetId).catch((e) => (error = e)); + await sut.getDatasetUserPermissions(nonExistentTestDatasetId).catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.`, - ); - }); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + }) + }) describe('getDatasetLocks', () => { test('should return list of dataset locks by dataset id for a dataset while publishing', async () => { await publishDatasetViaApi(TestConstants.TEST_CREATED_DATASET_2_ID) .then() .catch(() => { - assert.fail('Error while publishing test Dataset'); - }); - const actual = await sut.getDatasetLocks(TestConstants.TEST_CREATED_DATASET_2_ID); - assert.match(actual.length, 1); - assert.match(actual[0].lockType, DatasetLockType.FINALIZE_PUBLICATION); - assert.match(actual[0].userId, 'dataverseAdmin'); - assert.match(actual[0].message, 'Publishing the dataset; Validating Datafiles Asynchronously'); - }); + assert.fail('Error while publishing test Dataset') + }) + const actual = await sut.getDatasetLocks(TestConstants.TEST_CREATED_DATASET_2_ID) + assert.match(actual.length, 1) + assert.match(actual[0].lockType, DatasetLockType.FINALIZE_PUBLICATION) + assert.match(actual[0].userId, 'dataverseAdmin') + assert.match( + actual[0].message, + 'Publishing the dataset; Validating Datafiles Asynchronously' + ) + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getDatasetLocks(nonExistentTestDatasetId).catch((e) => (error = e)); + await sut.getDatasetLocks(nonExistentTestDatasetId).catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.`, - ); - }); - }); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + }) + }) + }) describe('getDatasetCitation', () => { test('should return citation when dataset exists', async () => { const actualDatasetCitation = await sut.getDatasetCitation( TestConstants.TEST_CREATED_DATASET_1_ID, latestVersionId, - false, - ); - expect(typeof actualDatasetCitation).toBe('string'); - }); + false + ) + expect(typeof actualDatasetCitation).toBe('string') + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; - await sut.getDatasetCitation(nonExistentTestDatasetId, latestVersionId, false).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getDatasetCitation(nonExistentTestDatasetId, latestVersionId, false) + .catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.`, - ); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + }) test('should return citation when dataset is deaccessioned', async () => { await waitForNoLocks(TestConstants.TEST_CREATED_DATASET_2_ID, 10) .then() .catch(() => { - assert.fail('Error while waiting for no locks'); - }); + assert.fail('Error while waiting for no locks') + }) await deaccessionDatasetViaApi(TestConstants.TEST_CREATED_DATASET_2_ID, '1.0') .then() .catch((error) => { - console.log(JSON.stringify(error)); - assert.fail('Error while deaccessioning test Dataset'); - }); + console.log(JSON.stringify(error)) + assert.fail('Error while deaccessioning test Dataset') + }) const actualDatasetCitation = await sut.getDatasetCitation( TestConstants.TEST_CREATED_DATASET_2_ID, latestVersionId, - true, - ); - expect(typeof actualDatasetCitation).toBe('string'); - }); - }); -}); + true + ) + expect(typeof actualDatasetCitation).toBe('string') + }) + }) +}) diff --git a/test/integration/environment/setup.js b/test/integration/environment/setup.js deleted file mode 100644 index 57cf5c06..00000000 --- a/test/integration/environment/setup.js +++ /dev/null @@ -1,103 +0,0 @@ -const fs = require('fs'); -const { DockerComposeEnvironment, Wait } = require('testcontainers'); -const axios = require('axios'); -const { TestConstants } = require('../../testHelpers/TestConstants'); -const datasetJson1 = require('../../testHelpers/datasets/test-dataset-1.json'); -const datasetJson2 = require('../../testHelpers/datasets/test-dataset-2.json'); - -const COMPOSE_FILE = 'docker-compose.yml'; - -const CONTAINER_DATAVERSE_BOOTSTRAP_NAME = 'test_dataverse_bootstrap'; -const CONTAINER_DATAVERSE_BOOTSTRAP_END_MESSAGE = - 'Done, your instance has been configured for development. Have a nice day!'; -const CONTAINERS_STARTUP_TIMEOUT = 300000; - -const API_ALLOW_TOKEN_LOOKUP_ENDPOINT = '/admin/settings/:AllowApiTokenLookupViaApi'; -const API_KEY_USER_ENDPOINT = '/builtin-users/dataverseAdmin/api-token'; -const API_KEY_USER_PASSWORD = 'admin1'; - -module.exports = async () => { - await setupContainers(); - await setupApiKey(); - await setupTestFixtures(); -}; - -async function setupContainers() { - console.log('Cleaning up old container volumes...'); - fs.rmSync(`${__dirname}/docker-dev-volumes`, { recursive: true, force: true }); - console.log('Running test containers...'); - await new DockerComposeEnvironment(__dirname, COMPOSE_FILE) - .withStartupTimeout(CONTAINERS_STARTUP_TIMEOUT) - .withWaitStrategy(CONTAINER_DATAVERSE_BOOTSTRAP_NAME, Wait.forLogMessage(CONTAINER_DATAVERSE_BOOTSTRAP_END_MESSAGE)) - .up(); - console.log('Test containers up and running'); -} - -async function setupApiKey() { - console.log('Obtaining test API key...'); - await axios.put(`${TestConstants.TEST_API_URL}${API_ALLOW_TOKEN_LOOKUP_ENDPOINT}`, 'true'); - await axios - .get(`${TestConstants.TEST_API_URL}${API_KEY_USER_ENDPOINT}?password=${API_KEY_USER_PASSWORD}`) - .then((response) => { - process.env.TEST_API_KEY = response.data.data.message; - }) - .catch(() => { - console.error('Tests setup: Error while obtaining API key'); - }); - console.log('API key obtained'); -} - -async function setupTestFixtures() { - console.log('Creating test datasets...'); - await createDatasetViaApi(datasetJson1) - .then() - .catch((error) => { - console.error('Tests setup: Error while creating test Dataset 1'); - }); - await createDatasetViaApi(datasetJson2) - .then() - .catch((error) => { - console.error('Tests setup: Error while creating test Dataset 2'); - }); - console.log('Test datasets created'); - await waitForDatasetsIndexingInSolr(); -} - -async function createDatasetViaApi(datasetJson) { - return await axios.post(`${TestConstants.TEST_API_URL}/dataverses/root/datasets`, datasetJson, buildRequestHeaders()); -} - -async function waitForDatasetsIndexingInSolr() { - console.log('Waiting for datasets indexing in Solr...'); - let datasetsIndexed = false; - let retry = 0; - while (!datasetsIndexed && retry < 10) { - await axios - .get(`${TestConstants.TEST_API_URL}/search?q=*&type=dataset`, buildRequestHeaders()) - .then((response) => { - const nDatasets = response.data.data.items.length; - if (nDatasets == 2) { - datasetsIndexed = true; - } - }) - .catch((error) => { - console.error( - `Tests setup: Error while waiting for datasets indexing in Solr: [${error.response.status}]${ - error.response.data ? ` ${error.response.data.message}` : '' - }`, - ); - }); - await new Promise((resolve) => setTimeout(resolve, 1000)); - retry++; - } - if (!datasetsIndexed) { - throw new Error('Tests setup: Timeout reached while waiting for datasets indexing in Solr'); - } - console.log('Datasets indexed in Solr'); -} - -function buildRequestHeaders() { - return { - headers: { 'Content-Type': 'application/json', 'X-Dataverse-Key': process.env.TEST_API_KEY }, - }; -} diff --git a/test/integration/environment/setup.ts b/test/integration/environment/setup.ts new file mode 100644 index 00000000..d4fc13f8 --- /dev/null +++ b/test/integration/environment/setup.ts @@ -0,0 +1,99 @@ +import * as fs from 'fs' +import { DockerComposeEnvironment, Wait } from 'testcontainers' +import axios from 'axios' +import { TestConstants } from '../../testHelpers/TestConstants' +import datasetJson1 from '../../testHelpers/datasets/test-dataset-1.json' +import datasetJson2 from '../../testHelpers/datasets/test-dataset-2.json' + +const COMPOSE_FILE = 'docker-compose.yml' + +const CONTAINER_DATAVERSE_BOOTSTRAP_NAME = 'test_dataverse_bootstrap' +const CONTAINER_DATAVERSE_BOOTSTRAP_END_MESSAGE = + 'Done, your instance has been configured for development. Have a nice day!' +const CONTAINERS_STARTUP_TIMEOUT = 300000 + +const API_ALLOW_TOKEN_LOOKUP_ENDPOINT = '/admin/settings/:AllowApiTokenLookupViaApi' +const API_KEY_USER_ENDPOINT = '/builtin-users/dataverseAdmin/api-token' +const API_KEY_USER_PASSWORD = 'admin1' + +export default async function setupTestEnvironment(): Promise { + await setupContainers() + await setupApiKey() + await setupTestFixtures() +} + +async function setupContainers(): Promise { + console.log('Cleaning up old container volumes...') + fs.rmSync(`${__dirname}/docker-dev-volumes`, { recursive: true, force: true }) + console.log('Running test containers...') + await new DockerComposeEnvironment(__dirname, COMPOSE_FILE) + .withStartupTimeout(CONTAINERS_STARTUP_TIMEOUT) + .withWaitStrategy( + CONTAINER_DATAVERSE_BOOTSTRAP_NAME, + Wait.forLogMessage(CONTAINER_DATAVERSE_BOOTSTRAP_END_MESSAGE) + ) + .up() + console.log('Test containers up and running') +} + +async function setupApiKey(): Promise { + console.log('Obtaining test API key...') + await axios.put(`${TestConstants.TEST_API_URL}${API_ALLOW_TOKEN_LOOKUP_ENDPOINT}`, 'true') + const response = await axios.get( + `${TestConstants.TEST_API_URL}${API_KEY_USER_ENDPOINT}?password=${API_KEY_USER_PASSWORD}` + ) + process.env.TEST_API_KEY = response.data.data.message + console.log('API key obtained') +} + +async function setupTestFixtures(): Promise { + console.log('Creating test datasets...') + await createDatasetViaApi(datasetJson1) + await createDatasetViaApi(datasetJson2) + console.log('Test datasets created') + await waitForDatasetsIndexingInSolr() +} + +async function createDatasetViaApi(datasetJson: any): Promise { + await axios.post( + `${TestConstants.TEST_API_URL}/dataverses/root/datasets`, + datasetJson, + buildRequestHeaders() + ) +} + +async function waitForDatasetsIndexingInSolr(): Promise { + console.log('Waiting for datasets indexing in Solr...') + let datasetsIndexed = false + let retry = 0 + while (!datasetsIndexed && retry < 10) { + try { + const response = await axios.get( + `${TestConstants.TEST_API_URL}/search?q=*&type=dataset`, + buildRequestHeaders() + ) + const nDatasets = response.data.data.items.length + if (nDatasets === 2) { + datasetsIndexed = true + } + } catch (error) { + console.error( + `Tests setup: Error while waiting for datasets indexing in Solr: [${ + error.response.status + }]${error.response.data ? ` ${error.response.data.message}` : ''}` + ) + } + await new Promise((resolve) => setTimeout(resolve, 1000)) + retry++ + } + if (!datasetsIndexed) { + throw new Error('Tests setup: Timeout reached while waiting for datasets indexing in Solr') + } + console.log('Datasets indexed in Solr') +} + +function buildRequestHeaders(): any { + return { + headers: { 'Content-Type': 'application/json', 'X-Dataverse-Key': process.env.TEST_API_KEY } + } +} diff --git a/test/integration/files/FilesRepository.test.ts b/test/integration/files/FilesRepository.test.ts index e0d9897c..c72332f8 100644 --- a/test/integration/files/FilesRepository.test.ts +++ b/test/integration/files/FilesRepository.test.ts @@ -1,80 +1,95 @@ -import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { assert } from 'sinon'; -import { expect } from 'chai'; -import { TestConstants } from '../../testHelpers/TestConstants'; -import {registerFileViaApi, uploadFileViaApi} from '../../testHelpers/files/filesHelper'; -import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { FileSearchCriteria, FileAccessStatus, FileOrderCriteria } from '../../../src/files/domain/models/FileCriteria'; -import { DatasetNotNumberedVersion } from '../../../src/datasets'; -import { FileCounts } from '../../../src/files/domain/models/FileCounts'; -import { FileDownloadSizeMode } from '../../../src'; -import { fail } from 'assert'; +import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { assert } from 'sinon' +import { expect } from 'chai' +import { TestConstants } from '../../testHelpers/TestConstants' +import { registerFileViaApi, uploadFileViaApi } from '../../testHelpers/files/filesHelper' +import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + FileSearchCriteria, + FileAccessStatus, + FileOrderCriteria +} from '../../../src/files/domain/models/FileCriteria' +import { DatasetNotNumberedVersion } from '../../../src/datasets' +import { FileCounts } from '../../../src/files/domain/models/FileCounts' +import { FileDownloadSizeMode } from '../../../src' +import { fail } from 'assert' describe('FilesRepository', () => { - const sut: FilesRepository = new FilesRepository(); + const sut: FilesRepository = new FilesRepository() - const testTextFile1Name = 'test-file-1.txt'; - const testTextFile2Name = 'test-file-2.txt'; - const testTextFile3Name = 'test-file-3.txt'; - const testTabFile4Name = 'test-file-4.tab'; - const testCategoryName = 'testCategory'; + const testTextFile1Name = 'test-file-1.txt' + const testTextFile2Name = 'test-file-2.txt' + const testTextFile3Name = 'test-file-3.txt' + const testTabFile4Name = 'test-file-4.tab' + const testCategoryName = 'testCategory' - const nonExistentFiledId = 200; + const nonExistentFiledId = 200 - const latestDatasetVersionId = DatasetNotNumberedVersion.LATEST; + const latestDatasetVersionId = DatasetNotNumberedVersion.LATEST - const datasetRepository = new DatasetsRepository(); + const datasetRepository = new DatasetsRepository() - let testFileId: number; - let testFilePersistentId: string; + let testFileId: number + let testFilePersistentId: string beforeAll(async () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) // Uploading test file 1 with some categories - const uploadFileResponse = await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile1Name, { categories: [testCategoryName] }) + const uploadFileResponse = await uploadFileViaApi( + TestConstants.TEST_CREATED_DATASET_1_ID, + testTextFile1Name, + { categories: [testCategoryName] } + ) .then() .catch((e) => { - console.log(e); - fail(`Tests beforeAll(): Error while uploading file ${testTextFile1Name}`); - }); + console.log(e) + fail(`Tests beforeAll(): Error while uploading file ${testTextFile1Name}`) + }) // Uploading test file 2 await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile2Name) .then() .catch((e) => { - console.log(e); - fail(`Tests beforeAll(): Error while uploading file ${testTextFile2Name}`); - }); + console.log(e) + fail(`Tests beforeAll(): Error while uploading file ${testTextFile2Name}`) + }) // Uploading test file 3 await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile3Name) .then() .catch((e) => { - console.log(e); - fail(`Tests beforeAll(): Error while uploading file ${testTextFile3Name}`); - }); + console.log(e) + fail(`Tests beforeAll(): Error while uploading file ${testTextFile3Name}`) + }) // Uploading test file 4 await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTabFile4Name) .then() .catch((e) => { - console.log(e); - fail(`Tests beforeAll(): Error while uploading file ${testTabFile4Name}`); - }); + console.log(e) + fail(`Tests beforeAll(): Error while uploading file ${testTabFile4Name}`) + }) // Registering test file 1 - await registerFileViaApi(uploadFileResponse.data.data.files[0].dataFile.id); + await registerFileViaApi(uploadFileResponse.data.data.files[0].dataFile.id) const filesSubset = await sut.getDatasetFiles( - TestConstants.TEST_CREATED_DATASET_1_ID, - latestDatasetVersionId, - false, - FileOrderCriteria.NAME_AZ, + TestConstants.TEST_CREATED_DATASET_1_ID, + latestDatasetVersionId, + false, + FileOrderCriteria.NAME_AZ ) - testFileId = filesSubset.files[0].id; - testFilePersistentId = filesSubset.files[0].persistentId; - }); + testFileId = filesSubset.files[0].id + testFilePersistentId = filesSubset.files[0].persistentId + }) describe('getDatasetFiles', () => { const testFileCriteria = new FileSearchCriteria() .withContentType('text/plain') - .withAccessStatus(FileAccessStatus.PUBLIC); + .withAccessStatus(FileAccessStatus.PUBLIC) describe('by numeric id', () => { test('should return all files filtering by dataset id and version id', async () => { @@ -82,15 +97,15 @@ describe('FilesRepository', () => { TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - FileOrderCriteria.NAME_AZ, - ); - assert.match(actual.files.length, 4); - assert.match(actual.files[0].name, testTextFile1Name); - assert.match(actual.files[1].name, testTextFile2Name); - assert.match(actual.files[2].name, testTextFile3Name); - assert.match(actual.files[3].name, testTabFile4Name); - assert.match(actual.totalFilesCount, 4); - }); + FileOrderCriteria.NAME_AZ + ) + assert.match(actual.files.length, 4) + assert.match(actual.files[0].name, testTextFile1Name) + assert.match(actual.files[1].name, testTextFile2Name) + assert.match(actual.files[2].name, testTextFile3Name) + assert.match(actual.files[3].name, testTabFile4Name) + assert.match(actual.totalFilesCount, 4) + }) test('should return correct files filtering by dataset id, version id, and paginating', async () => { const actual = await sut.getDatasetFiles( @@ -100,12 +115,12 @@ describe('FilesRepository', () => { FileOrderCriteria.NAME_AZ, 3, 3, - undefined, - ); - assert.match(actual.files.length, 1); - assert.match(actual.files[0].name, testTabFile4Name); - assert.match(actual.totalFilesCount, 4); - }); + undefined + ) + assert.match(actual.files.length, 1) + assert.match(actual.files[0].name, testTabFile4Name) + assert.match(actual.totalFilesCount, 4) + }) test('should return correct files filtering by dataset id, version id, and applying newest file criteria', async () => { const actual = await sut.getDatasetFiles( @@ -115,57 +130,62 @@ describe('FilesRepository', () => { FileOrderCriteria.NEWEST, undefined, undefined, - testFileCriteria, - ); - assert.match(actual.files.length, 3); - assert.match(actual.files[0].name, testTextFile3Name); - assert.match(actual.files[1].name, testTextFile2Name); - assert.match(actual.files[2].name, testTextFile1Name); - assert.match(actual.totalFilesCount, 3); - }); + testFileCriteria + ) + assert.match(actual.files.length, 3) + assert.match(actual.files[0].name, testTextFile3Name) + assert.match(actual.files[1].name, testTextFile2Name) + assert.match(actual.files[2].name, testTextFile1Name) + assert.match(actual.totalFilesCount, 3) + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - const nonExistentTestDatasetId = 100; + const nonExistentTestDatasetId = 100 await sut - .getDatasetFiles(nonExistentTestDatasetId, latestDatasetVersionId, false, FileOrderCriteria.NAME_AZ) - .catch((e) => (error = e)); + .getDatasetFiles( + nonExistentTestDatasetId, + latestDatasetVersionId, + false, + FileOrderCriteria.NAME_AZ + ) + .catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.`, - ); - }); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + }) + }) describe('by persistent id', () => { test('should return all files filtering by persistent id and version id', async () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); + false + ) const actual = await sut.getDatasetFiles( testDataset.persistentId, latestDatasetVersionId, false, - FileOrderCriteria.NAME_AZ, - ); - assert.match(actual.files.length, 4); - assert.match(actual.files[0].name, testTextFile1Name); - assert.match(actual.files[1].name, testTextFile2Name); - assert.match(actual.files[2].name, testTextFile3Name); - assert.match(actual.files[3].name, testTabFile4Name); - assert.match(actual.totalFilesCount, 4); - }); + FileOrderCriteria.NAME_AZ + ) + assert.match(actual.files.length, 4) + assert.match(actual.files[0].name, testTextFile1Name) + assert.match(actual.files[1].name, testTextFile2Name) + assert.match(actual.files[2].name, testTextFile3Name) + assert.match(actual.files[3].name, testTabFile4Name) + assert.match(actual.totalFilesCount, 4) + }) test('should return correct files filtering by persistent id, version id, and paginating', async () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); + false + ) const actual = await sut.getDatasetFiles( testDataset.persistentId, latestDatasetVersionId, @@ -173,19 +193,19 @@ describe('FilesRepository', () => { FileOrderCriteria.NAME_AZ, 3, 3, - undefined, - ); - assert.match(actual.files.length, 1); - assert.match(actual.files[0].name, testTabFile4Name); - assert.match(actual.totalFilesCount, 4); - }); + undefined + ) + assert.match(actual.files.length, 1) + assert.match(actual.files[0].name, testTabFile4Name) + assert.match(actual.totalFilesCount, 4) + }) test('should return correct files filtering by persistent id, version id, and applying newest file criteria', async () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); + false + ) const actual = await sut.getDatasetFiles( testDataset.persistentId, latestDatasetVersionId, @@ -193,30 +213,35 @@ describe('FilesRepository', () => { FileOrderCriteria.NEWEST, undefined, undefined, - testFileCriteria, - ); - assert.match(actual.files.length, 3); - assert.match(actual.files[0].name, testTextFile3Name); - assert.match(actual.files[1].name, testTextFile2Name); - assert.match(actual.files[2].name, testTextFile1Name); - assert.match(actual.totalFilesCount, 3); - }); + testFileCriteria + ) + assert.match(actual.files.length, 3) + assert.match(actual.files[0].name, testTextFile3Name) + assert.match(actual.files[1].name, testTextFile2Name) + assert.match(actual.files[2].name, testTextFile1Name) + assert.match(actual.totalFilesCount, 3) + }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - const testWrongPersistentId = 'wrongPersistentId'; + const testWrongPersistentId = 'wrongPersistentId' await sut - .getDatasetFiles(testWrongPersistentId, latestDatasetVersionId, false, FileOrderCriteria.NAME_AZ) - .catch((e) => (error = e)); + .getDatasetFiles( + testWrongPersistentId, + latestDatasetVersionId, + false, + FileOrderCriteria.NAME_AZ + ) + .catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.`, - ); - }); - }); - }); + `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.` + ) + }) + }) + }) describe('getDatasetFileCounts', () => { const expectedFileCounts: FileCounts = { @@ -224,38 +249,38 @@ describe('FilesRepository', () => { perContentType: [ { contentType: 'text/plain', - count: 3, + count: 3 }, { contentType: 'text/tab-separated-values', - count: 1, - }, + count: 1 + } ], perAccessStatus: [ { accessStatus: FileAccessStatus.PUBLIC, - count: 4, - }, + count: 4 + } ], perCategoryName: [ { categoryName: testCategoryName, - count: 1, - }, - ], - }; + count: 1 + } + ] + } test('should return file count filtering by numeric id', async () => { const actual = await sut.getDatasetFileCounts( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); - assert.match(actual.total, expectedFileCounts.total); - expect(actual.perContentType).to.have.deep.members(expectedFileCounts.perContentType); - expect(actual.perAccessStatus).to.have.deep.members(expectedFileCounts.perAccessStatus); - expect(actual.perCategoryName).to.have.deep.members(expectedFileCounts.perCategoryName); - }); + false + ) + assert.match(actual.total, expectedFileCounts.total) + expect(actual.perContentType).to.have.deep.members(expectedFileCounts.perContentType) + expect(actual.perAccessStatus).to.have.deep.members(expectedFileCounts.perAccessStatus) + expect(actual.perCategoryName).to.have.deep.members(expectedFileCounts.perCategoryName) + }) test('should return file count filtering by numeric id and applying category criteria', async () => { const expectedFileCountsForCriteria: FileCounts = { @@ -263,90 +288,100 @@ describe('FilesRepository', () => { perContentType: [ { contentType: 'text/plain', - count: 1, - }, + count: 1 + } ], perAccessStatus: [ { accessStatus: FileAccessStatus.PUBLIC, - count: 1, - }, + count: 1 + } ], perCategoryName: [ { categoryName: testCategoryName, - count: 1, - }, - ], - }; - const testCriteria = new FileSearchCriteria().withCategoryName(testCategoryName); + count: 1 + } + ] + } + const testCriteria = new FileSearchCriteria().withCategoryName(testCategoryName) const actual = await sut.getDatasetFileCounts( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - testCriteria, - ); - assert.match(actual.total, expectedFileCountsForCriteria.total); - expect(actual.perContentType).to.have.deep.members(expectedFileCountsForCriteria.perContentType); - expect(actual.perAccessStatus).to.have.deep.members(expectedFileCountsForCriteria.perAccessStatus); - expect(actual.perCategoryName).to.have.deep.members(expectedFileCountsForCriteria.perCategoryName); - }); + testCriteria + ) + assert.match(actual.total, expectedFileCountsForCriteria.total) + expect(actual.perContentType).to.have.deep.members( + expectedFileCountsForCriteria.perContentType + ) + expect(actual.perAccessStatus).to.have.deep.members( + expectedFileCountsForCriteria.perAccessStatus + ) + expect(actual.perCategoryName).to.have.deep.members( + expectedFileCountsForCriteria.perCategoryName + ) + }) test('should return file count filtering by persistent id', async () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); - const actual = await sut.getDatasetFileCounts(testDataset.persistentId, latestDatasetVersionId, false); - assert.match(actual.total, expectedFileCounts.total); - expect(actual.perContentType).to.have.deep.members(expectedFileCounts.perContentType); - expect(actual.perAccessStatus).to.have.deep.members(expectedFileCounts.perAccessStatus); - expect(actual.perCategoryName).to.have.deep.members(expectedFileCounts.perCategoryName); - }); - }); + false + ) + const actual = await sut.getDatasetFileCounts( + testDataset.persistentId, + latestDatasetVersionId, + false + ) + assert.match(actual.total, expectedFileCounts.total) + expect(actual.perContentType).to.have.deep.members(expectedFileCounts.perContentType) + expect(actual.perAccessStatus).to.have.deep.members(expectedFileCounts.perAccessStatus) + expect(actual.perCategoryName).to.have.deep.members(expectedFileCounts.perCategoryName) + }) + }) describe('getDatasetFilesTotalDownloadSize', () => { - const expectedTotalDownloadSize = 193; // 193 bytes + const expectedTotalDownloadSize = 193 // 193 bytes test('should return total download size filtering by numeric id and ignoring original tabular size', async () => { const actual = await sut.getDatasetFilesTotalDownloadSize( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - FileDownloadSizeMode.ORIGINAL, - ); - assert.match(actual, expectedTotalDownloadSize); - }); + FileDownloadSizeMode.ORIGINAL + ) + assert.match(actual, expectedTotalDownloadSize) + }) test('should return total download size filtering by persistent id and ignoring original tabular size', async () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); + false + ) const actual = await sut.getDatasetFilesTotalDownloadSize( testDataset.persistentId, latestDatasetVersionId, false, - FileDownloadSizeMode.ORIGINAL, - ); - assert.match(actual, expectedTotalDownloadSize); - }); + FileDownloadSizeMode.ORIGINAL + ) + assert.match(actual, expectedTotalDownloadSize) + }) test('should return total download size filtering by numeric id, ignoring original tabular size and applying category criteria', async () => { - const expectedTotalDownloadSizeForCriteria = 12; // 12 bytes - const testCriteria = new FileSearchCriteria().withCategoryName(testCategoryName); + const expectedTotalDownloadSizeForCriteria = 12 // 12 bytes + const testCriteria = new FileSearchCriteria().withCategoryName(testCategoryName) const actual = await sut.getDatasetFilesTotalDownloadSize( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, FileDownloadSizeMode.ORIGINAL, - testCriteria, - ); - assert.match(actual, expectedTotalDownloadSizeForCriteria); - }); - }); + testCriteria + ) + assert.match(actual, expectedTotalDownloadSizeForCriteria) + }) + }) describe('getFileDownloadCount', () => { test('should return count filtering by file id and version id', async () => { @@ -354,24 +389,24 @@ describe('FilesRepository', () => { TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - FileOrderCriteria.NAME_AZ, - ); - const testFile = currentTestFilesSubset.files[0]; - const actual = await sut.getFileDownloadCount(testFile.id); - assert.match(actual, 0); - }); + FileOrderCriteria.NAME_AZ + ) + const testFile = currentTestFilesSubset.files[0] + const actual = await sut.getFileDownloadCount(testFile.id) + assert.match(actual, 0) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getFileDownloadCount(nonExistentFiledId).catch((e) => (error = e)); + await sut.getFileDownloadCount(nonExistentFiledId).catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] File with ID ${nonExistentFiledId} not found.`, - ); - }); - }); + `There was an error when reading the resource. Reason was: [404] File with ID ${nonExistentFiledId} not found.` + ) + }) + }) describe('getFileUserPermissions', () => { test('should return user permissions filtering by file id and version id', async () => { @@ -379,26 +414,26 @@ describe('FilesRepository', () => { TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - FileOrderCriteria.NAME_AZ, - ); - const testFile = currentTestFilesSubset.files[0]; - const actual = await sut.getFileUserPermissions(testFile.id); - assert.match(actual.canDownloadFile, true); - assert.match(actual.canManageFilePermissions, true); - assert.match(actual.canEditOwnerDataset, true); - }); + FileOrderCriteria.NAME_AZ + ) + const testFile = currentTestFilesSubset.files[0] + const actual = await sut.getFileUserPermissions(testFile.id) + assert.match(actual.canDownloadFile, true) + assert.match(actual.canManageFilePermissions, true) + assert.match(actual.canEditOwnerDataset, true) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getFileUserPermissions(nonExistentFiledId).catch((e) => (error = e)); + await sut.getFileUserPermissions(nonExistentFiledId).catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] File with ID ${nonExistentFiledId} not found.`, - ); - }); - }); + `There was an error when reading the resource. Reason was: [404] File with ID ${nonExistentFiledId} not found.` + ) + }) + }) describe('getFileDataTables', () => { test('should return data tables filtering by tabular file id and version id', async () => { @@ -406,117 +441,121 @@ describe('FilesRepository', () => { TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - FileOrderCriteria.NAME_AZ, - ); - const testFile = currentTestFilesSubset.files[3]; - const actual = await sut.getFileDataTables(testFile.id); - assert.match(actual[0].varQuantity, 3); - }); + FileOrderCriteria.NAME_AZ + ) + const testFile = currentTestFilesSubset.files[3] + const actual = await sut.getFileDataTables(testFile.id) + assert.match(actual[0].varQuantity, 3) + }) test('should return error when file is not tabular and version id', async () => { const currentTestFilesSubset = await sut.getDatasetFiles( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, false, - FileOrderCriteria.NAME_AZ, - ); - const testFile = currentTestFilesSubset.files[0]; + FileOrderCriteria.NAME_AZ + ) + const testFile = currentTestFilesSubset.files[0] - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getFileDataTables(testFile.id).catch((e) => (error = e)); + await sut.getFileDataTables(testFile.id).catch((e) => (error = e)) assert.match( error.message, - 'There was an error when reading the resource. Reason was: [400] This operation is only available for tabular files.', - ); - }); + 'There was an error when reading the resource. Reason was: [400] This operation is only available for tabular files.' + ) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getFileDataTables(nonExistentFiledId).catch((e) => (error = e)); + await sut.getFileDataTables(nonExistentFiledId).catch((e) => (error = e)) assert.match( error.message, - 'There was an error when reading the resource. Reason was: [404] File not found for given id.', - ); - }); - }); + 'There was an error when reading the resource. Reason was: [404] File not found for given id.' + ) + }) + }) describe('getFile', () => { describe('by numeric id', () => { - test('should return file when providing a valid id', async () => { - const actual = await sut.getFile(testFileId, DatasetNotNumberedVersion.LATEST); + test('should return file when providing a valid id', async () => { + const actual = await sut.getFile(testFileId, DatasetNotNumberedVersion.LATEST) - assert.match(actual.name, testTextFile1Name); - }); + assert.match(actual.name, testTextFile1Name) + }) test('should return file draft when providing a valid id and version is draft', async () => { - const actual = await sut.getFile(testFileId, DatasetNotNumberedVersion.DRAFT); + const actual = await sut.getFile(testFileId, DatasetNotNumberedVersion.DRAFT) - assert.match(actual.name, testTextFile1Name); - }); + assert.match(actual.name, testTextFile1Name) + }) test('should return Not Implemented Yet error when when providing a valid id and version is different than latest and draft', async () => { // This tests can be removed once the API supports getting a file by version - let error: ReadError = undefined; + let error: ReadError = undefined + + await sut.getFile(testFileId, '1.0').catch((e) => (error = e)) + + assert.match( + error.message, + `Requesting a file by its dataset version is not yet supported. Requested version: 1.0. Please try using the :latest or :draft version instead.` + ) + }) - await sut.getFile(testFileId, '1.0').catch((e) => (error = e)); + test('should return error when file does not exist', async () => { + let error: ReadError = undefined + + await sut + .getFile(nonExistentFiledId, DatasetNotNumberedVersion.LATEST) + .catch((e) => (error = e)) assert.match( - error.message, - `Requesting a file by its dataset version is not yet supported. Requested version: 1.0. Please try using the :latest or :draft version instead.`, - ); - }); - - test('should return error when file does not exist', async () => { - let error: ReadError = undefined; - - await sut.getFile(nonExistentFiledId, DatasetNotNumberedVersion.LATEST).catch((e) => (error = e)); - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.`, - ); - }); - }); + error.message, + `There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.` + ) + }) + }) describe('by persistent id', () => { test('should return file when providing a valid persistent id', async () => { - const actual = await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.LATEST); + const actual = await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.LATEST) - assert.match(actual.name, testTextFile1Name); - }); + assert.match(actual.name, testTextFile1Name) + }) test('should return file draft when providing a valid persistent id and version is draft', async () => { - const actual = await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.DRAFT); + const actual = await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.DRAFT) - assert.match(actual.name, testTextFile1Name); - }); + assert.match(actual.name, testTextFile1Name) + }) test('should return Not Implemented Yet error when when providing a valid persistent id and version is different than latest and draft', async () => { // This tests can be removed once the API supports getting a file by version - let error: ReadError = undefined; + let error: ReadError = undefined - await sut.getFile(testFilePersistentId, '1.0').catch((e) => (error = e)); + await sut.getFile(testFilePersistentId, '1.0').catch((e) => (error = e)) assert.match( - error.message, - `Requesting a file by its dataset version is not yet supported. Requested version: 1.0. Please try using the :latest or :draft version instead.`, - ); - }); + error.message, + `Requesting a file by its dataset version is not yet supported. Requested version: 1.0. Please try using the :latest or :draft version instead.` + ) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; + let error: ReadError = undefined - const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId'; - await sut.getFile(nonExistentFiledPersistentId, DatasetNotNumberedVersion.LATEST).catch((e) => (error = e)); + const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId' + await sut + .getFile(nonExistentFiledPersistentId, DatasetNotNumberedVersion.LATEST) + .catch((e) => (error = e)) assert.match( - error.message, - `There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.`, - ); - }); - }); - }); -}); + error.message, + `There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.` + ) + }) + }) + }) +}) diff --git a/test/integration/info/DataverseInfoRepository.test.ts b/test/integration/info/DataverseInfoRepository.test.ts index a8342df7..37ef9891 100644 --- a/test/integration/info/DataverseInfoRepository.test.ts +++ b/test/integration/info/DataverseInfoRepository.test.ts @@ -1,51 +1,60 @@ -import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; -import { setMaxEmbargoDurationInMonthsViaApi } from '../../testHelpers/info/infoHelper'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert } from 'sinon'; -import { fail } from 'assert'; +import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' +import { setMaxEmbargoDurationInMonthsViaApi } from '../../testHelpers/info/infoHelper' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert } from 'sinon' +import { fail } from 'assert' describe('DataverseInfoRepository', () => { - const sut: DataverseInfoRepository = new DataverseInfoRepository(); + const sut: DataverseInfoRepository = new DataverseInfoRepository() beforeAll(async () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) + }) describe('getDataverseVersion', () => { test('should return Dataverse version', async () => { - const actual = await sut.getDataverseVersion(); - expect(typeof actual.number).toBe('string'); - }); - }); + const actual = await sut.getDataverseVersion() + expect(typeof actual.number).toBe('string') + }) + }) describe('getZipDownloadLimit', () => { test('should return zip download limit', async () => { - const actual = await sut.getZipDownloadLimit(); - expect(typeof actual).toBe('number'); - }); - }); + const actual = await sut.getZipDownloadLimit() + expect(typeof actual).toBe('number') + }) + }) describe('getMaxEmbargoDurationInMonths', () => { test('should return error when the setting does not exist', async () => { - let error: ReadError = undefined; - await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)) assert.match( error.message, - 'There was an error when reading the resource. Reason was: [404] Setting :MaxEmbargoDurationInMonths not found', - ); - }); + 'There was an error when reading the resource. Reason was: [404] Setting :MaxEmbargoDurationInMonths not found' + ) + }) test('should return duration when the setting exists', async () => { - const testMaxEmbargoDurationInMonths = 12; + const testMaxEmbargoDurationInMonths = 12 await setMaxEmbargoDurationInMonthsViaApi(testMaxEmbargoDurationInMonths) .then() .catch(() => { - fail('Test getMaxEmbargoDurationInMonths: Error while setting :MaxEmbargoDurationInMonths'); - }); - const actual = await sut.getMaxEmbargoDurationInMonths(); - assert.match(actual, testMaxEmbargoDurationInMonths); - }); - }); -}); + fail( + 'Test getMaxEmbargoDurationInMonths: Error while setting :MaxEmbargoDurationInMonths' + ) + }) + const actual = await sut.getMaxEmbargoDurationInMonths() + assert.match(actual, testMaxEmbargoDurationInMonths) + }) + }) +}) diff --git a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts index b3b1f7dc..8ef0d8b3 100644 --- a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts @@ -1,29 +1,36 @@ -import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert } from 'sinon'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert } from 'sinon' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' describe('getMetadataBlockByName', () => { - const sut: MetadataBlocksRepository = new MetadataBlocksRepository(); + const sut: MetadataBlocksRepository = new MetadataBlocksRepository() - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) test('should return error when metadata block does not exist', async () => { - let error: ReadError = undefined; - const nonExistentMetadataBlockName = 'nonExistentMetadataBlock'; - await sut.getMetadataBlockByName(nonExistentMetadataBlockName).catch((e) => (error = e)); + let error: ReadError = undefined + const nonExistentMetadataBlockName = 'nonExistentMetadataBlock' + await sut.getMetadataBlockByName(nonExistentMetadataBlockName).catch((e) => (error = e)) assert.match( error.message, - `There was an error when reading the resource. Reason was: [404] Can't find metadata block '${nonExistentMetadataBlockName}'`, - ); - }); + `There was an error when reading the resource. Reason was: [404] Can't find metadata block '${nonExistentMetadataBlockName}'` + ) + }) test('should return metadata block when it exists', async () => { - const citationMetadataBlockName = 'citation'; - const actual = await sut.getMetadataBlockByName(citationMetadataBlockName); + const citationMetadataBlockName = 'citation' + const actual = await sut.getMetadataBlockByName(citationMetadataBlockName) - assert.match(actual.name, citationMetadataBlockName); - }); -}); + assert.match(actual.name, citationMetadataBlockName) + }) +}) diff --git a/test/integration/users/UsersRepository.test.ts b/test/integration/users/UsersRepository.test.ts index a8e98c16..696c1034 100644 --- a/test/integration/users/UsersRepository.test.ts +++ b/test/integration/users/UsersRepository.test.ts @@ -1,26 +1,36 @@ -import { UsersRepository } from '../../../src/users/infra/repositories/UsersRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert } from 'sinon'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { UsersRepository } from '../../../src/users/infra/repositories/UsersRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert } from 'sinon' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' describe('getCurrentAuthenticatedUser', () => { - const sut: UsersRepository = new UsersRepository(); + const sut: UsersRepository = new UsersRepository() test('should return error when authentication is not valid', async () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, 'invalidApiKey'); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, 'invalidApiKey') - let error: ReadError = undefined; - await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)) - assert.match(error.message, 'There was an error when reading the resource. Reason was: [401] Bad API key'); - }); + assert.match( + error.message, + 'There was an error when reading the resource. Reason was: [401] Bad API key' + ) + }) test('should return authenticated user when valid authentication is provided', async () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) - const actual = await sut.getCurrentAuthenticatedUser(); + const actual = await sut.getCurrentAuthenticatedUser() - assert.match(actual.firstName, 'Dataverse'); - }); -}); + assert.match(actual.firstName, 'Dataverse') + }) +}) diff --git a/test/testHelpers/TestConstants.ts b/test/testHelpers/TestConstants.ts index 5ef4dc4e..295a8c36 100644 --- a/test/testHelpers/TestConstants.ts +++ b/test/testHelpers/TestConstants.ts @@ -1,47 +1,48 @@ export class TestConstants { - static readonly TEST_API_URL = 'http://localhost:8080/api/v1'; - static readonly TEST_DUMMY_API_KEY = 'dummyApiKey'; - static readonly TEST_DUMMY_PERSISTENT_ID = 'doi:11.1111/AA1/AA1AAA'; + static readonly TEST_API_URL = 'http://localhost:8080/api/v1' + static readonly TEST_DUMMY_API_KEY = 'dummyApiKey' + static readonly TEST_DUMMY_PERSISTENT_ID = 'doi:11.1111/AA1/AA1AAA' static readonly TEST_ERROR_RESPONSE = { response: { status: 'ERROR', - message: 'test', - }, - }; + message: 'test' + } + } static readonly TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY = { params: {}, headers: { 'Content-Type': 'application/json', - 'X-Dataverse-Key': TestConstants.TEST_DUMMY_API_KEY, - }, - }; + 'X-Dataverse-Key': TestConstants.TEST_DUMMY_API_KEY + } + } static readonly TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED = { params: { includeDeaccessioned: true }, headers: { 'Content-Type': 'application/json', - 'X-Dataverse-Key': TestConstants.TEST_DUMMY_API_KEY, - }, - }; + 'X-Dataverse-Key': TestConstants.TEST_DUMMY_API_KEY + } + } static readonly TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE = { withCredentials: true, params: {}, headers: { - 'Content-Type': 'application/json', - }, - }; - static readonly TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE_INCLUDE_DEACCESSIONED = { - withCredentials: true, - params: { includeDeaccessioned: true }, - headers: { - 'Content-Type': 'application/json', - }, - }; + 'Content-Type': 'application/json' + } + } + static readonly TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE_INCLUDE_DEACCESSIONED = + { + withCredentials: true, + params: { includeDeaccessioned: true }, + headers: { + 'Content-Type': 'application/json' + } + } static readonly TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG = { params: {}, headers: { - 'Content-Type': 'application/json', - }, - }; - static readonly TEST_CREATED_DATASET_1_ID = 2; - static readonly TEST_CREATED_DATASET_2_ID = 3; + 'Content-Type': 'application/json' + } + } + static readonly TEST_CREATED_DATASET_1_ID = 2 + static readonly TEST_CREATED_DATASET_2_ID = 3 } diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index b257a0b8..4432fb00 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -1,22 +1,26 @@ -import { Dataset, DatasetVersionState, DatasetLicense } from '../../../src/datasets/domain/models/Dataset'; -import TurndownService from 'turndown'; -import axios, { AxiosResponse } from 'axios'; -import { TestConstants } from '../TestConstants'; +import { + Dataset, + DatasetVersionState, + DatasetLicense +} from '../../../src/datasets/domain/models/Dataset' +import TurndownService from 'turndown' +import axios, { AxiosResponse } from 'axios' +import { TestConstants } from '../TestConstants' -const turndownService = new TurndownService(); +const turndownService = new TurndownService() -const DATASET_CREATE_TIME_STR = '2023-05-15T08:21:01Z'; -const DATASET_UPDATE_TIME_STR = '2023-05-15T08:21:03Z'; -const DATASET_RELEASE_TIME_STR = '2023-05-15T08:21:03Z'; +const DATASET_CREATE_TIME_STR = '2023-05-15T08:21:01Z' +const DATASET_UPDATE_TIME_STR = '2023-05-15T08:21:03Z' +const DATASET_RELEASE_TIME_STR = '2023-05-15T08:21:03Z' -const DATASET_PUBLICATION_DATE_STR = '2023-05-15'; +const DATASET_PUBLICATION_DATE_STR = '2023-05-15' const DATASET_HTML_DESCRIPTION = - '

Title 1

Test paragraph 1

Test paragraph 2

Hello world

Title 2

Title 3

'; + '

Title 1

Test paragraph 1

Test paragraph 2

Hello world

Title 2

Title 3

' const DATAVERSE_API_REQUEST_HEADERS = { - headers: { 'Content-Type': 'application/json', 'X-Dataverse-Key': process.env.TEST_API_KEY }, -}; + headers: { 'Content-Type': 'application/json', 'X-Dataverse-Key': process.env.TEST_API_KEY } +} export const createDatasetModel = (license?: DatasetLicense): Dataset => { const datasetModel: Dataset = { @@ -29,7 +33,7 @@ export const createDatasetModel = (license?: DatasetLicense): Dataset => { state: DatasetVersionState.RELEASED, createTime: new Date(DATASET_CREATE_TIME_STR), lastUpdateTime: new Date(DATASET_UPDATE_TIME_STR), - releaseTime: new Date(DATASET_RELEASE_TIME_STR), + releaseTime: new Date(DATASET_RELEASE_TIME_STR) }, publicationDate: DATASET_PUBLICATION_DATE_STR, metadataBlocks: [ @@ -40,34 +44,34 @@ export const createDatasetModel = (license?: DatasetLicense): Dataset => { author: [ { authorName: 'Admin, Dataverse', - authorAffiliation: 'Dataverse.org', + authorAffiliation: 'Dataverse.org' }, { authorName: 'Owner, Dataverse', - authorAffiliation: 'Dataverse.org', - }, + authorAffiliation: 'Dataverse.org' + } ], subject: ['Subject1', 'Subject2'], dsDescription: [ { - dsDescriptionValue: turndownService.turndown(DATASET_HTML_DESCRIPTION), - }, + dsDescriptionValue: turndownService.turndown(DATASET_HTML_DESCRIPTION) + } ], datasetContact: [ { datasetContactName: 'Admin, Dataverse', - datasetContactEmail: 'someemail@test.com', - }, - ], - }, - }, - ], - }; + datasetContactEmail: 'someemail@test.com' + } + ] + } + } + ] + } if (license !== undefined) { - datasetModel.license = license; + datasetModel.license = license } - return datasetModel; -}; + return datasetModel +} // eslint-disable-next-line @typescript-eslint/no-explicit-any export const createDatasetVersionPayload = (license?: DatasetLicense): any => { @@ -85,7 +89,7 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { license: { name: 'CC0 1.0', uri: 'https://creativecommons.org/publicdomain/zero/1.0/', - iconUri: 'https://licensebuttons.net/p/zero/1.0/88x31.png', + iconUri: 'https://licensebuttons.net/p/zero/1.0/88x31.png' }, metadataBlocks: { citation: { @@ -95,7 +99,7 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { typeName: 'title', multiple: false, typeClass: 'primitive', - value: 'test', + value: 'test' }, { typeName: 'author', @@ -107,36 +111,36 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { typeName: 'authorName', multiple: false, typeClass: 'primitive', - value: 'Admin, Dataverse', + value: 'Admin, Dataverse' }, authorAffiliation: { typeName: 'authorAffiliation', multiple: false, typeClass: 'primitive', - value: 'Dataverse.org', - }, + value: 'Dataverse.org' + } }, { authorName: { typeName: 'authorName', multiple: false, typeClass: 'primitive', - value: 'Owner, Dataverse', + value: 'Owner, Dataverse' }, authorAffiliation: { typeName: 'authorAffiliation', multiple: false, typeClass: 'primitive', - value: 'Dataverse.org', - }, - }, - ], + value: 'Dataverse.org' + } + } + ] }, { typeName: 'subject', multiple: true, typeClass: 'controlledVocabulary', - value: ['Subject1', 'Subject2'], + value: ['Subject1', 'Subject2'] }, { typeName: 'dsDescription', @@ -148,10 +152,10 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { typeName: 'dsDescriptionValue', multiple: false, typeClass: 'primitive', - value: DATASET_HTML_DESCRIPTION, - }, - }, - ], + value: DATASET_HTML_DESCRIPTION + } + } + ] }, { typeName: 'datasetContact', @@ -163,87 +167,94 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { typeName: 'datasetContactName', multiple: false, typeClass: 'primitive', - value: 'Admin, Dataverse', + value: 'Admin, Dataverse' }, datasetContactEmail: { typeName: 'datasetContactEmail', multiple: false, typeClass: 'primitive', - value: 'someemail@test.com', - }, - }, - ], - }, - ], - }, + value: 'someemail@test.com' + } + } + ] + } + ] + } }, - files: [], - }; + files: [] + } if (license !== undefined) { - datasetPayload.license = license; + datasetPayload.license = license } - return datasetPayload; -}; + return datasetPayload +} -export const createDatasetLicenseModel = (withIconUri: boolean = true): DatasetLicense => { +export const createDatasetLicenseModel = (withIconUri = true): DatasetLicense => { const datasetLicense: DatasetLicense = { name: 'CC0 1.0', - uri: 'https://creativecommons.org/publicdomain/zero/1.0/', - }; + uri: 'https://creativecommons.org/publicdomain/zero/1.0/' + } if (withIconUri) { - datasetLicense.iconUri = 'https://licensebuttons.net/p/zero/1.0/88x31.png'; + datasetLicense.iconUri = 'https://licensebuttons.net/p/zero/1.0/88x31.png' } - return datasetLicense; -}; + return datasetLicense +} export const publishDatasetViaApi = async (datasetId: number): Promise => { return await axios.post( `${TestConstants.TEST_API_URL}/datasets/${datasetId}/actions/:publish?type=major`, {}, - DATAVERSE_API_REQUEST_HEADERS, - ); -}; + DATAVERSE_API_REQUEST_HEADERS + ) +} -export const deaccessionDatasetViaApi = async (datasetId: number, versionId: string): Promise => { - const data = { deaccessionReason: 'Test reason.' }; +export const deaccessionDatasetViaApi = async ( + datasetId: number, + versionId: string +): Promise => { + const data = { deaccessionReason: 'Test reason.' } return await axios.post( `${TestConstants.TEST_API_URL}/datasets/${datasetId}/versions/${versionId}/deaccession`, JSON.stringify(data), - DATAVERSE_API_REQUEST_HEADERS, - ); -}; + DATAVERSE_API_REQUEST_HEADERS + ) +} export const createPrivateUrlViaApi = async (datasetId: number): Promise => { return await axios.post( `${TestConstants.TEST_API_URL}/datasets/${datasetId}/privateUrl`, {}, - DATAVERSE_API_REQUEST_HEADERS, - ); -}; + DATAVERSE_API_REQUEST_HEADERS + ) +} -export const waitForNoLocks = async (datasetId: number, maxRetries = 20, delay = 1000): Promise => { - let hasLocks = true; - let retry = 0; +export const waitForNoLocks = async ( + datasetId: number, + maxRetries = 20, + delay = 1000 +): Promise => { + let hasLocks = true + let retry = 0 while (hasLocks && retry < maxRetries) { await axios .get(`${TestConstants.TEST_API_URL}/datasets/${datasetId}/locks`) .then((response) => { - const nLocks = response.data.data.length; + const nLocks = response.data.data.length if (nLocks == 0) { - hasLocks = false; + hasLocks = false } }) .catch((error) => { console.log( `Error while waiting for no dataset locks: [${error.response.status}]${ error.response.data ? ` ${error.response.data.message}` : '' - }`, - ); - }); - await new Promise((resolve) => setTimeout(resolve, delay)); - retry++; + }` + ) + }) + await new Promise((resolve) => setTimeout(resolve, delay)) + retry++ } if (hasLocks) { - throw new Error('Max retries reached.'); + throw new Error('Max retries reached.') } -}; +} diff --git a/test/testHelpers/datasets/datasetLockHelper.ts b/test/testHelpers/datasets/datasetLockHelper.ts index ce3d8a8d..23b34fe9 100644 --- a/test/testHelpers/datasets/datasetLockHelper.ts +++ b/test/testHelpers/datasets/datasetLockHelper.ts @@ -1,5 +1,5 @@ -import { DatasetLock, DatasetLockType } from '../../../src/datasets/domain/models/DatasetLock'; -import { DatasetLockPayload } from '../../../src/datasets/infra/repositories/transformers/datasetLocksTransformers'; +import { DatasetLock, DatasetLockType } from '../../../src/datasets/domain/models/DatasetLock' +import { DatasetLockPayload } from '../../../src/datasets/infra/repositories/transformers/datasetLocksTransformers' export const createDatasetLockModel = (): DatasetLock => { return { @@ -7,9 +7,9 @@ export const createDatasetLockModel = (): DatasetLock => { date: '2023-05-15T08:21:03Z', userId: '1', datasetPersistentId: 'doi:10.5072/FK2/QYOVTJ', - message: 'Test.', - }; -}; + message: 'Test.' + } +} export const createDatasetLockPayload = (): DatasetLockPayload => { return { @@ -17,6 +17,6 @@ export const createDatasetLockPayload = (): DatasetLockPayload => { date: '2023-05-15T08:21:03Z', user: '1', dataset: 'doi:10.5072/FK2/QYOVTJ', - message: 'Test.', - }; -}; + message: 'Test.' + } +} diff --git a/test/testHelpers/datasets/datasetPreviewHelper.ts b/test/testHelpers/datasets/datasetPreviewHelper.ts index 51ec988a..f822a3a8 100644 --- a/test/testHelpers/datasets/datasetPreviewHelper.ts +++ b/test/testHelpers/datasets/datasetPreviewHelper.ts @@ -1,13 +1,13 @@ -import { DatasetPreview } from '../../../src/datasets/domain/models/DatasetPreview'; -import { DatasetVersionState } from '../../../src/datasets/domain/models/Dataset'; -import { DatasetPreviewPayload } from '../../../src/datasets/infra/repositories/transformers/datasetPreviewsTransformers'; +import { DatasetPreview } from '../../../src/datasets/domain/models/DatasetPreview' +import { DatasetVersionState } from '../../../src/datasets/domain/models/Dataset' +import { DatasetPreviewPayload } from '../../../src/datasets/infra/repositories/transformers/datasetPreviewsTransformers' -const DATASET_CREATE_TIME_STR = '2023-05-15T08:21:01Z'; -const DATASET_UPDATE_TIME_STR = '2023-05-15T08:21:03Z'; -const DATASET_RELEASE_TIME_STR = '2023-05-15T08:21:03Z'; +const DATASET_CREATE_TIME_STR = '2023-05-15T08:21:01Z' +const DATASET_UPDATE_TIME_STR = '2023-05-15T08:21:03Z' +const DATASET_RELEASE_TIME_STR = '2023-05-15T08:21:03Z' const DATASET_CITATION = - 'Doe, John, 2023, "Test Dataset 1", https://doi.org/10.5072/FK2/XXXXXX, Root, V1, UNF:6:AAc5A5tAI9AVodAAAsOysA== [fileUNF]'; + 'Doe, John, 2023, "Test Dataset 1", https://doi.org/10.5072/FK2/XXXXXX, Root, V1, UNF:6:AAc5A5tAI9AVodAAAsOysA== [fileUNF]' export const createDatasetPreviewModel = (): DatasetPreview => { const datasetPreviewModel: DatasetPreview = { @@ -20,13 +20,13 @@ export const createDatasetPreviewModel = (): DatasetPreview => { state: DatasetVersionState.RELEASED, createTime: new Date(DATASET_CREATE_TIME_STR), lastUpdateTime: new Date(DATASET_UPDATE_TIME_STR), - releaseTime: new Date(DATASET_RELEASE_TIME_STR), + releaseTime: new Date(DATASET_RELEASE_TIME_STR) }, citation: DATASET_CITATION, - description: 'test', - }; - return datasetPreviewModel; -}; + description: 'test' + } + return datasetPreviewModel +} export const createDatasetPreviewPayload = (): DatasetPreviewPayload => { return { @@ -40,6 +40,6 @@ export const createDatasetPreviewPayload = (): DatasetPreviewPayload => { updatedAt: DATASET_UPDATE_TIME_STR, published_at: DATASET_RELEASE_TIME_STR, citation: DATASET_CITATION, - description: 'test', - }; -}; + description: 'test' + } +} diff --git a/test/testHelpers/datasets/datasetUserPermissionsHelper.ts b/test/testHelpers/datasets/datasetUserPermissionsHelper.ts index 07a35375..3d31cff1 100644 --- a/test/testHelpers/datasets/datasetUserPermissionsHelper.ts +++ b/test/testHelpers/datasets/datasetUserPermissionsHelper.ts @@ -1,4 +1,4 @@ -import { DatasetUserPermissions } from '../../../src/datasets/domain/models/DatasetUserPermissions'; +import { DatasetUserPermissions } from '../../../src/datasets/domain/models/DatasetUserPermissions' export const createDatasetUserPermissionsModel = (): DatasetUserPermissions => { return { @@ -6,6 +6,6 @@ export const createDatasetUserPermissionsModel = (): DatasetUserPermissions => { canEditDataset: true, canPublishDataset: true, canManageDatasetPermissions: true, - canDeleteDatasetDraft: true, - }; -}; + canDeleteDatasetDraft: true + } +} diff --git a/test/testHelpers/files/fileCountsHelper.ts b/test/testHelpers/files/fileCountsHelper.ts index c863ac2b..32114731 100644 --- a/test/testHelpers/files/fileCountsHelper.ts +++ b/test/testHelpers/files/fileCountsHelper.ts @@ -1,5 +1,5 @@ -import { FileCounts } from '../../../src/files/domain/models/FileCounts'; -import { FileAccessStatus } from '../../../src/files/domain/models/FileCriteria'; +import { FileCounts } from '../../../src/files/domain/models/FileCounts' +import { FileAccessStatus } from '../../../src/files/domain/models/FileCriteria' export const createFileCountsModel = (): FileCounts => { return { @@ -7,40 +7,40 @@ export const createFileCountsModel = (): FileCounts => { perContentType: [ { contentType: 'text/plain', - count: 4, - }, + count: 4 + } ], perAccessStatus: [ { accessStatus: FileAccessStatus.PUBLIC, - count: 3, + count: 3 }, { accessStatus: FileAccessStatus.RESTRICTED, - count: 1, - }, + count: 1 + } ], perCategoryName: [ { categoryName: 'testCategory', - count: 2, - }, - ], - }; -}; + count: 2 + } + ] + } +} export const createFileCountsPayload = (): any => { return { total: 4, perContentType: { - 'text/plain': 4, + 'text/plain': 4 }, perAccessStatus: { Public: 3, - Restricted: 1, + Restricted: 1 }, perCategoryName: { - testCategory: 2, - }, - }; -}; + testCategory: 2 + } + } +} diff --git a/test/testHelpers/files/fileDataTablesHelper.ts b/test/testHelpers/files/fileDataTablesHelper.ts index 94c490bb..7ef5b33f 100644 --- a/test/testHelpers/files/fileDataTablesHelper.ts +++ b/test/testHelpers/files/fileDataTablesHelper.ts @@ -1,8 +1,8 @@ import { FileDataTable, FileDataVariableIntervalType, - FileDataVariableFormatType, -} from '../../../src/files/domain/models/FileDataTable'; + FileDataVariableFormatType +} from '../../../src/files/domain/models/FileDataTable' export const createFileDataTableModel = (): FileDataTable => { return { @@ -24,8 +24,8 @@ export const createFileDataTableModel = (): FileDataTable => { summaryStatistics: { medn: '28.27591', mode: '.', - min: '27.6741', - }, + min: '27.6741' + } }, { id: 15, @@ -37,11 +37,11 @@ export const createFileDataTableModel = (): FileDataTable => { isOrderedCategorical: false, fileOrder: 1, UNF: 'UNF:6:KPoFCWSEsLpy11Lh11CXWQ==', - variableMetadata: [], - }, - ], - }; -}; + variableMetadata: [] + } + ] + } +} export const createFileDataTablePayload = (): any => { return { @@ -63,8 +63,8 @@ export const createFileDataTablePayload = (): any => { summaryStatistics: { medn: '28.27591', mode: '.', - min: '27.6741', - }, + min: '27.6741' + } }, { id: 15, @@ -76,8 +76,8 @@ export const createFileDataTablePayload = (): any => { isOrderedCategorical: false, fileOrder: 1, UNF: 'UNF:6:KPoFCWSEsLpy11Lh11CXWQ==', - variableMetadata: [], - }, - ], - }; -}; + variableMetadata: [] + } + ] + } +} diff --git a/test/testHelpers/files/fileUserPermissionsHelper.ts b/test/testHelpers/files/fileUserPermissionsHelper.ts index c279c2d6..1a08ae70 100644 --- a/test/testHelpers/files/fileUserPermissionsHelper.ts +++ b/test/testHelpers/files/fileUserPermissionsHelper.ts @@ -1,9 +1,9 @@ -import { FileUserPermissions } from '../../../src/files/domain/models/FileUserPermissions'; +import { FileUserPermissions } from '../../../src/files/domain/models/FileUserPermissions' export const createFileUserPermissionsModel = (): FileUserPermissions => { return { canDownloadFile: true, canManageFilePermissions: true, - canEditOwnerDataset: true, - }; -}; + canEditOwnerDataset: true + } +} diff --git a/test/testHelpers/files/filesHelper.ts b/test/testHelpers/files/filesHelper.ts index fb16e1bb..a703cc76 100644 --- a/test/testHelpers/files/filesHelper.ts +++ b/test/testHelpers/files/filesHelper.ts @@ -1,8 +1,8 @@ -import { File } from '../../../src/files/domain/models/File'; -import axios, { AxiosResponse } from 'axios'; -import { TestConstants } from '../TestConstants'; -import { readFile } from 'fs/promises'; -import {FilesSubset} from "../../../src/files/domain/models/FilesSubset"; +import { File } from '../../../src/files/domain/models/File' +import axios, { AxiosResponse } from 'axios' +import { TestConstants } from '../TestConstants' +import { readFile } from 'fs/promises' +import { FilesSubset } from '../../../src/files/domain/models/FilesSubset' interface FileMetadata { categories?: string[] @@ -27,27 +27,27 @@ export const createFileModel = (): File => { creationDate: new Date('2023-07-11'), embargo: { dateAvailable: new Date('2023-07-11'), - reason: 'test', + reason: 'test' }, checksum: { type: 'MD5', - value: '29e413e0c881e17314ce8116fed4d1a7', + value: '29e413e0c881e17314ce8116fed4d1a7' }, deleted: false, tabularData: false, - fileAccessRequest: true, - }; -}; + fileAccessRequest: true + } +} export const createManyFilesModel = (amount: number): File[] => { - return Array.from({ length: amount }, () => createFileModel()); + return Array.from({ length: amount }, () => createFileModel()) } export const createFilesSubsetModel = (amount: number): FilesSubset => { - return { - files: createManyFilesModel(amount), - totalFilesCount: amount, - }; + return { + files: createManyFilesModel(amount), + totalFilesCount: amount + } } export const createFilePayload = (): any => { @@ -73,57 +73,75 @@ export const createFilePayload = (): any => { varGroups: [], embargo: { dateAvailable: '2023-07-11', - reason: 'test', + reason: 'test' }, checksum: { type: 'MD5', - value: '29e413e0c881e17314ce8116fed4d1a7', + value: '29e413e0c881e17314ce8116fed4d1a7' }, deleted: false, tabularData: false, - fileAccessRequest: true, - }, - }; -}; + fileAccessRequest: true + } + } +} export const createManyFilesPayload = (amount: number): any[] => { - return Array.from({ length: amount }, () => createFilePayload()); + return Array.from({ length: amount }, () => createFilePayload()) } -export const uploadFileViaApi = async (datasetId: number, fileName: string, fileMetadata?: FileMetadata): Promise => { - const formData = new FormData(); - const file = await readFile(`${__dirname}/${fileName}`); +export const uploadFileViaApi = async ( + datasetId: number, + fileName: string, + fileMetadata?: FileMetadata +): Promise => { + const formData = new FormData() + const file = await readFile(`${__dirname}/${fileName}`) - formData.append('file', new Blob([file]), fileName); + formData.append('file', new Blob([file]), fileName) - if(fileMetadata){ - formData.append('jsonData', JSON.stringify(fileMetadata)); + if (fileMetadata) { + formData.append('jsonData', JSON.stringify(fileMetadata)) } return await axios.post(`${TestConstants.TEST_API_URL}/datasets/${datasetId}/add`, formData, { headers: { 'Content-Type': 'multipart/form-data', - 'X-Dataverse-Key': process.env.TEST_API_KEY, - }, - }); -}; + 'X-Dataverse-Key': process.env.TEST_API_KEY + } + }) +} export const registerFileViaApi = async (fileId: number): Promise => { - return await enableFilePIDs().then(() => axios.get(`${TestConstants.TEST_API_URL}/admin/${fileId}/registerDataFile`, { + return await enableFilePIDs().then(() => + axios.get(`${TestConstants.TEST_API_URL}/admin/${fileId}/registerDataFile`, { headers: { - 'X-Dataverse-Key': process.env.TEST_API_KEY, + 'X-Dataverse-Key': process.env.TEST_API_KEY } - })); + }) + ) } const enableFilePIDs = async (): Promise => { - return await axios.put(`${TestConstants.TEST_API_URL}/admin/settings/:AllowEnablingFilePIDsPerCollection`, "true", { - headers: { - 'X-Dataverse-Key': process.env.TEST_API_KEY, - }, - }).then(() => axios.put(`${TestConstants.TEST_API_URL}/dataverses/root/attribute/filePIDsEnabled?value=true`, {}, { - headers: { - 'X-Dataverse-Key': process.env.TEST_API_KEY, - }, - })); -}; + return await axios + .put( + `${TestConstants.TEST_API_URL}/admin/settings/:AllowEnablingFilePIDsPerCollection`, + 'true', + { + headers: { + 'X-Dataverse-Key': process.env.TEST_API_KEY + } + } + ) + .then(() => + axios.put( + `${TestConstants.TEST_API_URL}/dataverses/root/attribute/filePIDsEnabled?value=true`, + {}, + { + headers: { + 'X-Dataverse-Key': process.env.TEST_API_KEY + } + } + ) + ) +} diff --git a/test/testHelpers/files/filesTotalDownloadSizeHelper.ts b/test/testHelpers/files/filesTotalDownloadSizeHelper.ts index 37e45757..3c2b134c 100644 --- a/test/testHelpers/files/filesTotalDownloadSizeHelper.ts +++ b/test/testHelpers/files/filesTotalDownloadSizeHelper.ts @@ -1,6 +1,7 @@ export const createFilesTotalDownloadSizePayload = (): { storageSize: number; message: string } => { return { storageSize: 173, - message: 'Total size of the files available for download in this version of the dataset: 173 bytes', - }; -}; + message: + 'Total size of the files available for download in this version of the dataset: 173 bytes' + } +} diff --git a/test/testHelpers/info/infoHelper.ts b/test/testHelpers/info/infoHelper.ts index 8da92fb8..eacfa6d4 100644 --- a/test/testHelpers/info/infoHelper.ts +++ b/test/testHelpers/info/infoHelper.ts @@ -1,14 +1,14 @@ -import axios, { AxiosResponse } from 'axios'; -import { TestConstants } from '../TestConstants'; +import axios, { AxiosResponse } from 'axios' +import { TestConstants } from '../TestConstants' export const setMaxEmbargoDurationInMonthsViaApi = async ( - maxEmbargoDurationInMonths: number, + maxEmbargoDurationInMonths: number ): Promise => { return await axios.put( `${TestConstants.TEST_API_URL}/admin/settings/:MaxEmbargoDurationInMonths`, maxEmbargoDurationInMonths.toString(), { - headers: { 'Content-Type': 'text/plain' }, - }, - ); -}; + headers: { 'Content-Type': 'text/plain' } + } + ) +} diff --git a/test/testHelpers/metadataBlocks/metadataBlockHelper.ts b/test/testHelpers/metadataBlocks/metadataBlockHelper.ts index 54b12cfe..a4ec24d3 100644 --- a/test/testHelpers/metadataBlocks/metadataBlockHelper.ts +++ b/test/testHelpers/metadataBlocks/metadataBlockHelper.ts @@ -1,4 +1,4 @@ -import { MetadataBlock } from '../../../src/metadataBlocks/domain/models/MetadataBlock'; +import { MetadataBlock } from '../../../src/metadataBlocks/domain/models/MetadataBlock' export const createMetadataBlockModel = (): MetadataBlock => { return { @@ -15,7 +15,7 @@ export const createMetadataBlockModel = (): MetadataBlock => { description: 'testDescription1', multiple: false, isControlledVocabulary: false, - displayFormat: '#VALUE', + displayFormat: '#VALUE' }, testField2: { name: 'testName2', @@ -37,7 +37,7 @@ export const createMetadataBlockModel = (): MetadataBlock => { description: 'testDescription3', multiple: false, isControlledVocabulary: false, - displayFormat: '#VALUE', + displayFormat: '#VALUE' }, testField4: { name: 'testName4', @@ -48,13 +48,13 @@ export const createMetadataBlockModel = (): MetadataBlock => { description: 'testDescription4', multiple: false, isControlledVocabulary: false, - displayFormat: '#VALUE', - }, - }, - }, - }, - }; -}; + displayFormat: '#VALUE' + } + } + } + } + } +} export const createMetadataBlockPayload = (): any => { return { @@ -71,7 +71,7 @@ export const createMetadataBlockPayload = (): any => { description: 'testDescription1', multiple: false, isControlledVocabulary: false, - displayFormat: '#VALUE', + displayFormat: '#VALUE' }, testField2: { name: 'testName2', @@ -93,7 +93,7 @@ export const createMetadataBlockPayload = (): any => { description: 'testDescription3', multiple: false, isControlledVocabulary: false, - displayFormat: '#VALUE', + displayFormat: '#VALUE' }, testField4: { name: 'testName4', @@ -104,10 +104,10 @@ export const createMetadataBlockPayload = (): any => { description: 'testDescription4', multiple: false, isControlledVocabulary: false, - displayFormat: '#VALUE', - }, - }, - }, - }, - }; -}; + displayFormat: '#VALUE' + } + } + } + } + } +} diff --git a/test/testHelpers/users/authenticatedUserHelper.ts b/test/testHelpers/users/authenticatedUserHelper.ts index 540a0fe7..025e48f9 100644 --- a/test/testHelpers/users/authenticatedUserHelper.ts +++ b/test/testHelpers/users/authenticatedUserHelper.ts @@ -1,4 +1,4 @@ -import { AuthenticatedUser } from '../../../src/users/domain/models/AuthenticatedUser'; +import { AuthenticatedUser } from '../../../src/users/domain/models/AuthenticatedUser' export const createAuthenticatedUser = (): AuthenticatedUser => { return { @@ -14,6 +14,6 @@ export const createAuthenticatedUser = (): AuthenticatedUser => { createdTime: '2023-04-14T11:52:28Z', authenticationProviderId: 'builtin', lastLoginTime: '2023-04-14T11:52:28Z', - lastApiUseTime: '2023-04-14T15:53:32Z', - }; -}; + lastApiUseTime: '2023-04-14T15:53:32Z' + } +} diff --git a/test/unit/auth/AuthRepository.test.ts b/test/unit/auth/AuthRepository.test.ts index 945f8336..9e473a2f 100644 --- a/test/unit/auth/AuthRepository.test.ts +++ b/test/unit/auth/AuthRepository.test.ts @@ -1,70 +1,77 @@ -import { AuthRepository } from '../../../src/auth/infra/repositories/AuthRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import axios from 'axios'; -import { expect } from 'chai'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { WriteError } from '../../../src/core/domain/repositories/WriteError'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { AuthRepository } from '../../../src/auth/infra/repositories/AuthRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import axios from 'axios' +import { expect } from 'chai' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { WriteError } from '../../../src/core/domain/repositories/WriteError' +import { TestConstants } from '../../testHelpers/TestConstants' describe('logout', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: AuthRepository = new AuthRepository(); + const sandbox: SinonSandbox = createSandbox() + const sut: AuthRepository = new AuthRepository() beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) }) afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should not return error on successful response', async () => { const testSuccessfulResponse = { data: { status: 'OK', data: { - message: 'User logged out', - }, - }, - }; - const axiosPostStub = sandbox.stub(axios, 'post').resolves(testSuccessfulResponse); + message: 'User logged out' + } + } + } + const axiosPostStub = sandbox.stub(axios, 'post').resolves(testSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/logout` // API Key auth - await sut.logout(); + await sut.logout() assert.calledWithExactly( axiosPostStub, expectedApiEndpoint, JSON.stringify(''), - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - - await sut.logout(); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + + await sut.logout() assert.calledWithExactly( axiosPostStub, expectedApiEndpoint, JSON.stringify(''), - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + }) test('should return error result on error response', async () => { - const axiosPostStub = sandbox.stub(axios, 'post').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosPostStub = sandbox.stub(axios, 'post').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: WriteError = undefined; - await sut.logout().catch((e) => (error = e)); + let error: WriteError = undefined + await sut.logout().catch((e) => (error = e)) assert.calledWithExactly( axiosPostStub, `${TestConstants.TEST_API_URL}/logout`, JSON.stringify(''), - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); -}); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) +}) diff --git a/test/unit/auth/Logout.test.ts b/test/unit/auth/Logout.test.ts index b19a6f6a..38a3055a 100644 --- a/test/unit/auth/Logout.test.ts +++ b/test/unit/auth/Logout.test.ts @@ -1,31 +1,31 @@ -import { Logout } from '../../../src/auth/domain/useCases/Logout'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { IAuthRepository } from '../../../src/auth/domain/repositories/IAuthRepository'; -import { WriteError } from '../../../src/core/domain/repositories/WriteError'; +import { Logout } from '../../../src/auth/domain/useCases/Logout' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { IAuthRepository } from '../../../src/auth/domain/repositories/IAuthRepository' +import { WriteError } from '../../../src/core/domain/repositories/WriteError' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should not return error on repository success', async () => { - const authRepositoryMock = {}; - authRepositoryMock.logout = sandbox.mock(); - const sut = new Logout(authRepositoryMock); - await sut.execute(); - }); + const authRepositoryMock = {} + authRepositoryMock.logout = sandbox.mock() + const sut = new Logout(authRepositoryMock) + await sut.execute() + }) test('should return error result on repository error', async () => { - const authRepositoryStub = {}; - const testWriteError = new WriteError(); - authRepositoryStub.logout = sandbox.stub().throwsException(testWriteError); - const sut = new Logout(authRepositoryStub); + const authRepositoryStub = {} + const testWriteError = new WriteError() + authRepositoryStub.logout = sandbox.stub().throwsException(testWriteError) + const sut = new Logout(authRepositoryStub) - let actualError: WriteError = undefined; - await sut.execute().catch((e) => (actualError = e)); + let actualError: WriteError = undefined + await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testWriteError); - }); -}); + assert.match(actualError, testWriteError) + }) +}) diff --git a/test/unit/datasets/DatasetsRepository.test.ts b/test/unit/datasets/DatasetsRepository.test.ts index 261df777..479e589b 100644 --- a/test/unit/datasets/DatasetsRepository.test.ts +++ b/test/unit/datasets/DatasetsRepository.test.ts @@ -1,603 +1,673 @@ -import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import axios from 'axios'; -import { expect } from 'chai'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; +import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import axios from 'axios' +import { expect } from 'chai' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' import { createDatasetModel, createDatasetVersionPayload, - createDatasetLicenseModel, -} from '../../testHelpers/datasets/datasetHelper'; -import { TestConstants } from '../../testHelpers/TestConstants'; -import { DatasetNotNumberedVersion, DatasetPreviewSubset } from '../../../src/datasets'; -import { createDatasetUserPermissionsModel } from '../../testHelpers/datasets/datasetUserPermissionsHelper'; -import { createDatasetLockModel, createDatasetLockPayload } from '../../testHelpers/datasets/datasetLockHelper'; + createDatasetLicenseModel +} from '../../testHelpers/datasets/datasetHelper' +import { TestConstants } from '../../testHelpers/TestConstants' +import { DatasetNotNumberedVersion, DatasetPreviewSubset } from '../../../src/datasets' +import { createDatasetUserPermissionsModel } from '../../testHelpers/datasets/datasetUserPermissionsHelper' +import { + createDatasetLockModel, + createDatasetLockPayload +} from '../../testHelpers/datasets/datasetLockHelper' import { createDatasetPreviewModel, - createDatasetPreviewPayload, -} from '../../testHelpers/datasets/datasetPreviewHelper'; + createDatasetPreviewPayload +} from '../../testHelpers/datasets/datasetPreviewHelper' describe('DatasetsRepository', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: DatasetsRepository = new DatasetsRepository(); + const sandbox: SinonSandbox = createSandbox() + const sut: DatasetsRepository = new DatasetsRepository() const testDatasetVersionSuccessfulResponse = { data: { status: 'OK', - data: createDatasetVersionPayload(), - }, - }; - const testCitation = 'test citation'; + data: createDatasetVersionPayload() + } + } + const testCitation = 'test citation' const testCitationSuccessfulResponse = { data: { status: 'OK', data: { - message: testCitation, - }, - }, - }; - const testPrivateUrlToken = 'testToken'; - const testDatasetModel = createDatasetModel(); - const testVersionId = DatasetNotNumberedVersion.LATEST; + message: testCitation + } + } + } + const testPrivateUrlToken = 'testToken' + const testDatasetModel = createDatasetModel() + const testVersionId = DatasetNotNumberedVersion.LATEST beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) describe('getDatasetSummaryFieldNames', () => { test('should return fields on successful response', async () => { - const testFieldNames = ['test1', 'test2']; + const testFieldNames = ['test1', 'test2'] const testSuccessfulResponse = { data: { status: 'OK', - data: testFieldNames, - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse); + data: testFieldNames + } + } + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) - const actual = await sut.getDatasetSummaryFieldNames(); + const actual = await sut.getDatasetSummaryFieldNames() assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/summaryFieldNames`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual, testFieldNames); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual, testFieldNames) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDatasetSummaryFieldNames().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getDatasetSummaryFieldNames().catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/summaryFieldNames`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('getDataset', () => { - const testIncludeDeaccessioned = false; + const testIncludeDeaccessioned = false const expectedRequestConfigApiKey = { params: { includeDeaccessioned: testIncludeDeaccessioned, includeFiles: false }, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } const expectedRequestConfigSessionCookie = { params: { includeDeaccessioned: testIncludeDeaccessioned, includeFiles: false }, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - }; + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers + } describe('by numeric id', () => { test('should return Dataset when providing id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionSuccessfulResponse); - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`; + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testDatasetVersionSuccessfulResponse) + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}` // API Key auth - let actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned); + let actual = await sut.getDataset( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, testDatasetModel); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, testDatasetModel) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned); - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, testDatasetModel); - }); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned) + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, testDatasetModel) + }) test('should return Dataset when providing id, version id, and response with license is successful', async () => { - const testDatasetLicense = createDatasetLicenseModel(); + const testDatasetLicense = createDatasetLicenseModel() const testDatasetVersionWithLicenseSuccessfulResponse = { data: { status: 'OK', - data: createDatasetVersionPayload(testDatasetLicense), - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionWithLicenseSuccessfulResponse); - - const actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned); + data: createDatasetVersionPayload(testDatasetLicense) + } + } + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testDatasetVersionWithLicenseSuccessfulResponse) + + const actual = await sut.getDataset( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, - expectedRequestConfigApiKey, - ); - assert.match(actual, createDatasetModel(testDatasetLicense)); - }); + expectedRequestConfigApiKey + ) + assert.match(actual, createDatasetModel(testDatasetLicense)) + }) test('should return Dataset when providing id, version id, and response with license without icon URI is successful', async () => { - const testDatasetLicenseWithoutIconUri = createDatasetLicenseModel(false); + const testDatasetLicenseWithoutIconUri = createDatasetLicenseModel(false) const testDatasetVersionWithLicenseSuccessfulResponse = { data: { status: 'OK', - data: createDatasetVersionPayload(testDatasetLicenseWithoutIconUri), - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionWithLicenseSuccessfulResponse); - - const actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned); + data: createDatasetVersionPayload(testDatasetLicenseWithoutIconUri) + } + } + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testDatasetVersionWithLicenseSuccessfulResponse) + + const actual = await sut.getDataset( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, - expectedRequestConfigApiKey, - ); - assert.match(actual, createDatasetModel(testDatasetLicenseWithoutIconUri)); - }); + expectedRequestConfigApiKey + ) + assert.match(actual, createDatasetModel(testDatasetLicenseWithoutIconUri)) + }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned) + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, - expectedRequestConfigApiKey, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + expectedRequestConfigApiKey + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { test('should return Dataset when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionSuccessfulResponse); - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testVersionId}?persistentId=${testDatasetModel.persistentId}`; + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testDatasetVersionSuccessfulResponse) + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testVersionId}?persistentId=${testDatasetModel.persistentId}` // API Key auth - let actual = await sut.getDataset(testDatasetModel.persistentId, testVersionId, testIncludeDeaccessioned); + let actual = await sut.getDataset( + testDatasetModel.persistentId, + testVersionId, + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, testDatasetModel); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, testDatasetModel) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDataset(testDatasetModel.persistentId, testVersionId, testIncludeDeaccessioned); + actual = await sut.getDataset( + testDatasetModel.persistentId, + testVersionId, + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, testDatasetModel); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, testDatasetModel) + }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut .getDataset(testDatasetModel.persistentId, testVersionId, testIncludeDeaccessioned) - .catch((e) => (error = e)); + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testVersionId}?persistentId=${testDatasetModel.persistentId}`, - expectedRequestConfigApiKey, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + expectedRequestConfigApiKey + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getPrivateUrlDataset', () => { test('should return Dataset when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionSuccessfulResponse) - const actual = await sut.getPrivateUrlDataset(testPrivateUrlToken); + const actual = await sut.getPrivateUrlDataset(testPrivateUrlToken) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual, testDatasetModel); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual, testDatasetModel) + }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getPrivateUrlDataset(testPrivateUrlToken).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getPrivateUrlDataset(testPrivateUrlToken).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('getDatasetCitation', () => { - const testIncludeDeaccessioned = true; + const testIncludeDeaccessioned = true test('should return citation when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse); - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}/citation`; + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse) + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}/citation` // API Key auth - let actual = await sut.getDatasetCitation(testDatasetModel.id, testVersionId, testIncludeDeaccessioned); + let actual = await sut.getDatasetCitation( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED, - ); - assert.match(actual, testCitation); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED + ) + assert.match(actual, testCitation) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDatasetCitation(testDatasetModel.id, testVersionId, testIncludeDeaccessioned); + actual = await sut.getDatasetCitation( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE_INCLUDE_DEACCESSIONED, - ); - assert.match(actual, testCitation); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE_INCLUDE_DEACCESSIONED + ) + assert.match(actual, testCitation) + }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDatasetCitation(1, testVersionId, testIncludeDeaccessioned).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getDatasetCitation(1, testVersionId, testIncludeDeaccessioned) + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}/citation`, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('getPrivateUrlDatasetCitation', () => { test('should return citation when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse) - const actual = await sut.getPrivateUrlDatasetCitation(testPrivateUrlToken); + const actual = await sut.getPrivateUrlDatasetCitation(testPrivateUrlToken) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}/citation`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual, testCitation); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual, testCitation) + }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getPrivateUrlDatasetCitation(testPrivateUrlToken).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getPrivateUrlDatasetCitation(testPrivateUrlToken).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}/citation`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('getDatasetUserPermissions', () => { - const testDatasetUserPermissions = createDatasetUserPermissionsModel(); + const testDatasetUserPermissions = createDatasetUserPermissionsModel() const testDatasetUserPermissionsResponse = { data: { status: 'OK', - data: testDatasetUserPermissions, - }, - }; + data: testDatasetUserPermissions + } + } describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/userPermissions`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/userPermissions` test('should return dataset user permissions when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetUserPermissionsResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetUserPermissionsResponse) // API Key auth - let actual = await sut.getDatasetUserPermissions(testDatasetModel.id); + let actual = await sut.getDatasetUserPermissions(testDatasetModel.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetUserPermissions); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testDatasetUserPermissions) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDatasetUserPermissions(testDatasetModel.id); + actual = await sut.getDatasetUserPermissions(testDatasetModel.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testDatasetUserPermissions) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDatasetUserPermissions(testDatasetModel.id).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getDatasetUserPermissions(testDatasetModel.id).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/userPermissions?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/userPermissions?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return dataset user permissions when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetUserPermissionsResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetUserPermissionsResponse) // API Key auth - let actual = await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID); + let actual = await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetUserPermissions); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testDatasetUserPermissions) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID); + actual = await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testDatasetUserPermissions) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getDatasetLocks', () => { - const testDatasetLocks = [createDatasetLockModel()]; + const testDatasetLocks = [createDatasetLockModel()] const testDatasetLocksResponse = { data: { status: 'OK', - data: [createDatasetLockPayload()], - }, - }; + data: [createDatasetLockPayload()] + } + } describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/locks`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/locks` test('should return dataset locks when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetLocksResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetLocksResponse) // API Key auth - let actual = await sut.getDatasetLocks(testDatasetModel.id); + let actual = await sut.getDatasetLocks(testDatasetModel.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetLocks); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testDatasetLocks) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDatasetLocks(testDatasetModel.id); + actual = await sut.getDatasetLocks(testDatasetModel.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetLocks); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testDatasetLocks) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDatasetLocks(testDatasetModel.id).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getDatasetLocks(testDatasetModel.id).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/locks?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/locks?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return dataset locks when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetLocksResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetLocksResponse) // API Key auth - let actual = await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID); + let actual = await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetLocks); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testDatasetLocks) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID); + actual = await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetLocks); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testDatasetLocks) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getAllDatasetPreviews', () => { - const testDatasetPreviews = [createDatasetPreviewModel()]; - const testTotalCount = 1; + const testDatasetPreviews = [createDatasetPreviewModel()] + const testTotalCount = 1 const testDatasetPreviewSubset: DatasetPreviewSubset = { datasetPreviews: testDatasetPreviews, - totalDatasetCount: testTotalCount, - }; + totalDatasetCount: testTotalCount + } const testDatasetPreviewsResponse = { data: { status: 'OK', data: { total_count: testTotalCount, - items: [createDatasetPreviewPayload()], - }, - }, - }; + items: [createDatasetPreviewPayload()] + } + } + } - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search?q=*&type=dataset&sort=date&order=desc`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search?q=*&type=dataset&sort=date&order=desc` test('should return dataset previews when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse) // API Key auth - let actual = await sut.getAllDatasetPreviews(); + let actual = await sut.getAllDatasetPreviews() assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetPreviewSubset); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testDatasetPreviewSubset) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getAllDatasetPreviews(); + actual = await sut.getAllDatasetPreviews() assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetPreviewSubset); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testDatasetPreviewSubset) + }) test('should return dataset previews when providing pagination params and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse) - const testLimit = 10; - const testOffset = 20; + const testLimit = 10 + const testOffset = 20 // API Key auth - let actual = await sut.getAllDatasetPreviews(testLimit, testOffset); + let actual = await sut.getAllDatasetPreviews(testLimit, testOffset) const expectedRequestParamsWithPagination = { per_page: testLimit, - start: testOffset, - }; + start: testOffset + } const expectedRequestConfigApiKeyWithPagination = { params: expectedRequestParamsWithPagination, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithPagination); - assert.match(actual, testDatasetPreviewSubset); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigApiKeyWithPagination + ) + assert.match(actual, testDatasetPreviewSubset) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getAllDatasetPreviews(testLimit, testOffset); + actual = await sut.getAllDatasetPreviews(testLimit, testOffset) const expectedRequestConfigSessionCookieWithPagination = { params: expectedRequestParamsWithPagination, headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - }; + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials + } - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookieWithPagination); - assert.match(actual, testDatasetPreviewSubset); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookieWithPagination + ) + assert.match(actual, testDatasetPreviewSubset) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getAllDatasetPreviews().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getAllDatasetPreviews().catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); -}); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) +}) diff --git a/test/unit/datasets/GetAllDatasetPreviews.test.ts b/test/unit/datasets/GetAllDatasetPreviews.test.ts index 9a4211b2..52763248 100644 --- a/test/unit/datasets/GetAllDatasetPreviews.test.ts +++ b/test/unit/datasets/GetAllDatasetPreviews.test.ts @@ -1,39 +1,39 @@ -import { GetAllDatasetPreviews } from '../../../src/datasets/domain/useCases/GetAllDatasetPreviews'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { DatasetPreview } from '../../../src/datasets/domain/models/DatasetPreview'; -import { createDatasetPreviewModel } from '../../testHelpers/datasets/datasetPreviewHelper'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; +import { GetAllDatasetPreviews } from '../../../src/datasets/domain/useCases/GetAllDatasetPreviews' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { DatasetPreview } from '../../../src/datasets/domain/models/DatasetPreview' +import { createDatasetPreviewModel } from '../../testHelpers/datasets/datasetPreviewHelper' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return dataset previews on repository success', async () => { - const testDatasetPreviews: DatasetPreview[] = [createDatasetPreviewModel()]; - const datasetsRepositoryStub = {}; - const getAllDatasetPreviewsStub = sandbox.stub().returns(testDatasetPreviews); - datasetsRepositoryStub.getAllDatasetPreviews = getAllDatasetPreviewsStub; - const sut = new GetAllDatasetPreviews(datasetsRepositoryStub); + const testDatasetPreviews: DatasetPreview[] = [createDatasetPreviewModel()] + const datasetsRepositoryStub = {} + const getAllDatasetPreviewsStub = sandbox.stub().returns(testDatasetPreviews) + datasetsRepositoryStub.getAllDatasetPreviews = getAllDatasetPreviewsStub + const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testDatasetPreviews); - assert.calledWithExactly(getAllDatasetPreviewsStub, undefined, undefined); - }); + assert.match(actual, testDatasetPreviews) + assert.calledWithExactly(getAllDatasetPreviewsStub, undefined, undefined) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getAllDatasetPreviews = sandbox.stub().throwsException(testReadError); - const sut = new GetAllDatasetPreviews(datasetsRepositoryStub); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getAllDatasetPreviews = sandbox.stub().throwsException(testReadError) + const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute().catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute().catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetDataset.test.ts b/test/unit/datasets/GetDataset.test.ts index 672feaf2..44e2abe2 100644 --- a/test/unit/datasets/GetDataset.test.ts +++ b/test/unit/datasets/GetDataset.test.ts @@ -1,39 +1,39 @@ -import { GetDataset } from '../../../src/datasets/domain/useCases/GetDataset'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { DatasetNotNumberedVersion } from '../../../src/datasets/domain/models/DatasetNotNumberedVersion'; +import { GetDataset } from '../../../src/datasets/domain/useCases/GetDataset' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { DatasetNotNumberedVersion } from '../../../src/datasets/domain/models/DatasetNotNumberedVersion' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return dataset on repository success', async () => { - const testDataset = createDatasetModel(); - const datasetsRepositoryStub = {}; - const getDatasetStub = sandbox.stub().returns(testDataset); - datasetsRepositoryStub.getDataset = getDatasetStub; - const sut = new GetDataset(datasetsRepositoryStub); + const testDataset = createDatasetModel() + const datasetsRepositoryStub = {} + const getDatasetStub = sandbox.stub().returns(testDataset) + datasetsRepositoryStub.getDataset = getDatasetStub + const sut = new GetDataset(datasetsRepositoryStub) - const actual = await sut.execute(1); + const actual = await sut.execute(1) - assert.match(actual, testDataset); - assert.calledWithExactly(getDatasetStub, 1, DatasetNotNumberedVersion.LATEST, false); - }); + assert.match(actual, testDataset) + assert.calledWithExactly(getDatasetStub, 1, DatasetNotNumberedVersion.LATEST, false) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getDataset = sandbox.stub().throwsException(testReadError); - const sut = new GetDataset(datasetsRepositoryStub); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getDataset = sandbox.stub().throwsException(testReadError) + const sut = new GetDataset(datasetsRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(1).catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(1).catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetDatasetCitation.test.ts b/test/unit/datasets/GetDatasetCitation.test.ts index 580d96b1..3288db6d 100644 --- a/test/unit/datasets/GetDatasetCitation.test.ts +++ b/test/unit/datasets/GetDatasetCitation.test.ts @@ -1,40 +1,45 @@ -import { GetDatasetCitation } from '../../../src/datasets/domain/useCases/GetDatasetCitation'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { DatasetNotNumberedVersion } from '../../../src/datasets/domain/models/DatasetNotNumberedVersion'; +import { GetDatasetCitation } from '../../../src/datasets/domain/useCases/GetDatasetCitation' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { DatasetNotNumberedVersion } from '../../../src/datasets/domain/models/DatasetNotNumberedVersion' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testId = 1; + const sandbox: SinonSandbox = createSandbox() + const testId = 1 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return successful result with citation on repository success', async () => { - const testCitation = 'test citation'; - const datasetsRepositoryStub = {}; - const getDatasetCitationStub = sandbox.stub().returns(testCitation); - datasetsRepositoryStub.getDatasetCitation = getDatasetCitationStub; + const testCitation = 'test citation' + const datasetsRepositoryStub = {} + const getDatasetCitationStub = sandbox.stub().returns(testCitation) + datasetsRepositoryStub.getDatasetCitation = getDatasetCitationStub - const sut = new GetDatasetCitation(datasetsRepositoryStub); + const sut = new GetDatasetCitation(datasetsRepositoryStub) - const actual = await sut.execute(testId); + const actual = await sut.execute(testId) - assert.match(actual, testCitation); - assert.calledWithExactly(getDatasetCitationStub, testId, DatasetNotNumberedVersion.LATEST, false); - }); + assert.match(actual, testCitation) + assert.calledWithExactly( + getDatasetCitationStub, + testId, + DatasetNotNumberedVersion.LATEST, + false + ) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getDatasetCitation = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetCitation(datasetsRepositoryStub); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getDatasetCitation = sandbox.stub().throwsException(testReadError) + const sut = new GetDatasetCitation(datasetsRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testId).catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testId).catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetDatasetLocks.test.ts b/test/unit/datasets/GetDatasetLocks.test.ts index 51736543..9cbc81a5 100644 --- a/test/unit/datasets/GetDatasetLocks.test.ts +++ b/test/unit/datasets/GetDatasetLocks.test.ts @@ -1,39 +1,39 @@ -import { GetDatasetLocks } from '../../../src/datasets/domain/useCases/GetDatasetLocks'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { createDatasetLockModel } from '../../testHelpers/datasets/datasetLockHelper'; +import { GetDatasetLocks } from '../../../src/datasets/domain/useCases/GetDatasetLocks' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { createDatasetLockModel } from '../../testHelpers/datasets/datasetLockHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testDatasetId = 1; + const sandbox: SinonSandbox = createSandbox() + const testDatasetId = 1 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return dataset locks on repository success', async () => { - const testDatasetLocks = [createDatasetLockModel()]; - const datasetsRepositoryStub = {}; - const getDatasetLocksStub = sandbox.stub().returns(testDatasetLocks); - datasetsRepositoryStub.getDatasetLocks = getDatasetLocksStub; - const sut = new GetDatasetLocks(datasetsRepositoryStub); + const testDatasetLocks = [createDatasetLockModel()] + const datasetsRepositoryStub = {} + const getDatasetLocksStub = sandbox.stub().returns(testDatasetLocks) + datasetsRepositoryStub.getDatasetLocks = getDatasetLocksStub + const sut = new GetDatasetLocks(datasetsRepositoryStub) - const actual = await sut.execute(testDatasetId); + const actual = await sut.execute(testDatasetId) - assert.match(actual, testDatasetLocks); - assert.calledWithExactly(getDatasetLocksStub, testDatasetId); - }); + assert.match(actual, testDatasetLocks) + assert.calledWithExactly(getDatasetLocksStub, testDatasetId) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getDatasetLocks = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetLocks(datasetsRepositoryStub); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getDatasetLocks = sandbox.stub().throwsException(testReadError) + const sut = new GetDatasetLocks(datasetsRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts index c661cc29..da702e72 100644 --- a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts +++ b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts @@ -1,35 +1,37 @@ -import { GetDatasetSummaryFieldNames } from '../../../src/datasets/domain/useCases/GetDatasetSummaryFieldNames'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; +import { GetDatasetSummaryFieldNames } from '../../../src/datasets/domain/useCases/GetDatasetSummaryFieldNames' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return successful result with field names on repository success', async () => { - const testFieldNames = ['test1', 'test2']; - const datasetsRepositoryStub = {}; - datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox.stub().returns(testFieldNames); - const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub); + const testFieldNames = ['test1', 'test2'] + const datasetsRepositoryStub = {} + datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox.stub().returns(testFieldNames) + const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testFieldNames); - }); + assert.match(actual, testFieldNames) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox + .stub() + .throwsException(testReadError) + const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub) + + let actualError: ReadError = undefined + await sut.execute().catch((e) => (actualError = e)) + + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetDatasetUserPermissions.test.ts b/test/unit/datasets/GetDatasetUserPermissions.test.ts index 6a72f889..5d5129d8 100644 --- a/test/unit/datasets/GetDatasetUserPermissions.test.ts +++ b/test/unit/datasets/GetDatasetUserPermissions.test.ts @@ -1,39 +1,39 @@ -import { GetDatasetUserPermissions } from '../../../src/datasets/domain/useCases/GetDatasetUserPermissions'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { createDatasetUserPermissionsModel } from '../../testHelpers/datasets/datasetUserPermissionsHelper'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; +import { GetDatasetUserPermissions } from '../../../src/datasets/domain/useCases/GetDatasetUserPermissions' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { createDatasetUserPermissionsModel } from '../../testHelpers/datasets/datasetUserPermissionsHelper' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testDatasetId = 1; + const sandbox: SinonSandbox = createSandbox() + const testDatasetId = 1 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return dataset user permissions on repository success', async () => { - const testDatasetUserPermissions = createDatasetUserPermissionsModel(); - const datasetsRepositoryStub = {}; - const getDatasetUserPermissionsStub = sandbox.stub().returns(testDatasetUserPermissions); - datasetsRepositoryStub.getDatasetUserPermissions = getDatasetUserPermissionsStub; - const sut = new GetDatasetUserPermissions(datasetsRepositoryStub); + const testDatasetUserPermissions = createDatasetUserPermissionsModel() + const datasetsRepositoryStub = {} + const getDatasetUserPermissionsStub = sandbox.stub().returns(testDatasetUserPermissions) + datasetsRepositoryStub.getDatasetUserPermissions = getDatasetUserPermissionsStub + const sut = new GetDatasetUserPermissions(datasetsRepositoryStub) - const actual = await sut.execute(testDatasetId); + const actual = await sut.execute(testDatasetId) - assert.match(actual, testDatasetUserPermissions); - assert.calledWithExactly(getDatasetUserPermissionsStub, testDatasetId); - }); + assert.match(actual, testDatasetUserPermissions) + assert.calledWithExactly(getDatasetUserPermissionsStub, testDatasetId) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getDatasetUserPermissions = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetUserPermissions(datasetsRepositoryStub); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getDatasetUserPermissions = sandbox.stub().throwsException(testReadError) + const sut = new GetDatasetUserPermissions(datasetsRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetPrivateUrlDataset.test.ts b/test/unit/datasets/GetPrivateUrlDataset.test.ts index 7f34232f..5b53f17c 100644 --- a/test/unit/datasets/GetPrivateUrlDataset.test.ts +++ b/test/unit/datasets/GetPrivateUrlDataset.test.ts @@ -1,39 +1,39 @@ -import { GetPrivateUrlDataset } from '../../../src/datasets/domain/useCases/GetPrivateUrlDataset'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; +import { GetPrivateUrlDataset } from '../../../src/datasets/domain/useCases/GetPrivateUrlDataset' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testPrivateUrlToken = 'token'; + const sandbox: SinonSandbox = createSandbox() + const testPrivateUrlToken = 'token' afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return dataset on repository success', async () => { - const testDataset = createDatasetModel(); - const datasetsRepositoryStub = {}; - const getDatasetStub = sandbox.stub().returns(testDataset); - datasetsRepositoryStub.getPrivateUrlDataset = getDatasetStub; - const sut = new GetPrivateUrlDataset(datasetsRepositoryStub); + const testDataset = createDatasetModel() + const datasetsRepositoryStub = {} + const getDatasetStub = sandbox.stub().returns(testDataset) + datasetsRepositoryStub.getPrivateUrlDataset = getDatasetStub + const sut = new GetPrivateUrlDataset(datasetsRepositoryStub) - const actual = await sut.execute(testPrivateUrlToken); + const actual = await sut.execute(testPrivateUrlToken) - assert.match(actual, testDataset); - assert.calledWithExactly(getDatasetStub, testPrivateUrlToken); - }); + assert.match(actual, testDataset) + assert.calledWithExactly(getDatasetStub, testPrivateUrlToken) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getPrivateUrlDataset = sandbox.stub().throwsException(testReadError); - const sut = new GetPrivateUrlDataset(datasetsRepositoryStub); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getPrivateUrlDataset = sandbox.stub().throwsException(testReadError) + const sut = new GetPrivateUrlDataset(datasetsRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts b/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts index 8aaac6a2..62442a98 100644 --- a/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts +++ b/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts @@ -1,39 +1,41 @@ -import { GetPrivateUrlDatasetCitation } from '../../../src/datasets/domain/useCases/GetPrivateUrlDatasetCitation'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; +import { GetPrivateUrlDatasetCitation } from '../../../src/datasets/domain/useCases/GetPrivateUrlDatasetCitation' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testPrivateUrlToken = 'token'; + const sandbox: SinonSandbox = createSandbox() + const testPrivateUrlToken = 'token' afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return successful result with citation on repository success', async () => { - const testCitation = 'test citation'; - const datasetsRepositoryStub = {}; - const getPrivateUrlDatasetCitationStub = sandbox.stub().returns(testCitation); - datasetsRepositoryStub.getPrivateUrlDatasetCitation = getPrivateUrlDatasetCitationStub; + const testCitation = 'test citation' + const datasetsRepositoryStub = {} + const getPrivateUrlDatasetCitationStub = sandbox.stub().returns(testCitation) + datasetsRepositoryStub.getPrivateUrlDatasetCitation = getPrivateUrlDatasetCitationStub - const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub); + const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub) - const actual = await sut.execute(testPrivateUrlToken); + const actual = await sut.execute(testPrivateUrlToken) - assert.match(actual, testCitation); - assert.calledWithExactly(getPrivateUrlDatasetCitationStub, testPrivateUrlToken); - }); + assert.match(actual, testCitation) + assert.calledWithExactly(getPrivateUrlDatasetCitationStub, testPrivateUrlToken) + }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {}; - const testReadError = new ReadError(); - datasetsRepositoryStub.getPrivateUrlDatasetCitation = sandbox.stub().throwsException(testReadError); - const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const datasetsRepositoryStub = {} + const testReadError = new ReadError() + datasetsRepositoryStub.getPrivateUrlDatasetCitation = sandbox + .stub() + .throwsException(testReadError) + const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub) + + let actualError: ReadError = undefined + await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)) + + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/FilesRepository.test.ts b/test/unit/files/FilesRepository.test.ts index 4348d1d6..777c5edd 100644 --- a/test/unit/files/FilesRepository.test.ts +++ b/test/unit/files/FilesRepository.test.ts @@ -1,72 +1,96 @@ -import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import axios from 'axios'; -import { expect } from 'chai'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import axios from 'axios' +import { expect } from 'chai' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' import { createFileModel, createManyFilesPayload, createFilesSubsetModel, createFilePayload -} from '../../testHelpers/files/filesHelper'; -import { createFileDataTablePayload, createFileDataTableModel } from '../../testHelpers/files/fileDataTablesHelper'; -import { createFileUserPermissionsModel } from '../../testHelpers/files/fileUserPermissionsHelper'; -import { FileSearchCriteria, FileAccessStatus, FileOrderCriteria } from '../../../src/files/domain/models/FileCriteria'; -import { DatasetNotNumberedVersion } from '../../../src/datasets'; -import { createFileCountsModel, createFileCountsPayload } from '../../testHelpers/files/fileCountsHelper'; -import { createFilesTotalDownloadSizePayload } from '../../testHelpers/files/filesTotalDownloadSizeHelper'; -import { FileDownloadSizeMode } from '../../../src'; +} from '../../testHelpers/files/filesHelper' +import { + createFileDataTablePayload, + createFileDataTableModel +} from '../../testHelpers/files/fileDataTablesHelper' +import { createFileUserPermissionsModel } from '../../testHelpers/files/fileUserPermissionsHelper' +import { + FileSearchCriteria, + FileAccessStatus, + FileOrderCriteria +} from '../../../src/files/domain/models/FileCriteria' +import { DatasetNotNumberedVersion } from '../../../src/datasets' +import { + createFileCountsModel, + createFileCountsPayload +} from '../../testHelpers/files/fileCountsHelper' +import { createFilesTotalDownloadSizePayload } from '../../testHelpers/files/filesTotalDownloadSizeHelper' +import { FileDownloadSizeMode } from '../../../src' describe('FilesRepository', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: FilesRepository = new FilesRepository(); - - const testFile = createFileModel(); - const testDatasetVersionId = DatasetNotNumberedVersion.LATEST; - const testDatasetId = 1; - const testIncludeDeaccessioned = false; - const testCategory = 'testCategory'; - const testTabularTagName = 'testTabularTagName'; - const testContentType = 'testContentType'; + const sandbox: SinonSandbox = createSandbox() + const sut: FilesRepository = new FilesRepository() + + const testFile = createFileModel() + const testDatasetVersionId = DatasetNotNumberedVersion.LATEST + const testDatasetId = 1 + const testIncludeDeaccessioned = false + const testCategory = 'testCategory' + const testTabularTagName = 'testTabularTagName' + const testContentType = 'testContentType' const testFileCriteria = new FileSearchCriteria() .withCategoryName(testCategory) .withContentType(testContentType) .withAccessStatus(FileAccessStatus.PUBLIC) - .withTabularTagName(testTabularTagName); + .withTabularTagName(testTabularTagName) beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) describe('getDatasetFiles', () => { - const testTotalCount = 4; + const testTotalCount = 4 const testFilesSuccessfulResponse = { data: { status: 'OK', data: createManyFilesPayload(testTotalCount), - totalCount: testTotalCount, - }, - }; + totalCount: testTotalCount + } + } - const testLimit = 10; - const testOffset = 20; - const testFileOrderCriteria = FileOrderCriteria.NAME_ZA; + const testLimit = 10 + const testOffset = 20 + const testFileOrderCriteria = FileOrderCriteria.NAME_ZA const expectedRequestConfigApiKey = { - params: { includeDeaccessioned: testIncludeDeaccessioned, orderCriteria: testFileOrderCriteria }, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + params: { + includeDeaccessioned: testIncludeDeaccessioned, + orderCriteria: testFileOrderCriteria + }, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } const expectedRequestConfigSessionCookie = { - params: { includeDeaccessioned: testIncludeDeaccessioned, orderCriteria: testFileOrderCriteria }, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - }; + params: { + includeDeaccessioned: testIncludeDeaccessioned, + orderCriteria: testFileOrderCriteria + }, + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers + } const expectedRequestParamsWithOptional = { includeDeaccessioned: testIncludeDeaccessioned, @@ -76,49 +100,53 @@ describe('FilesRepository', () => { contentType: testFileCriteria.contentType, accessStatus: testFileCriteria.accessStatus.toString(), categoryName: testFileCriteria.categoryName, - tabularTagName: testFileCriteria.tabularTagName, - }; + tabularTagName: testFileCriteria.tabularTagName + } const expectedRequestConfigApiKeyWithOptional = { params: expectedRequestParamsWithOptional, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } - const expectedFiles = createFilesSubsetModel(testTotalCount); + const expectedFiles = createFilesSubsetModel(testTotalCount) describe('by numeric id and version id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/files`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/files` test('should return files when providing id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFiles( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileOrderCriteria, - ); + testFileOrderCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, expectedFiles); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, expectedFiles) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetFiles( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileOrderCriteria, - ); + testFileOrderCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, expectedFiles); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, expectedFiles) + }) test('should return files when providing id, version id, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) const actual = await sut.getDatasetFiles( testDatasetId, @@ -127,59 +155,72 @@ describe('FilesRepository', () => { testFileOrderCriteria, testLimit, testOffset, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedFiles); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + assert.match(actual, expectedFiles) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut - .getDatasetFiles(testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, testFileOrderCriteria) - .catch((e) => (error = e)); + .getDatasetFiles( + testDatasetId, + testDatasetVersionId, + testIncludeDeaccessioned, + testFileOrderCriteria + ) + .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/files?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/files?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return files when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFiles( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned, - testFileOrderCriteria, - ); + testFileOrderCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, expectedFiles); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, expectedFiles) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetFiles( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned, - testFileOrderCriteria, - ); + testFileOrderCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, expectedFiles); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, expectedFiles) + }) test('should return files when providing persistent id, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) const actual = await sut.getDatasetFiles( TestConstants.TEST_DUMMY_PERSISTENT_ID, @@ -188,175 +229,211 @@ describe('FilesRepository', () => { testFileOrderCriteria, testLimit, testOffset, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedFiles); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + assert.match(actual, expectedFiles) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut .getDatasetFiles( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned, - testFileOrderCriteria, + testFileOrderCriteria ) - .catch((e) => (error = e)); + .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getDatasetFileCounts', () => { const testFileCountsSuccessfulResponse = { data: { status: 'OK', - data: createFileCountsPayload(), - }, - }; + data: createFileCountsPayload() + } + } const expectedRequestConfigApiKey = { params: { includeDeaccessioned: testIncludeDeaccessioned }, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } const expectedRequestConfigSessionCookie = { params: { includeDeaccessioned: testIncludeDeaccessioned }, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - }; + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers + } const expectedRequestParamsWithOptional = { includeDeaccessioned: testIncludeDeaccessioned, contentType: testFileCriteria.contentType, accessStatus: testFileCriteria.accessStatus.toString(), categoryName: testFileCriteria.categoryName, - tabularTagName: testFileCriteria.tabularTagName, - }; + tabularTagName: testFileCriteria.tabularTagName + } const expectedRequestConfigApiKeyWithOptional = { params: expectedRequestParamsWithOptional, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } - const expectedCount = createFileCountsModel(); + const expectedCount = createFileCountsModel() describe('by numeric id and version id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/files/counts`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/files/counts` test('should return file counts when providing id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse) // API Key auth - let actual = await sut.getDatasetFileCounts(testDatasetId, testDatasetVersionId, testIncludeDeaccessioned); + let actual = await sut.getDatasetFileCounts( + testDatasetId, + testDatasetVersionId, + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, expectedCount); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, expectedCount) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getDatasetFileCounts(testDatasetId, testDatasetVersionId, testIncludeDeaccessioned); + actual = await sut.getDatasetFileCounts( + testDatasetId, + testDatasetVersionId, + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, expectedCount); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, expectedCount) + }) test('should return file counts when providing id, version id, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse) const actual = await sut.getDatasetFileCounts( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedCount); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + assert.match(actual, expectedCount) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut .getDatasetFileCounts(testDatasetId, testDatasetVersionId, testIncludeDeaccessioned) - .catch((e) => (error = e)); + .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/files/counts?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/files/counts?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return files when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFileCounts( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, - testIncludeDeaccessioned, - ); + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, expectedCount); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, expectedCount) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetFileCounts( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, - testIncludeDeaccessioned, - ); + testIncludeDeaccessioned + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, expectedCount); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, expectedCount) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut - .getDatasetFileCounts(TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned) - .catch((e) => (error = e)); + .getDatasetFileCounts( + TestConstants.TEST_DUMMY_PERSISTENT_ID, + testDatasetVersionId, + testIncludeDeaccessioned + ) + .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getDatasetFilesTotalDownloadSize', () => { const testFilesTotalDownloadSizeSuccessfulResponse = { data: { status: 'OK', - data: createFilesTotalDownloadSizePayload(), - }, - }; - const testFileDownloadSizeMode = FileDownloadSizeMode.ARCHIVAL; - const testIncludeDeaccessioned = false; - const expectedSize = 173; + data: createFilesTotalDownloadSizePayload() + } + } + const testFileDownloadSizeMode = FileDownloadSizeMode.ARCHIVAL + const testIncludeDeaccessioned = false + const expectedSize = 173 const expectedRequestConfigApiKey = { - params: { mode: FileDownloadSizeMode.ARCHIVAL.toString(), includeDeaccessioned: testIncludeDeaccessioned }, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + params: { + mode: FileDownloadSizeMode.ARCHIVAL.toString(), + includeDeaccessioned: testIncludeDeaccessioned + }, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } const expectedRequestConfigSessionCookie = { - params: { mode: FileDownloadSizeMode.ARCHIVAL.toString(), includeDeaccessioned: testIncludeDeaccessioned }, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - }; + params: { + mode: FileDownloadSizeMode.ARCHIVAL.toString(), + includeDeaccessioned: testIncludeDeaccessioned + }, + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers + } const expectedRequestConfigApiKeyWithOptional = { params: { mode: FileDownloadSizeMode.ARCHIVAL.toString(), @@ -364,514 +441,546 @@ describe('FilesRepository', () => { contentType: testFileCriteria.contentType, accessStatus: testFileCriteria.accessStatus.toString(), categoryName: testFileCriteria.categoryName, - tabularTagName: testFileCriteria.tabularTagName, + tabularTagName: testFileCriteria.tabularTagName }, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/downloadsize`; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/downloadsize` describe('by numeric id and version id', () => { test('should return files total download size when providing id, version id, mode, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesTotalDownloadSizeSuccessfulResponse); + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testFilesTotalDownloadSizeSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFilesTotalDownloadSize( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, - ); + testFileDownloadSizeMode + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, expectedSize); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, expectedSize) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetFilesTotalDownloadSize( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, - ); + testFileDownloadSizeMode + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, expectedSize); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, expectedSize) + }) test('should return files total download size when providing id, version id, mode, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesTotalDownloadSizeSuccessfulResponse); + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testFilesTotalDownloadSizeSuccessfulResponse) const actual = await sut.getDatasetFilesTotalDownloadSize( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, testFileDownloadSizeMode, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedSize); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + assert.match(actual, expectedSize) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut .getDatasetFilesTotalDownloadSize( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, + testFileDownloadSizeMode ) - .catch((e) => (error = e)); + .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/downloadsize?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/downloadsize?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return files total download size when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesTotalDownloadSizeSuccessfulResponse); + const axiosGetStub = sandbox + .stub(axios, 'get') + .resolves(testFilesTotalDownloadSizeSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFilesTotalDownloadSize( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, - ); + testFileDownloadSizeMode + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, expectedSize); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + assert.match(actual, expectedSize) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetFilesTotalDownloadSize( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, - ); + testFileDownloadSizeMode + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, expectedSize); - }); + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + assert.match(actual, expectedSize) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; + let error: ReadError = undefined await sut .getDatasetFilesTotalDownloadSize( TestConstants.TEST_DUMMY_PERSISTENT_ID, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, + testFileDownloadSizeMode ) - .catch((e) => (error = e)); + .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getFileDownloadCount', () => { - const testCount = 1; + const testCount = 1 const testFileDownloadCountResponse = { data: { status: 'OK', data: { - message: `${testCount}`, - }, - }, - }; + message: `${testCount}` + } + } + } describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/downloadCount`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/downloadCount` test('should return count when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileDownloadCountResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileDownloadCountResponse) // API Key auth - let actual = await sut.getFileDownloadCount(testFile.id); + let actual = await sut.getFileDownloadCount(testFile.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testCount); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testCount) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getFileDownloadCount(testFile.id); + actual = await sut.getFileDownloadCount(testFile.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testCount); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testCount) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getFileDownloadCount(testFile.id).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getFileDownloadCount(testFile.id).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/downloadCount?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/downloadCount?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return count when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileDownloadCountResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileDownloadCountResponse) // API Key auth - let actual = await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID); + let actual = await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testCount); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testCount) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID); + actual = await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testCount); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testCount) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getFileUserPermissions', () => { - const testFileUserPermissions = createFileUserPermissionsModel(); + const testFileUserPermissions = createFileUserPermissionsModel() const testFileUserPermissionsResponse = { data: { status: 'OK', - data: testFileUserPermissions, - }, - }; + data: testFileUserPermissions + } + } describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/access/datafile/${testFile.id}/userPermissions`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/access/datafile/${testFile.id}/userPermissions` test('should return file user permissions when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileUserPermissionsResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileUserPermissionsResponse) // API Key auth - let actual = await sut.getFileUserPermissions(testFile.id); + let actual = await sut.getFileUserPermissions(testFile.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testFileUserPermissions); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testFileUserPermissions) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getFileUserPermissions(testFile.id); + actual = await sut.getFileUserPermissions(testFile.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testFileUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testFileUserPermissions) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getFileUserPermissions(testFile.id).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getFileUserPermissions(testFile.id).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/access/datafile/:persistentId/userPermissions?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/access/datafile/:persistentId/userPermissions?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return file user permissions when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileUserPermissionsResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileUserPermissionsResponse) // API Key auth - let actual = await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID); + let actual = await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testFileUserPermissions); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, testFileUserPermissions) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID); + actual = await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testFileUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, testFileUserPermissions) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) describe('getFileDataTables', () => { - const expectedDataTables = [createFileDataTableModel()]; + const expectedDataTables = [createFileDataTableModel()] const testGetFileDataTablesResponse = { data: { status: 'OK', - data: [createFileDataTablePayload()], - }, - }; + data: [createFileDataTablePayload()] + } + } describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/dataTables`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/dataTables` test('should return data tables when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileDataTablesResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileDataTablesResponse) // API Key auth - let actual = await sut.getFileDataTables(testFile.id); + let actual = await sut.getFileDataTables(testFile.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, expectedDataTables); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, expectedDataTables) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getFileDataTables(testFile.id); + actual = await sut.getFileDataTables(testFile.id) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, expectedDataTables); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, expectedDataTables) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getFileDataTables(testFile.id).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getFileDataTables(testFile.id).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/dataTables?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/dataTables?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return data tables when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileDataTablesResponse); + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileDataTablesResponse) // API Key auth - let actual = await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID); + let actual = await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, expectedDataTables); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, expectedDataTables) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID); + actual = await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, expectedDataTables); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, expectedDataTables) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)); + let error: ReadError = undefined + await sut + .getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) + .catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); - describe('getFile' , () => { + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) + describe('getFile', () => { describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/`; - const testGetFileResponse = { - data: { - status: 'OK', - data: createFilePayload(), - }, - }; - test('should return file when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileResponse); - - // API Key auth - let actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST); - - assert.calledWithExactly( - axiosGetStub, - expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, createFileModel()); - - // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - - actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST); - - assert.calledWithExactly( - axiosGetStub, - expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, createFileModel()); - }); - - test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); - - let error: ReadError = undefined; - await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST).catch((e) => (error = e)); - - assert.calledWithExactly( - axiosGetStub, - expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/` + const testGetFileResponse = { + data: { + status: 'OK', + data: createFilePayload() + } + } + test('should return file when providing id and response is successful', async () => { + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileResponse) + + // API Key auth + let actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST) + + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, createFileModel()) + + // Session cookie auth + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + + actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST) + + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, createFileModel()) + }) + + test('should return error result on error response', async () => { + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + + let error: ReadError = undefined + await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST).catch((e) => (error = e)) + + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; - const testGetFileResponse = { - data: { - status: 'OK', - data: createFilePayload(), - }, - }; - test('should return file when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileResponse); - - // API Key auth - let actual = await sut.getFile(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST); - - assert.calledWithExactly( - axiosGetStub, - expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, createFileModel()); - - // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - - actual = await sut.getFile(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST); - - assert.calledWithExactly( - axiosGetStub, - expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, createFileModel()); - }); - - test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); - - let error: ReadError = undefined; - await sut.getFile(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST).catch((e) => (error = e)); - - assert.calledWithExactly( - axiosGetStub, - expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); - }); -}); + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` + const testGetFileResponse = { + data: { + status: 'OK', + data: createFilePayload() + } + } + test('should return file when providing persistent id and response is successful', async () => { + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileResponse) + + // API Key auth + let actual = await sut.getFile( + TestConstants.TEST_DUMMY_PERSISTENT_ID, + DatasetNotNumberedVersion.LATEST + ) + + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + assert.match(actual, createFileModel()) + + // Session cookie auth + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + + actual = await sut.getFile( + TestConstants.TEST_DUMMY_PERSISTENT_ID, + DatasetNotNumberedVersion.LATEST + ) + + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + assert.match(actual, createFileModel()) + }) + + test('should return error result on error response', async () => { + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + + let error: ReadError = undefined + await sut + .getFile(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST) + .catch((e) => (error = e)) + + assert.calledWithExactly( + axiosGetStub, + expectedApiEndpoint, + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) + }) + }) +}) diff --git a/test/unit/files/GetDatasetFileCounts.test.ts b/test/unit/files/GetDatasetFileCounts.test.ts index 4576290e..34cb6305 100644 --- a/test/unit/files/GetDatasetFileCounts.test.ts +++ b/test/unit/files/GetDatasetFileCounts.test.ts @@ -1,40 +1,46 @@ -import { GetDatasetFileCounts } from '../../../src/files/domain/useCases/GetDatasetFileCounts'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { DatasetNotNumberedVersion } from '../../../src/datasets'; -import { FileCounts } from '../../../src/files/domain/models/FileCounts'; -import { createFileCountsModel } from '../../testHelpers/files/fileCountsHelper'; +import { GetDatasetFileCounts } from '../../../src/files/domain/useCases/GetDatasetFileCounts' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { DatasetNotNumberedVersion } from '../../../src/datasets' +import { FileCounts } from '../../../src/files/domain/models/FileCounts' +import { createFileCountsModel } from '../../testHelpers/files/fileCountsHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return file counts on repository success', async () => { - const testFileCounts: FileCounts = createFileCountsModel(); - const filesRepositoryStub = {}; - const getDatasetFileCountsStub = sandbox.stub().returns(testFileCounts); - filesRepositoryStub.getDatasetFileCounts = getDatasetFileCountsStub; - const sut = new GetDatasetFileCounts(filesRepositoryStub); - - const actual = await sut.execute(1); - - assert.match(actual, testFileCounts); - assert.calledWithExactly(getDatasetFileCountsStub, 1, DatasetNotNumberedVersion.LATEST, false, undefined); - }); + const testFileCounts: FileCounts = createFileCountsModel() + const filesRepositoryStub = {} + const getDatasetFileCountsStub = sandbox.stub().returns(testFileCounts) + filesRepositoryStub.getDatasetFileCounts = getDatasetFileCountsStub + const sut = new GetDatasetFileCounts(filesRepositoryStub) + + const actual = await sut.execute(1) + + assert.match(actual, testFileCounts) + assert.calledWithExactly( + getDatasetFileCountsStub, + 1, + DatasetNotNumberedVersion.LATEST, + false, + undefined + ) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getDatasetFileCounts = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetFileCounts(filesRepositoryStub); + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getDatasetFileCounts = sandbox.stub().throwsException(testReadError) + const sut = new GetDatasetFileCounts(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(1).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(1).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/GetDatasetFiles.test.ts b/test/unit/files/GetDatasetFiles.test.ts index fb850a57..14fc9f6c 100644 --- a/test/unit/files/GetDatasetFiles.test.ts +++ b/test/unit/files/GetDatasetFiles.test.ts @@ -1,41 +1,50 @@ -import { GetDatasetFiles } from '../../../src/files/domain/useCases/GetDatasetFiles'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { File } from '../../../src/files/domain/models/File'; -import { createFileModel } from '../../testHelpers/files/filesHelper'; -import { DatasetNotNumberedVersion } from '../../../src/datasets'; -import { FileOrderCriteria } from '../../../src/files/domain/models/FileCriteria'; +import { GetDatasetFiles } from '../../../src/files/domain/useCases/GetDatasetFiles' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { File } from '../../../src/files/domain/models/File' +import { createFileModel } from '../../testHelpers/files/filesHelper' +import { DatasetNotNumberedVersion } from '../../../src/datasets' +import { FileOrderCriteria } from '../../../src/files/domain/models/FileCriteria' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return files on repository success', async () => { - const testFiles: File[] = [createFileModel()]; - const filesRepositoryStub = {}; - const getDatasetFilesStub = sandbox.stub().returns(testFiles); - filesRepositoryStub.getDatasetFiles = getDatasetFilesStub; - const sut = new GetDatasetFiles(filesRepositoryStub); - - const actual = await sut.execute(1); - - assert.match(actual, testFiles); - assert.calledWithExactly(getDatasetFilesStub, 1, DatasetNotNumberedVersion.LATEST, false, FileOrderCriteria.NAME_AZ, undefined, undefined, undefined); - }); + const testFiles: File[] = [createFileModel()] + const filesRepositoryStub = {} + const getDatasetFilesStub = sandbox.stub().returns(testFiles) + filesRepositoryStub.getDatasetFiles = getDatasetFilesStub + const sut = new GetDatasetFiles(filesRepositoryStub) + + const actual = await sut.execute(1) + + assert.match(actual, testFiles) + assert.calledWithExactly( + getDatasetFilesStub, + 1, + DatasetNotNumberedVersion.LATEST, + false, + FileOrderCriteria.NAME_AZ, + undefined, + undefined, + undefined + ) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getDatasetFiles = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetFiles(filesRepositoryStub); + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getDatasetFiles = sandbox.stub().throwsException(testReadError) + const sut = new GetDatasetFiles(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(1).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(1).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts b/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts index b3a4a208..7e799ae9 100644 --- a/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts +++ b/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts @@ -1,77 +1,84 @@ -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' import { DatasetNotNumberedVersion, ReadError, FileDownloadSizeMode, FileSearchCriteria, - FileAccessStatus, -} from '../../../src'; -import { GetDatasetFilesTotalDownloadSize } from '../../../src/files/domain/useCases/GetDatasetFilesTotalDownloadSize'; + FileAccessStatus +} from '../../../src' +import { GetDatasetFilesTotalDownloadSize } from '../../../src/files/domain/useCases/GetDatasetFilesTotalDownloadSize' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() - const testDatasetTotalDownloadSize = 123456789; + const testDatasetTotalDownloadSize = 123456789 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return dataset files total download size of the latest version given a dataset id', async () => { - const filesRepositoryStub = {}; - const getDatasetTotalDownloadSizeStub = sandbox.stub().returns(testDatasetTotalDownloadSize); - filesRepositoryStub.getDatasetFilesTotalDownloadSize = getDatasetTotalDownloadSizeStub; - const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub); + const filesRepositoryStub = {} + const getDatasetTotalDownloadSizeStub = sandbox.stub().returns(testDatasetTotalDownloadSize) + filesRepositoryStub.getDatasetFilesTotalDownloadSize = getDatasetTotalDownloadSizeStub + const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) - const actual = await sut.execute(1); + const actual = await sut.execute(1) - assert.match(actual, testDatasetTotalDownloadSize); + assert.match(actual, testDatasetTotalDownloadSize) assert.calledWithExactly( getDatasetTotalDownloadSizeStub, 1, DatasetNotNumberedVersion.LATEST, false, FileDownloadSizeMode.ALL, - undefined, - ); - }); + undefined + ) + }) test('should return dataset files total download size given a dataset id, version, file download size mode and search criteria', async () => { - const filesRepositoryStub = {}; - const getDatasetTotalDownloadSizeStub = sandbox.stub().returns(testDatasetTotalDownloadSize); - filesRepositoryStub.getDatasetFilesTotalDownloadSize = getDatasetTotalDownloadSizeStub; - const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub); + const filesRepositoryStub = {} + const getDatasetTotalDownloadSizeStub = sandbox.stub().returns(testDatasetTotalDownloadSize) + filesRepositoryStub.getDatasetFilesTotalDownloadSize = getDatasetTotalDownloadSizeStub + const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) - const testVersionId = '1.0'; + const testVersionId = '1.0' const testFileSearchCriteria = new FileSearchCriteria() .withCategoryName('testCategory') .withContentType('testContentType') .withAccessStatus(FileAccessStatus.PUBLIC) - .withTabularTagName('testTabularTagName'); + .withTabularTagName('testTabularTagName') - const actual = await sut.execute(1, testVersionId, FileDownloadSizeMode.ARCHIVAL, testFileSearchCriteria); + const actual = await sut.execute( + 1, + testVersionId, + FileDownloadSizeMode.ARCHIVAL, + testFileSearchCriteria + ) - assert.match(actual, testDatasetTotalDownloadSize); + assert.match(actual, testDatasetTotalDownloadSize) assert.calledWithExactly( getDatasetTotalDownloadSizeStub, 1, testVersionId, false, FileDownloadSizeMode.ARCHIVAL, - testFileSearchCriteria, - ); - }); + testFileSearchCriteria + ) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getDatasetFilesTotalDownloadSize = sandbox.stub().throwsException(testReadError); - const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub); + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getDatasetFilesTotalDownloadSize = sandbox + .stub() + .throwsException(testReadError) + const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(1).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(1).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/GetFile.test.ts b/test/unit/files/GetFile.test.ts index 239d7362..28ea574c 100644 --- a/test/unit/files/GetFile.test.ts +++ b/test/unit/files/GetFile.test.ts @@ -1,64 +1,68 @@ -import {assert, createSandbox, SinonSandbox} from "sinon"; -import {createFileModel} from "../../testHelpers/files/filesHelper"; -import {IFilesRepository} from "../../../src/files/domain/repositories/IFilesRepository"; -import {GetFile} from "../../../src/files/domain/useCases/GetFile"; -import {DatasetNotNumberedVersion, ReadError} from "../../../src"; +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createFileModel } from '../../testHelpers/files/filesHelper' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { GetFile } from '../../../src/files/domain/useCases/GetFile' +import { DatasetNotNumberedVersion, ReadError } from '../../../src' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() - afterEach(() => { - sandbox.restore(); - }); + afterEach(() => { + sandbox.restore() + }) - test('should return file on repository success when passing numeric id', async () => { - const testFile = createFileModel(); - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testFile); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFile(filesRepositoryStub); + test('should return file on repository success when passing numeric id', async () => { + const testFile = createFileModel() + const filesRepositoryStub = {} + const getFileStub = sandbox.stub().returns(testFile) + filesRepositoryStub.getFile = getFileStub + const sut = new GetFile(filesRepositoryStub) - const actual = await sut.execute(1); + const actual = await sut.execute(1) - assert.match(actual, testFile); - assert.calledWithExactly(getFileStub, 1, DatasetNotNumberedVersion.LATEST); - }) + assert.match(actual, testFile) + assert.calledWithExactly(getFileStub, 1, DatasetNotNumberedVersion.LATEST) + }) - test('should return file on repository success when passing string id', async () => { - const testFile = createFileModel(); - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testFile); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFile(filesRepositoryStub); + test('should return file on repository success when passing string id', async () => { + const testFile = createFileModel() + const filesRepositoryStub = {} + const getFileStub = sandbox.stub().returns(testFile) + filesRepositoryStub.getFile = getFileStub + const sut = new GetFile(filesRepositoryStub) - const actual = await sut.execute('doi:10.5072/FK2/J8SJZB'); + const actual = await sut.execute('doi:10.5072/FK2/J8SJZB') - assert.match(actual, testFile); - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', DatasetNotNumberedVersion.LATEST); - }) + assert.match(actual, testFile) + assert.calledWithExactly( + getFileStub, + 'doi:10.5072/FK2/J8SJZB', + DatasetNotNumberedVersion.LATEST + ) + }) - test('should return file on repository success when passing string id and version id', async () => { - const testFile = createFileModel(); - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testFile); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFile(filesRepositoryStub); + test('should return file on repository success when passing string id and version id', async () => { + const testFile = createFileModel() + const filesRepositoryStub = {} + const getFileStub = sandbox.stub().returns(testFile) + filesRepositoryStub.getFile = getFileStub + const sut = new GetFile(filesRepositoryStub) - const actual = await sut.execute('doi:10.5072/FK2/J8SJZB', '2.0'); + const actual = await sut.execute('doi:10.5072/FK2/J8SJZB', '2.0') - assert.match(actual, testFile); - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', '2.0'); - }) + assert.match(actual, testFile) + assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', '2.0') + }) - test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getFile = sandbox.stub().throwsException(testReadError); - const sut = new GetFile(filesRepositoryStub); + test('should return error result on repository error', async () => { + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getFile = sandbox.stub().throwsException(testReadError) + const sut = new GetFile(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(1).catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(1).catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }) -}); \ No newline at end of file + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/GetFileDataTables.test.ts b/test/unit/files/GetFileDataTables.test.ts index 34104e2a..9957f01d 100644 --- a/test/unit/files/GetFileDataTables.test.ts +++ b/test/unit/files/GetFileDataTables.test.ts @@ -1,40 +1,40 @@ -import { GetFileDataTables } from '../../../src/files/domain/useCases/GetFileDataTables'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { FileDataTable } from '../../../src/files/domain/models/FileDataTable'; -import { createFileDataTableModel } from '../../testHelpers/files/fileDataTablesHelper'; +import { GetFileDataTables } from '../../../src/files/domain/useCases/GetFileDataTables' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { FileDataTable } from '../../../src/files/domain/models/FileDataTable' +import { createFileDataTableModel } from '../../testHelpers/files/fileDataTablesHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testFileId = 1; + const sandbox: SinonSandbox = createSandbox() + const testFileId = 1 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return file data tables on repository success', async () => { - const testDataTables: FileDataTable[] = [createFileDataTableModel()]; - const filesRepositoryStub = {}; - const getFileDataTablesStub = sandbox.stub().returns(testDataTables); - filesRepositoryStub.getFileDataTables = getFileDataTablesStub; - const sut = new GetFileDataTables(filesRepositoryStub); + const testDataTables: FileDataTable[] = [createFileDataTableModel()] + const filesRepositoryStub = {} + const getFileDataTablesStub = sandbox.stub().returns(testDataTables) + filesRepositoryStub.getFileDataTables = getFileDataTablesStub + const sut = new GetFileDataTables(filesRepositoryStub) - const actual = await sut.execute(testFileId); + const actual = await sut.execute(testFileId) - assert.match(actual, testDataTables); - assert.calledWithExactly(getFileDataTablesStub, testFileId); - }); + assert.match(actual, testDataTables) + assert.calledWithExactly(getFileDataTablesStub, testFileId) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getFileDataTables = sandbox.stub().throwsException(testReadError); - const sut = new GetFileDataTables(filesRepositoryStub); + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getFileDataTables = sandbox.stub().throwsException(testReadError) + const sut = new GetFileDataTables(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/GetFileDownloadCount.test.ts b/test/unit/files/GetFileDownloadCount.test.ts index 694959b3..d74323e4 100644 --- a/test/unit/files/GetFileDownloadCount.test.ts +++ b/test/unit/files/GetFileDownloadCount.test.ts @@ -1,51 +1,54 @@ -import { GetFileDownloadCount } from '../../../src/files/domain/useCases/GetFileDownloadCount'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { GetFileDownloadCount } from '../../../src/files/domain/useCases/GetFileDownloadCount' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { TestConstants } from '../../testHelpers/TestConstants' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testFileId = 1; - const testCount = 10; + const sandbox: SinonSandbox = createSandbox() + const testFileId = 1 + const testCount = 10 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return count on repository success filtering by id', async () => { - const filesRepositoryStub = {}; - const getFileGuestbookResponsesCountStub = sandbox.stub().returns(testCount); - filesRepositoryStub.getFileDownloadCount = getFileGuestbookResponsesCountStub; - const sut = new GetFileDownloadCount(filesRepositoryStub); + const filesRepositoryStub = {} + const getFileGuestbookResponsesCountStub = sandbox.stub().returns(testCount) + filesRepositoryStub.getFileDownloadCount = getFileGuestbookResponsesCountStub + const sut = new GetFileDownloadCount(filesRepositoryStub) - const actual = await sut.execute(testFileId); + const actual = await sut.execute(testFileId) - assert.match(actual, testCount); - assert.calledWithExactly(getFileGuestbookResponsesCountStub, testFileId); - }); + assert.match(actual, testCount) + assert.calledWithExactly(getFileGuestbookResponsesCountStub, testFileId) + }) test('should return count on repository success filtering by persistent id', async () => { - const filesRepositoryStub = {}; - const getFileGuestbookResponsesCountStub = sandbox.stub().returns(testCount); - filesRepositoryStub.getFileDownloadCount = getFileGuestbookResponsesCountStub; - const sut = new GetFileDownloadCount(filesRepositoryStub); + const filesRepositoryStub = {} + const getFileGuestbookResponsesCountStub = sandbox.stub().returns(testCount) + filesRepositoryStub.getFileDownloadCount = getFileGuestbookResponsesCountStub + const sut = new GetFileDownloadCount(filesRepositoryStub) - const actual = await sut.execute(TestConstants.TEST_DUMMY_PERSISTENT_ID); + const actual = await sut.execute(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.match(actual, testCount); - assert.calledWithExactly(getFileGuestbookResponsesCountStub, TestConstants.TEST_DUMMY_PERSISTENT_ID); - }); + assert.match(actual, testCount) + assert.calledWithExactly( + getFileGuestbookResponsesCountStub, + TestConstants.TEST_DUMMY_PERSISTENT_ID + ) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getFileDownloadCount = sandbox.stub().throwsException(testReadError); - const sut = new GetFileDownloadCount(filesRepositoryStub); + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getFileDownloadCount = sandbox.stub().throwsException(testReadError) + const sut = new GetFileDownloadCount(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testFileId).catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testFileId).catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/files/GetFileUserPermissions.test.ts b/test/unit/files/GetFileUserPermissions.test.ts index d113e730..b158dd1c 100644 --- a/test/unit/files/GetFileUserPermissions.test.ts +++ b/test/unit/files/GetFileUserPermissions.test.ts @@ -1,39 +1,39 @@ -import { GetFileUserPermissions } from '../../../src/files/domain/useCases/GetFileUserPermissions'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { createFileUserPermissionsModel } from '../../testHelpers/files/fileUserPermissionsHelper'; +import { GetFileUserPermissions } from '../../../src/files/domain/useCases/GetFileUserPermissions' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { createFileUserPermissionsModel } from '../../testHelpers/files/fileUserPermissionsHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testFileId = 1; + const sandbox: SinonSandbox = createSandbox() + const testFileId = 1 afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return file user permissions on repository success', async () => { - const testFileUserPermissions = createFileUserPermissionsModel(); - const filesRepositoryStub = {}; - const getFileUserPermissionsStub = sandbox.stub().returns(testFileUserPermissions); - filesRepositoryStub.getFileUserPermissions = getFileUserPermissionsStub; - const sut = new GetFileUserPermissions(filesRepositoryStub); + const testFileUserPermissions = createFileUserPermissionsModel() + const filesRepositoryStub = {} + const getFileUserPermissionsStub = sandbox.stub().returns(testFileUserPermissions) + filesRepositoryStub.getFileUserPermissions = getFileUserPermissionsStub + const sut = new GetFileUserPermissions(filesRepositoryStub) - const actual = await sut.execute(testFileId); + const actual = await sut.execute(testFileId) - assert.match(actual, testFileUserPermissions); - assert.calledWithExactly(getFileUserPermissionsStub, testFileId); - }); + assert.match(actual, testFileUserPermissions) + assert.calledWithExactly(getFileUserPermissionsStub, testFileId) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getFileUserPermissions = sandbox.stub().throwsException(testReadError); - const sut = new GetFileUserPermissions(filesRepositoryStub); + const filesRepositoryStub = {} + const testReadError = new ReadError() + filesRepositoryStub.getFileUserPermissions = sandbox.stub().throwsException(testReadError) + const sut = new GetFileUserPermissions(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/info/DataverseInfoRepository.test.ts b/test/unit/info/DataverseInfoRepository.test.ts index 52c9ce73..2bd34c94 100644 --- a/test/unit/info/DataverseInfoRepository.test.ts +++ b/test/unit/info/DataverseInfoRepository.test.ts @@ -1,135 +1,142 @@ -import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import axios from 'axios'; -import { expect } from 'chai'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import axios from 'axios' +import { expect } from 'chai' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' describe('DataverseInfoRepository', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: DataverseInfoRepository = new DataverseInfoRepository(); + const sandbox: SinonSandbox = createSandbox() + const sut: DataverseInfoRepository = new DataverseInfoRepository() beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) describe('getDataverseVersion', () => { test('should return Dataverse version on successful response', async () => { - const testVersionNumber = '5.13'; - const testVersionBuild = 'testBuild'; + const testVersionNumber = '5.13' + const testVersionBuild = 'testBuild' const testSuccessfulResponse = { data: { status: 'OK', data: { version: testVersionNumber, - build: testVersionBuild, - }, - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse); + build: testVersionBuild + } + } + } + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) - const actual = await sut.getDataverseVersion(); + const actual = await sut.getDataverseVersion() assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/info/version`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual.number, testVersionNumber); - assert.match(actual.build, testVersionBuild); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual.number, testVersionNumber) + assert.match(actual.build, testVersionBuild) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getDataverseVersion().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getDataverseVersion().catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/info/version`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('getZipDownloadLimit', () => { test('should return zip download limit on successful response', async () => { - const testZipDownloadLimit = 100; + const testZipDownloadLimit = 100 const testSuccessfulResponse = { data: { status: 'OK', - data: testZipDownloadLimit.toString(), - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse); + data: testZipDownloadLimit.toString() + } + } + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) - const actual = await sut.getZipDownloadLimit(); + const actual = await sut.getZipDownloadLimit() assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/info/zipDownloadLimit`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual, testZipDownloadLimit); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual, testZipDownloadLimit) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getZipDownloadLimit().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getZipDownloadLimit().catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/info/zipDownloadLimit`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) + }) describe('getMaxEmbargoDurationInMonths', () => { test('should return duration on successful response', async () => { - const testDuration = 12; + const testDuration = 12 const testSuccessfulResponse = { data: { status: 'OK', data: { - message: testDuration.toString(), - }, - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse); + message: testDuration.toString() + } + } + } + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) - const actual = await sut.getMaxEmbargoDurationInMonths(); + const actual = await sut.getMaxEmbargoDurationInMonths() assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/info/settings/:MaxEmbargoDurationInMonths`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual, testDuration); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual, testDuration) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/info/settings/:MaxEmbargoDurationInMonths`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); - }); -}); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) + }) +}) diff --git a/test/unit/info/GetDataverseVersion.test.ts b/test/unit/info/GetDataverseVersion.test.ts index 1db3a222..a054b307 100644 --- a/test/unit/info/GetDataverseVersion.test.ts +++ b/test/unit/info/GetDataverseVersion.test.ts @@ -1,35 +1,35 @@ -import { GetDataverseVersion } from '../../../src/info/domain/useCases/GetDataverseVersion'; -import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; +import { GetDataverseVersion } from '../../../src/info/domain/useCases/GetDataverseVersion' +import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return successful result with version on repository success', async () => { - const testDataverseVersion = '5.13'; - const dataverseInfoRepositoryStub = {}; - dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().returns(testDataverseVersion); - const sut = new GetDataverseVersion(dataverseInfoRepositoryStub); + const testDataverseVersion = '5.13' + const dataverseInfoRepositoryStub = {} + dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().returns(testDataverseVersion) + const sut = new GetDataverseVersion(dataverseInfoRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testDataverseVersion); - }); + assert.match(actual, testDataverseVersion) + }) test('should return error result on repository error', async () => { - const dataverseInfoRepositoryStub = {}; - const testReadError = new ReadError(); - dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().throwsException(testReadError); - const sut = new GetDataverseVersion(dataverseInfoRepositoryStub); + const dataverseInfoRepositoryStub = {} + const testReadError = new ReadError() + dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().throwsException(testReadError) + const sut = new GetDataverseVersion(dataverseInfoRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts b/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts index 57953254..eb896e56 100644 --- a/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts +++ b/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts @@ -1,35 +1,37 @@ -import { GetMaxEmbargoDurationInMonths } from '../../../src/info/domain/useCases/GetMaxEmbargoDurationInMonths'; -import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; +import { GetMaxEmbargoDurationInMonths } from '../../../src/info/domain/useCases/GetMaxEmbargoDurationInMonths' +import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return duration on repository success', async () => { - const testDuration = 12; - const dataverseInfoRepositoryStub = {}; - dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = sandbox.stub().returns(testDuration); - const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub); + const testDuration = 12 + const dataverseInfoRepositoryStub = {} + dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = sandbox.stub().returns(testDuration) + const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testDuration); - }); + assert.match(actual, testDuration) + }) test('should return error result on repository error', async () => { - const dataverseInfoRepositoryStub = {}; - const testReadError = new ReadError(); - dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = sandbox.stub().throwsException(testReadError); - const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const dataverseInfoRepositoryStub = {} + const testReadError = new ReadError() + dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = sandbox + .stub() + .throwsException(testReadError) + const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub) + + let actualError: ReadError = undefined + await sut.execute().catch((e) => (actualError = e)) + + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/info/GetZipDownloadLimit.test.ts b/test/unit/info/GetZipDownloadLimit.test.ts index 94e1953a..d503a681 100644 --- a/test/unit/info/GetZipDownloadLimit.test.ts +++ b/test/unit/info/GetZipDownloadLimit.test.ts @@ -1,35 +1,35 @@ -import { GetZipDownloadLimit } from '../../../src/info/domain/useCases/GetZipDownloadLimit'; -import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; +import { GetZipDownloadLimit } from '../../../src/info/domain/useCases/GetZipDownloadLimit' +import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return successful result on repository success', async () => { - const testZipDownloadLimit = 100; - const dataverseInfoRepositoryStub = {}; - dataverseInfoRepositoryStub.getZipDownloadLimit = sandbox.stub().returns(testZipDownloadLimit); - const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub); + const testZipDownloadLimit = 100 + const dataverseInfoRepositoryStub = {} + dataverseInfoRepositoryStub.getZipDownloadLimit = sandbox.stub().returns(testZipDownloadLimit) + const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testZipDownloadLimit); - }); + assert.match(actual, testZipDownloadLimit) + }) test('should return error result on repository error', async () => { - const dataverseInfoRepositoryStub = {}; - const testReadError = new ReadError(); - dataverseInfoRepositoryStub.getZipDownloadLimit = sandbox.stub().throwsException(testReadError); - const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub); + const dataverseInfoRepositoryStub = {} + const testReadError = new ReadError() + dataverseInfoRepositoryStub.getZipDownloadLimit = sandbox.stub().throwsException(testReadError) + const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts index df922ac6..7c7d00e0 100644 --- a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts +++ b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts @@ -1,39 +1,41 @@ -import { GetMetadataBlockByName } from '../../../src/metadataBlocks/domain/useCases/GetMetadataBlockByName'; -import { IMetadataBlocksRepository } from '../../../src/metadataBlocks/domain/repositories/IMetadataBlocksRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { createMetadataBlockModel } from '../../testHelpers/metadataBlocks/metadataBlockHelper'; +import { GetMetadataBlockByName } from '../../../src/metadataBlocks/domain/useCases/GetMetadataBlockByName' +import { IMetadataBlocksRepository } from '../../../src/metadataBlocks/domain/repositories/IMetadataBlocksRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createMetadataBlockModel } from '../../testHelpers/metadataBlocks/metadataBlockHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testMetadataBlockName = 'test'; + const sandbox: SinonSandbox = createSandbox() + const testMetadataBlockName = 'test' afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return metadata block on repository success', async () => { - const testMetadataBlock = createMetadataBlockModel(); - const metadataBlocksRepositoryStub = {}; - const getMetadataBlockByNameStub = sandbox.stub().returns(testMetadataBlock); - metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub; - const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub); + const testMetadataBlock = createMetadataBlockModel() + const metadataBlocksRepositoryStub = {} + const getMetadataBlockByNameStub = sandbox.stub().returns(testMetadataBlock) + metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub + const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub) - const actual = await sut.execute(testMetadataBlockName); + const actual = await sut.execute(testMetadataBlockName) - assert.match(actual, testMetadataBlock); - assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlockName); - }); + assert.match(actual, testMetadataBlock) + assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlockName) + }) test('should return error result on repository error', async () => { - const metadataBlocksRepositoryStub = {}; - const testReadError = new ReadError(); - metadataBlocksRepositoryStub.getMetadataBlockByName = sandbox.stub().throwsException(testReadError); - const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testMetadataBlockName).catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const metadataBlocksRepositoryStub = {} + const testReadError = new ReadError() + metadataBlocksRepositoryStub.getMetadataBlockByName = sandbox + .stub() + .throwsException(testReadError) + const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub) + + let actualError: ReadError = undefined + await sut.execute(testMetadataBlockName).catch((e) => (actualError = e)) + + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts index ffd82243..b7a87eee 100644 --- a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts @@ -1,64 +1,71 @@ -import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import axios from 'axios'; -import { expect } from 'chai'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; +import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import axios from 'axios' +import { expect } from 'chai' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' import { createMetadataBlockModel, - createMetadataBlockPayload, -} from '../../testHelpers/metadataBlocks/metadataBlockHelper'; -import { TestConstants } from '../../testHelpers/TestConstants'; + createMetadataBlockPayload +} from '../../testHelpers/metadataBlocks/metadataBlockHelper' +import { TestConstants } from '../../testHelpers/TestConstants' describe('getMetadataBlockByName', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: MetadataBlocksRepository = new MetadataBlocksRepository(); - const testMetadataBlockName = 'test'; + const sandbox: SinonSandbox = createSandbox() + const sut: MetadataBlocksRepository = new MetadataBlocksRepository() + const testMetadataBlockName = 'test' beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return metadata block on successful response', async () => { const testSuccessfulResponse = { data: { status: 'OK', - data: createMetadataBlockPayload(), - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse); + data: createMetadataBlockPayload() + } + } + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) - const actual = await sut.getMetadataBlockByName(testMetadataBlockName); + const actual = await sut.getMetadataBlockByName(testMetadataBlockName) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/metadatablocks/${testMetadataBlockName}`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - assert.match(actual, createMetadataBlockModel()); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + assert.match(actual, createMetadataBlockModel()) + }) test('should return error result on error response', async () => { const testErrorResponse = { response: { status: 'ERROR', - message: 'test', - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').rejects(testErrorResponse); + message: 'test' + } + } + const axiosGetStub = sandbox.stub(axios, 'get').rejects(testErrorResponse) - let error: ReadError = undefined; - await sut.getMetadataBlockByName(testMetadataBlockName).catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getMetadataBlockByName(testMetadataBlockName).catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/metadatablocks/${testMetadataBlockName}`, - TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG, - ); - expect(error).to.be.instanceOf(Error); - }); -}); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).to.be.instanceOf(Error) + }) +}) diff --git a/test/unit/users/GetCurrentAuthenticatedUser.test.ts b/test/unit/users/GetCurrentAuthenticatedUser.test.ts index 622e1de9..f6b1142c 100644 --- a/test/unit/users/GetCurrentAuthenticatedUser.test.ts +++ b/test/unit/users/GetCurrentAuthenticatedUser.test.ts @@ -1,36 +1,36 @@ -import { GetCurrentAuthenticatedUser } from '../../../src/users/domain/useCases/GetCurrentAuthenticatedUser'; -import { IUsersRepository } from '../../../src/users/domain/repositories/IUsersRepository'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { createAuthenticatedUser } from '../../testHelpers/users/authenticatedUserHelper'; +import { GetCurrentAuthenticatedUser } from '../../../src/users/domain/useCases/GetCurrentAuthenticatedUser' +import { IUsersRepository } from '../../../src/users/domain/repositories/IUsersRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createAuthenticatedUser } from '../../testHelpers/users/authenticatedUserHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); + const sandbox: SinonSandbox = createSandbox() afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return successful result with authenticated user on repository success', async () => { - const testAuthenticatedUser = createAuthenticatedUser(); - const usersRepositoryStub = {}; - usersRepositoryStub.getCurrentAuthenticatedUser = sandbox.stub().returns(testAuthenticatedUser); - const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub); + const testAuthenticatedUser = createAuthenticatedUser() + const usersRepositoryStub = {} + usersRepositoryStub.getCurrentAuthenticatedUser = sandbox.stub().returns(testAuthenticatedUser) + const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testAuthenticatedUser); - }); + assert.match(actual, testAuthenticatedUser) + }) test('should return error result on repository error', async () => { - const usersRepositoryStub = {}; - const testReadError = new ReadError(); - usersRepositoryStub.getCurrentAuthenticatedUser = sandbox.stub().throwsException(testReadError); - const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub); + const usersRepositoryStub = {} + const testReadError = new ReadError() + usersRepositoryStub.getCurrentAuthenticatedUser = sandbox.stub().throwsException(testReadError) + const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); + let actualError: ReadError = undefined + await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testReadError); - }); -}); + assert.match(actualError, testReadError) + }) +}) diff --git a/test/unit/users/UsersRepository.test.ts b/test/unit/users/UsersRepository.test.ts index 6bc7fbc8..0ec58fa4 100644 --- a/test/unit/users/UsersRepository.test.ts +++ b/test/unit/users/UsersRepository.test.ts @@ -1,26 +1,33 @@ -import { UsersRepository } from '../../../src/users/infra/repositories/UsersRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import axios from 'axios'; -import { expect } from 'chai'; -import { ReadError } from '../../../src/core/domain/repositories/ReadError'; -import { createAuthenticatedUser } from '../../testHelpers/users/authenticatedUserHelper'; -import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'; -import { TestConstants } from '../../testHelpers/TestConstants'; +import { UsersRepository } from '../../../src/users/infra/repositories/UsersRepository' +import { assert, createSandbox, SinonSandbox } from 'sinon' +import axios from 'axios' +import { expect } from 'chai' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { createAuthenticatedUser } from '../../testHelpers/users/authenticatedUserHelper' +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' describe('getCurrentAuthenticatedUser', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: UsersRepository = new UsersRepository(); + const sandbox: SinonSandbox = createSandbox() + const sut: UsersRepository = new UsersRepository() beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) afterEach(() => { - sandbox.restore(); - }); + sandbox.restore() + }) test('should return authenticated user on successful response', async () => { - const testAuthenticatedUser = createAuthenticatedUser(); + const testAuthenticatedUser = createAuthenticatedUser() const testSuccessfulResponse = { data: { status: 'OK', @@ -37,48 +44,48 @@ describe('getCurrentAuthenticatedUser', () => { createdTime: testAuthenticatedUser.createdTime, authenticationProviderId: testAuthenticatedUser.authenticationProviderId, lastLoginTime: testAuthenticatedUser.lastLoginTime, - lastApiUseTime: testAuthenticatedUser.lastApiUseTime, - }, - }, - }; - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse); - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/users/:me`; + lastApiUseTime: testAuthenticatedUser.lastApiUseTime + } + } + } + const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/users/:me` // API Key auth - let actual = await sut.getCurrentAuthenticatedUser(); + let actual = await sut.getCurrentAuthenticatedUser() assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) - assert.match(actual, testAuthenticatedUser); + assert.match(actual, testAuthenticatedUser) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - actual = await sut.getCurrentAuthenticatedUser(); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + actual = await sut.getCurrentAuthenticatedUser() assert.calledWithExactly( axiosGetStub, expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) - assert.match(actual, testAuthenticatedUser); - }); + assert.match(actual, testAuthenticatedUser) + }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); + const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined; - await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)); + let error: ReadError = undefined + await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)) assert.calledWithExactly( axiosGetStub, `${TestConstants.TEST_API_URL}/users/:me`, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); -}); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).to.be.instanceOf(Error) + }) +}) diff --git a/tsconfig.json b/tsconfig.json index 2a49ab9b..bdfc1bd5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,25 @@ { - "compilerOptions": { - "declaration": true, - "declarationDir": "./dist", - "module": "commonjs", - "noImplicitAny": true, - "lib": ["es2017", "es7", "es6", "dom"], - "moduleResolution": "node", - "noUnusedLocals": true, - "noUnusedParameters": true, - "sourceMap": true, - "target": "es5", - "outDir": "./dist", - "esModuleInterop": true, - "resolveJsonModule": true - }, - "include": [ "src/**/*"], - "exclude": ["node_modules", "dist"] + "compilerOptions": { + "declaration": true, + "declarationDir": "./dist", + "module": "commonjs", + "noImplicitAny": true, + "lib": ["es2017", "es7", "es6", "dom"], + "moduleResolution": "node", + "noUnusedLocals": true, + "noUnusedParameters": true, + "sourceMap": true, + "target": "es5", + "outDir": "./dist", + "esModuleInterop": true, + "resolveJsonModule": true + }, + "include": [ + "src/**/*", + "test", + "jest.config.integration.ts", + "jest.config.js", + "jest.config.unit.ts" + ], + "exclude": ["node_modules", "dist"] } From ae02bca8b54a3bcdf432a9849d2d27e2b8f87c98 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 7 Feb 2024 14:03:19 +0100 Subject: [PATCH 02/11] feat(formatting): add pre-commit to format code automatically --- jest.config.ts | 2 +- package-lock.json | 156 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 13 +++- tsconfig.json | 2 +- 4 files changed, 170 insertions(+), 3 deletions(-) diff --git a/jest.config.ts b/jest.config.ts index 55f4668b..140c24db 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -12,4 +12,4 @@ const config: Config = { testTimeout: 25000 } -export default config; +export default config diff --git a/package-lock.json b/package-lock.json index 7cdd9637..18881de5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "eslint-plugin-simple-import-sort": "10.0.0", "eslint-plugin-unused-imports": "2.0.0", "jest": "^29.4.3", + "pre-commit": "^1.2.2", "prettier": "2.8.4", "sinon": "^15.0.3", "testcontainers": "^9.9.1", @@ -2805,6 +2806,57 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5854,6 +5906,15 @@ "node": ">= 0.8.0" } }, + "node_modules/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6074,6 +6135,78 @@ "node": ">=8" } }, + "node_modules/pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/pre-commit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pre-commit/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6172,6 +6305,12 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6629,6 +6768,17 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", @@ -7227,6 +7377,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", diff --git a/package.json b/package.json index 5d06f009..4e5496ed 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,18 @@ "lint:fix": "eslint --fix --ext .ts ./src --ignore-path .gitignore .", "lint:eslint": "eslint --ignore-path .gitignore .", "lint:prettier": "prettier --check '**/*.(yml|json|md)'", - "format": "prettier --write './**/*.{js,ts,md,json,yml,md}' --config ./.prettierrc" + "format": "prettier --write './**/*.{js,ts,md,json,yml,md}' --config ./.prettierrc", + "typecheck": "tsc --noEmit", + "git:add": "git add ." }, + "pre-commit": [ + "format", + "typecheck", + "lint:fix", + "git:add", + "test:unit", + "test:coverage" + ], "repository": { "type": "git", "url": "git+https://github.com/IQSS/dataverse-client-javascript.git" @@ -47,6 +57,7 @@ "eslint-plugin-simple-import-sort": "10.0.0", "eslint-plugin-unused-imports": "2.0.0", "jest": "^29.4.3", + "pre-commit": "1.2.2", "prettier": "2.8.4", "sinon": "^15.0.3", "testcontainers": "^9.9.1", diff --git a/tsconfig.json b/tsconfig.json index bdfc1bd5..e77ed292 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "sourceMap": true, - "target": "es5", + "target": "es2015", "outDir": "./dist", "esModuleInterop": true, "resolveJsonModule": true From d3f99e5e1bb37873d79add0a99cc3395af3a7b7c Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 7 Feb 2024 14:11:40 +0100 Subject: [PATCH 03/11] feat(formatting): add coverage check to pre-commit --- jest.config.ts | 10 +++++++++- package.json | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/jest.config.ts b/jest.config.ts index 140c24db..37971368 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -9,7 +9,15 @@ const config: Config = { moduleFileExtensions: ['ts', 'js', 'json', 'node'], coveragePathIgnorePatterns: ['node_modules', 'testHelpers'], globalSetup: '/test/integration/environment/setup.ts', - testTimeout: 25000 + testTimeout: 25000, + coverageThreshold: { + global: { + branches: 95, + functions: 95, + lines: 95, + statements: 95 + } + } } export default config diff --git a/package.json b/package.json index 4e5496ed..b619b8be 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "test:unit": "jest -c jest.config.unit.ts", "test:integration": "jest -c jest.config.integration.ts", "test:coverage": "jest --coverage -c jest.config.ts", + "test:coverage:check": "jest --coverage --ci --config jest.config.ts", "lint": "npm run lint:eslint && npm run lint:prettier", "lint:fix": "eslint --fix --ext .ts ./src --ignore-path .gitignore .", "lint:eslint": "eslint --ignore-path .gitignore .", @@ -26,8 +27,7 @@ "typecheck", "lint:fix", "git:add", - "test:unit", - "test:coverage" + "test:coverage:check" ], "repository": { "type": "git", From 61ce5dfb25bbfc205da382a4cee6d728c45662bc Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 12:05:40 +0100 Subject: [PATCH 04/11] feat(formatting): replace chai and sinon by jest in all unit tests --- .../infra/repositories/FilesRepository.ts | 2 +- .../repositories/DataverseInfoRepository.ts | 4 +- test/testHelpers/datasets/datasetHelper.ts | 5 - test/unit/auth/AuthRepository.test.ts | 22 +- test/unit/auth/Logout.test.ts | 18 +- test/unit/datasets/DatasetsRepository.test.ts | 233 ++++++-------- .../datasets/GetAllDatasetPreviews.test.ts | 25 +- test/unit/datasets/GetDataset.test.ts | 26 +- test/unit/datasets/GetDatasetCitation.test.ts | 27 +- test/unit/datasets/GetDatasetLocks.test.ts | 24 +- .../GetDatasetSummaryFieldNames.test.ts | 22 +- .../GetDatasetUserPermissions.test.ts | 30 +- .../datasets/GetPrivateUrlDataset.test.ts | 24 +- .../GetPrivateUrlDatasetCitation.test.ts | 33 +- test/unit/files/FilesRepository.test.ts | 295 ++++++++---------- test/unit/files/GetDatasetFileCounts.test.ts | 29 +- test/unit/files/GetDatasetFiles.test.ts | 29 +- .../GetDatasetFilesTotalDownloadSize.test.ts | 46 ++- test/unit/files/GetFile.test.ts | 47 +-- test/unit/files/GetFileDataTables.test.ts | 21 +- test/unit/files/GetFileDownloadCount.test.ts | 35 +-- .../unit/files/GetFileUserPermissions.test.ts | 28 +- .../unit/info/DataverseInfoRepository.test.ts | 70 ++--- test/unit/info/GetDataverseVersion.test.ts | 21 +- .../GetMaxEmbargoDurationInMonths.test.ts | 30 +- test/unit/info/GetZipDownloadLimit.test.ts | 25 +- .../GetMetadataBlockByName.test.ts | 30 +- .../MetadataBlocksRepository.test.ts | 23 +- .../users/GetCurrentAuthenticatedUser.test.ts | 22 +- test/unit/users/UsersRepository.test.ts | 30 +- 30 files changed, 469 insertions(+), 807 deletions(-) diff --git a/src/files/infra/repositories/FilesRepository.ts b/src/files/infra/repositories/FilesRepository.ts index 0940706a..17f471a7 100644 --- a/src/files/infra/repositories/FilesRepository.ts +++ b/src/files/infra/repositories/FilesRepository.ts @@ -138,7 +138,7 @@ export class FilesRepository extends ApiRepository implements IFilesRepository { public async getFileDownloadCount(fileId: number | string): Promise { return this.doGet(this.buildApiEndpoint(this.filesResourceName, `downloadCount`, fileId), true) - .then((response) => response.data.data.message as number) + .then((response) => parseInt(response.data.data.message)) .catch((error) => { throw error }) diff --git a/src/info/infra/repositories/DataverseInfoRepository.ts b/src/info/infra/repositories/DataverseInfoRepository.ts index 963401d4..71ba653b 100644 --- a/src/info/infra/repositories/DataverseInfoRepository.ts +++ b/src/info/infra/repositories/DataverseInfoRepository.ts @@ -16,7 +16,7 @@ export class DataverseInfoRepository extends ApiRepository implements IDataverse public async getZipDownloadLimit(): Promise { return this.doGet(this.buildApiEndpoint(this.infoResourceName, `zipDownloadLimit`)) - .then((response) => response.data.data as number) + .then((response) => parseInt(response.data.data)) .catch((error) => { throw error }) @@ -26,7 +26,7 @@ export class DataverseInfoRepository extends ApiRepository implements IDataverse return this.doGet( this.buildApiEndpoint(this.infoResourceName, `settings/:MaxEmbargoDurationInMonths`) ) - .then((response) => response.data.data.message as number) + .then((response) => parseInt(response.data.data.message)) .catch((error) => { throw error }) diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index 4432fb00..66cc00c9 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -86,11 +86,6 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { releaseTime: DATASET_RELEASE_TIME_STR, createTime: DATASET_CREATE_TIME_STR, publicationDate: DATASET_PUBLICATION_DATE_STR, - license: { - name: 'CC0 1.0', - uri: 'https://creativecommons.org/publicdomain/zero/1.0/', - iconUri: 'https://licensebuttons.net/p/zero/1.0/88x31.png' - }, metadataBlocks: { citation: { name: 'citation', diff --git a/test/unit/auth/AuthRepository.test.ts b/test/unit/auth/AuthRepository.test.ts index 9e473a2f..b0261dfa 100644 --- a/test/unit/auth/AuthRepository.test.ts +++ b/test/unit/auth/AuthRepository.test.ts @@ -1,7 +1,5 @@ import { AuthRepository } from '../../../src/auth/infra/repositories/AuthRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import axios from 'axios' -import { expect } from 'chai' import { ApiConfig, DataverseApiAuthMechanism @@ -10,7 +8,6 @@ import { WriteError } from '../../../src/core/domain/repositories/WriteError' import { TestConstants } from '../../testHelpers/TestConstants' describe('logout', () => { - const sandbox: SinonSandbox = createSandbox() const sut: AuthRepository = new AuthRepository() beforeEach(() => { @@ -21,10 +18,6 @@ describe('logout', () => { ) }) - afterEach(() => { - sandbox.restore() - }) - test('should not return error on successful response', async () => { const testSuccessfulResponse = { data: { @@ -34,14 +27,13 @@ describe('logout', () => { } } } - const axiosPostStub = sandbox.stub(axios, 'post').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'post').mockResolvedValue(testSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/logout` // API Key auth await sut.logout() - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( expectedApiEndpoint, JSON.stringify(''), TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY @@ -52,8 +44,7 @@ describe('logout', () => { await sut.logout() - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( expectedApiEndpoint, JSON.stringify(''), TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE @@ -61,17 +52,16 @@ describe('logout', () => { }) test('should return error result on error response', async () => { - const axiosPostStub = sandbox.stub(axios, 'post').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'post').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: WriteError = undefined await sut.logout().catch((e) => (error = e)) - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/logout`, JSON.stringify(''), TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) diff --git a/test/unit/auth/Logout.test.ts b/test/unit/auth/Logout.test.ts index 38a3055a..e3db6e52 100644 --- a/test/unit/auth/Logout.test.ts +++ b/test/unit/auth/Logout.test.ts @@ -1,5 +1,5 @@ import { Logout } from '../../../src/auth/domain/useCases/Logout' -import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createSandbox, SinonSandbox } from 'sinon' import { IAuthRepository } from '../../../src/auth/domain/repositories/IAuthRepository' import { WriteError } from '../../../src/core/domain/repositories/WriteError' @@ -11,21 +11,19 @@ describe('execute', () => { }) test('should not return error on repository success', async () => { - const authRepositoryMock = {} - authRepositoryMock.logout = sandbox.mock() - const sut = new Logout(authRepositoryMock) + const authRepositoryStub: IAuthRepository = {} as IAuthRepository + authRepositoryStub.logout = jest.fn() + const sut = new Logout(authRepositoryStub) await sut.execute() + expect(authRepositoryStub.logout).toHaveBeenCalled() }) test('should return error result on repository error', async () => { - const authRepositoryStub = {} const testWriteError = new WriteError() - authRepositoryStub.logout = sandbox.stub().throwsException(testWriteError) + const authRepositoryStub: IAuthRepository = {} as IAuthRepository + authRepositoryStub.logout = jest.fn().mockRejectedValue(testWriteError) const sut = new Logout(authRepositoryStub) - let actualError: WriteError = undefined - await sut.execute().catch((e) => (actualError = e)) - - assert.match(actualError, testWriteError) + await expect(sut.execute()).rejects.toThrow(testWriteError) }) }) diff --git a/test/unit/datasets/DatasetsRepository.test.ts b/test/unit/datasets/DatasetsRepository.test.ts index 479e589b..b6af59a4 100644 --- a/test/unit/datasets/DatasetsRepository.test.ts +++ b/test/unit/datasets/DatasetsRepository.test.ts @@ -1,7 +1,5 @@ import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import axios from 'axios' -import { expect } from 'chai' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { ApiConfig, @@ -25,7 +23,6 @@ import { } from '../../testHelpers/datasets/datasetPreviewHelper' describe('DatasetsRepository', () => { - const sandbox: SinonSandbox = createSandbox() const sut: DatasetsRepository = new DatasetsRepository() const testDatasetVersionSuccessfulResponse = { data: { @@ -54,10 +51,6 @@ describe('DatasetsRepository', () => { ) }) - afterEach(() => { - sandbox.restore() - }) - describe('getDatasetSummaryFieldNames', () => { test('should return fields on successful response', async () => { const testFieldNames = ['test1', 'test2'] @@ -67,30 +60,28 @@ describe('DatasetsRepository', () => { data: testFieldNames } } - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) const actual = await sut.getDatasetSummaryFieldNames() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/summaryFieldNames`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual, testFieldNames) + expect(actual).toStrictEqual(testFieldNames) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getDatasetSummaryFieldNames().catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/summaryFieldNames`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -109,9 +100,7 @@ describe('DatasetsRepository', () => { describe('by numeric id', () => { test('should return Dataset when providing id, version id, and response is successful', async () => { - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testDatasetVersionSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}` // API Key auth @@ -121,18 +110,17 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, testDatasetModel) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(testDatasetModel) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, testDatasetModel) + expect(actual).toStrictEqual(testDatasetModel) }) test('should return Dataset when providing id, version id, and response with license is successful', async () => { @@ -143,9 +131,7 @@ describe('DatasetsRepository', () => { data: createDatasetVersionPayload(testDatasetLicense) } } - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testDatasetVersionWithLicenseSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionWithLicenseSuccessfulResponse) const actual = await sut.getDataset( testDatasetModel.id, @@ -153,12 +139,11 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, expectedRequestConfigApiKey ) - assert.match(actual, createDatasetModel(testDatasetLicense)) + expect(actual).toStrictEqual(createDatasetModel(testDatasetLicense)) }) test('should return Dataset when providing id, version id, and response with license without icon URI is successful', async () => { @@ -169,9 +154,7 @@ describe('DatasetsRepository', () => { data: createDatasetVersionPayload(testDatasetLicenseWithoutIconUri) } } - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testDatasetVersionWithLicenseSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionWithLicenseSuccessfulResponse) const actual = await sut.getDataset( testDatasetModel.id, @@ -179,35 +162,31 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, expectedRequestConfigApiKey ) - assert.match(actual, createDatasetModel(testDatasetLicenseWithoutIconUri)) + expect(actual).toStrictEqual(createDatasetModel(testDatasetLicenseWithoutIconUri)) }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, expectedRequestConfigApiKey ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) describe('by persistent id', () => { test('should return Dataset when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testDatasetVersionSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testVersionId}?persistentId=${testDatasetModel.persistentId}` // API Key auth @@ -217,8 +196,8 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, testDatasetModel) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(testDatasetModel) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -229,65 +208,61 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, testDatasetModel) + expect(actual).toStrictEqual(testDatasetModel) }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getDataset(testDatasetModel.persistentId, testVersionId, testIncludeDeaccessioned) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testVersionId}?persistentId=${testDatasetModel.persistentId}`, expectedRequestConfigApiKey ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) describe('getPrivateUrlDataset', () => { test('should return Dataset when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetVersionSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse) const actual = await sut.getPrivateUrlDataset(testPrivateUrlToken) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual, testDatasetModel) + expect(actual).toStrictEqual(testDatasetModel) }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getPrivateUrlDataset(testPrivateUrlToken).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) describe('getDatasetCitation', () => { const testIncludeDeaccessioned = true test('should return citation when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testCitationSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}/citation` // API Key auth @@ -297,12 +272,11 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED ) - assert.match(actual, testCitation) + expect(actual).toStrictEqual(testCitation) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -313,57 +287,53 @@ describe('DatasetsRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE_INCLUDE_DEACCESSIONED ) - assert.match(actual, testCitation) + expect(actual).toStrictEqual(testCitation) }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getDatasetCitation(1, testVersionId, testIncludeDeaccessioned) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}/citation`, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) describe('getPrivateUrlDatasetCitation', () => { test('should return citation when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testCitationSuccessfulResponse) const actual = await sut.getPrivateUrlDatasetCitation(testPrivateUrlToken) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}/citation`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual, testCitation) + expect(actual).toStrictEqual(testCitation) }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getPrivateUrlDatasetCitation(testPrivateUrlToken).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}/citation`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -380,43 +350,40 @@ describe('DatasetsRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/userPermissions` test('should return dataset user permissions when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetUserPermissionsResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetUserPermissionsResponse) // API Key auth let actual = await sut.getDatasetUserPermissions(testDatasetModel.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testDatasetUserPermissions) + expect(actual).toStrictEqual(testDatasetUserPermissions) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetUserPermissions(testDatasetModel.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testDatasetUserPermissions) + expect(actual).toStrictEqual(testDatasetUserPermissions) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getDatasetUserPermissions(testDatasetModel.id).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -424,44 +391,41 @@ describe('DatasetsRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/userPermissions?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return dataset user permissions when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetUserPermissionsResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetUserPermissionsResponse) // API Key auth let actual = await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testDatasetUserPermissions) + expect(actual).toStrictEqual(testDatasetUserPermissions) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testDatasetUserPermissions) + expect(actual).toStrictEqual(testDatasetUserPermissions) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getDatasetUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -479,43 +443,40 @@ describe('DatasetsRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/locks` test('should return dataset locks when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetLocksResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetLocksResponse) // API Key auth let actual = await sut.getDatasetLocks(testDatasetModel.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testDatasetLocks) + expect(actual).toStrictEqual(testDatasetLocks) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetLocks(testDatasetModel.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testDatasetLocks) + expect(actual).toStrictEqual(testDatasetLocks) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getDatasetLocks(testDatasetModel.id).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -523,42 +484,39 @@ describe('DatasetsRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/locks?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return dataset locks when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetLocksResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetLocksResponse) // API Key auth let actual = await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testDatasetLocks) + expect(actual).toStrictEqual(testDatasetLocks) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testDatasetLocks) + expect(actual).toStrictEqual(testDatasetLocks) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getDatasetLocks(TestConstants.TEST_DUMMY_PERSISTENT_ID).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -585,33 +543,31 @@ describe('DatasetsRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search?q=*&type=dataset&sort=date&order=desc` test('should return dataset previews when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetPreviewsResponse) // API Key auth let actual = await sut.getAllDatasetPreviews() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testDatasetPreviewSubset) + expect(actual).toStrictEqual(testDatasetPreviewSubset) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getAllDatasetPreviews() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testDatasetPreviewSubset) + expect(actual).toStrictEqual(testDatasetPreviewSubset) }) test('should return dataset previews when providing pagination params and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetPreviewsResponse) const testLimit = 10 const testOffset = 20 @@ -629,12 +585,11 @@ describe('DatasetsRepository', () => { headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers } - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigApiKeyWithPagination ) - assert.match(actual, testDatasetPreviewSubset) + expect(actual).toStrictEqual(testDatasetPreviewSubset) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -648,26 +603,24 @@ describe('DatasetsRepository', () => { TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials } - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookieWithPagination ) - assert.match(actual, testDatasetPreviewSubset) + expect(actual).toStrictEqual(testDatasetPreviewSubset) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getAllDatasetPreviews().catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) diff --git a/test/unit/datasets/GetAllDatasetPreviews.test.ts b/test/unit/datasets/GetAllDatasetPreviews.test.ts index 52763248..88aef14c 100644 --- a/test/unit/datasets/GetAllDatasetPreviews.test.ts +++ b/test/unit/datasets/GetAllDatasetPreviews.test.ts @@ -1,39 +1,26 @@ import { GetAllDatasetPreviews } from '../../../src/datasets/domain/useCases/GetAllDatasetPreviews' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { DatasetPreview } from '../../../src/datasets/domain/models/DatasetPreview' import { createDatasetPreviewModel } from '../../testHelpers/datasets/datasetPreviewHelper' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return dataset previews on repository success', async () => { const testDatasetPreviews: DatasetPreview[] = [createDatasetPreviewModel()] - const datasetsRepositoryStub = {} - const getAllDatasetPreviewsStub = sandbox.stub().returns(testDatasetPreviews) - datasetsRepositoryStub.getAllDatasetPreviews = getAllDatasetPreviewsStub + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getAllDatasetPreviews = jest.fn().mockResolvedValue(testDatasetPreviews) const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) const actual = await sut.execute() - assert.match(actual, testDatasetPreviews) - assert.calledWithExactly(getAllDatasetPreviewsStub, undefined, undefined) + expect(actual).toEqual(testDatasetPreviews) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getAllDatasetPreviews = sandbox.stub().throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getAllDatasetPreviews = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute().catch((e: ReadError) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute()).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/datasets/GetDataset.test.ts b/test/unit/datasets/GetDataset.test.ts index 44e2abe2..35e9beb1 100644 --- a/test/unit/datasets/GetDataset.test.ts +++ b/test/unit/datasets/GetDataset.test.ts @@ -1,39 +1,25 @@ import { GetDataset } from '../../../src/datasets/domain/useCases/GetDataset' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { DatasetNotNumberedVersion } from '../../../src/datasets/domain/models/DatasetNotNumberedVersion' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return dataset on repository success', async () => { const testDataset = createDatasetModel() - const datasetsRepositoryStub = {} - const getDatasetStub = sandbox.stub().returns(testDataset) - datasetsRepositoryStub.getDataset = getDatasetStub + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDataset = jest.fn().mockResolvedValue(testDataset) const sut = new GetDataset(datasetsRepositoryStub) const actual = await sut.execute(1) - assert.match(actual, testDataset) - assert.calledWithExactly(getDatasetStub, 1, DatasetNotNumberedVersion.LATEST, false) + expect(actual).toEqual(testDataset) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getDataset = sandbox.stub().throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDataset = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetDataset(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(1).catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(1)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/datasets/GetDatasetCitation.test.ts b/test/unit/datasets/GetDatasetCitation.test.ts index 3288db6d..1fa18930 100644 --- a/test/unit/datasets/GetDatasetCitation.test.ts +++ b/test/unit/datasets/GetDatasetCitation.test.ts @@ -1,8 +1,7 @@ import { GetDatasetCitation } from '../../../src/datasets/domain/useCases/GetDatasetCitation' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' -import { DatasetNotNumberedVersion } from '../../../src/datasets/domain/models/DatasetNotNumberedVersion' +import { createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { const sandbox: SinonSandbox = createSandbox() @@ -14,32 +13,20 @@ describe('execute', () => { test('should return successful result with citation on repository success', async () => { const testCitation = 'test citation' - const datasetsRepositoryStub = {} - const getDatasetCitationStub = sandbox.stub().returns(testCitation) - datasetsRepositoryStub.getDatasetCitation = getDatasetCitationStub - + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetCitation = jest.fn().mockResolvedValue(testCitation) const sut = new GetDatasetCitation(datasetsRepositoryStub) const actual = await sut.execute(testId) - assert.match(actual, testCitation) - assert.calledWithExactly( - getDatasetCitationStub, - testId, - DatasetNotNumberedVersion.LATEST, - false - ) + expect(actual).toEqual(testCitation) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getDatasetCitation = sandbox.stub().throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetCitation = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetDatasetCitation(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testId).catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testId)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/datasets/GetDatasetLocks.test.ts b/test/unit/datasets/GetDatasetLocks.test.ts index 9cbc81a5..e7c3f921 100644 --- a/test/unit/datasets/GetDatasetLocks.test.ts +++ b/test/unit/datasets/GetDatasetLocks.test.ts @@ -1,39 +1,27 @@ import { GetDatasetLocks } from '../../../src/datasets/domain/useCases/GetDatasetLocks' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' import { createDatasetLockModel } from '../../testHelpers/datasets/datasetLockHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testDatasetId = 1 - afterEach(() => { - sandbox.restore() - }) - test('should return dataset locks on repository success', async () => { const testDatasetLocks = [createDatasetLockModel()] - const datasetsRepositoryStub = {} - const getDatasetLocksStub = sandbox.stub().returns(testDatasetLocks) - datasetsRepositoryStub.getDatasetLocks = getDatasetLocksStub + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetLocks = jest.fn().mockResolvedValue(testDatasetLocks) const sut = new GetDatasetLocks(datasetsRepositoryStub) const actual = await sut.execute(testDatasetId) - assert.match(actual, testDatasetLocks) - assert.calledWithExactly(getDatasetLocksStub, testDatasetId) + expect(actual).toEqual(testDatasetLocks) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getDatasetLocks = sandbox.stub().throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetLocks = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetDatasetLocks(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testDatasetId)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts index da702e72..3bfd5dd5 100644 --- a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts +++ b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts @@ -1,7 +1,7 @@ import { GetDatasetSummaryFieldNames } from '../../../src/datasets/domain/useCases/GetDatasetSummaryFieldNames' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' +import { createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { const sandbox: SinonSandbox = createSandbox() @@ -12,26 +12,22 @@ describe('execute', () => { test('should return successful result with field names on repository success', async () => { const testFieldNames = ['test1', 'test2'] - const datasetsRepositoryStub = {} - datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox.stub().returns(testFieldNames) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetSummaryFieldNames = jest.fn().mockResolvedValue(testFieldNames) const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub) const actual = await sut.execute() - assert.match(actual, testFieldNames) + expect(actual).toEqual(testFieldNames) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox - .stub() - .throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetSummaryFieldNames = jest + .fn() + .mockRejectedValue(new ReadError()) const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute().catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute()).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/datasets/GetDatasetUserPermissions.test.ts b/test/unit/datasets/GetDatasetUserPermissions.test.ts index 5d5129d8..4df87ba4 100644 --- a/test/unit/datasets/GetDatasetUserPermissions.test.ts +++ b/test/unit/datasets/GetDatasetUserPermissions.test.ts @@ -1,39 +1,29 @@ import { GetDatasetUserPermissions } from '../../../src/datasets/domain/useCases/GetDatasetUserPermissions' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { createDatasetUserPermissionsModel } from '../../testHelpers/datasets/datasetUserPermissionsHelper' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +const testDatasetId = 1 describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - const testDatasetId = 1 - - afterEach(() => { - sandbox.restore() - }) - test('should return dataset user permissions on repository success', async () => { const testDatasetUserPermissions = createDatasetUserPermissionsModel() - const datasetsRepositoryStub = {} - const getDatasetUserPermissionsStub = sandbox.stub().returns(testDatasetUserPermissions) - datasetsRepositoryStub.getDatasetUserPermissions = getDatasetUserPermissionsStub + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetUserPermissions = jest + .fn() + .mockResolvedValue(testDatasetUserPermissions) const sut = new GetDatasetUserPermissions(datasetsRepositoryStub) const actual = await sut.execute(testDatasetId) - assert.match(actual, testDatasetUserPermissions) - assert.calledWithExactly(getDatasetUserPermissionsStub, testDatasetId) + expect(actual).toEqual(testDatasetUserPermissions) + expect(datasetsRepositoryStub.getDatasetUserPermissions).toHaveBeenCalledWith(testDatasetId) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getDatasetUserPermissions = sandbox.stub().throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetUserPermissions = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetDatasetUserPermissions(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testDatasetId)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/datasets/GetPrivateUrlDataset.test.ts b/test/unit/datasets/GetPrivateUrlDataset.test.ts index 5b53f17c..f5a44b13 100644 --- a/test/unit/datasets/GetPrivateUrlDataset.test.ts +++ b/test/unit/datasets/GetPrivateUrlDataset.test.ts @@ -1,39 +1,29 @@ import { GetPrivateUrlDataset } from '../../../src/datasets/domain/useCases/GetPrivateUrlDataset' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper' import { ReadError } from '../../../src/core/domain/repositories/ReadError' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testPrivateUrlToken = 'token' - afterEach(() => { - sandbox.restore() - }) - test('should return dataset on repository success', async () => { const testDataset = createDatasetModel() - const datasetsRepositoryStub = {} - const getDatasetStub = sandbox.stub().returns(testDataset) - datasetsRepositoryStub.getPrivateUrlDataset = getDatasetStub + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDataset = jest.fn().mockResolvedValue(testDataset) const sut = new GetPrivateUrlDataset(datasetsRepositoryStub) const actual = await sut.execute(testPrivateUrlToken) - assert.match(actual, testDataset) - assert.calledWithExactly(getDatasetStub, testPrivateUrlToken) + expect(actual).toEqual(testDataset) + expect(datasetsRepositoryStub.getPrivateUrlDataset).toHaveBeenCalledWith(testPrivateUrlToken) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} const testReadError = new ReadError() - datasetsRepositoryStub.getPrivateUrlDataset = sandbox.stub().throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDataset = jest.fn().mockRejectedValue(testReadError) const sut = new GetPrivateUrlDataset(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testPrivateUrlToken)).rejects.toThrow(testReadError) }) }) diff --git a/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts b/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts index 62442a98..f27365ac 100644 --- a/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts +++ b/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts @@ -1,41 +1,30 @@ import { GetPrivateUrlDatasetCitation } from '../../../src/datasets/domain/useCases/GetPrivateUrlDatasetCitation' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testPrivateUrlToken = 'token' - - afterEach(() => { - sandbox.restore() - }) - test('should return successful result with citation on repository success', async () => { const testCitation = 'test citation' - const datasetsRepositoryStub = {} - const getPrivateUrlDatasetCitationStub = sandbox.stub().returns(testCitation) - datasetsRepositoryStub.getPrivateUrlDatasetCitation = getPrivateUrlDatasetCitationStub - + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDatasetCitation = jest.fn().mockResolvedValue(testCitation) const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub) const actual = await sut.execute(testPrivateUrlToken) - assert.match(actual, testCitation) - assert.calledWithExactly(getPrivateUrlDatasetCitationStub, testPrivateUrlToken) + expect(actual).toEqual(testCitation) + expect(datasetsRepositoryStub.getPrivateUrlDatasetCitation).toHaveBeenCalledWith( + testPrivateUrlToken + ) }) test('should return error result on repository error', async () => { - const datasetsRepositoryStub = {} - const testReadError = new ReadError() - datasetsRepositoryStub.getPrivateUrlDatasetCitation = sandbox - .stub() - .throwsException(testReadError) + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDatasetCitation = jest + .fn() + .mockRejectedValue(new ReadError()) const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testPrivateUrlToken)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/files/FilesRepository.test.ts b/test/unit/files/FilesRepository.test.ts index 777c5edd..fe574058 100644 --- a/test/unit/files/FilesRepository.test.ts +++ b/test/unit/files/FilesRepository.test.ts @@ -1,7 +1,5 @@ import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import axios from 'axios' -import { expect } from 'chai' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { ApiConfig, @@ -33,7 +31,6 @@ import { createFilesTotalDownloadSizePayload } from '../../testHelpers/files/fil import { FileDownloadSizeMode } from '../../../src' describe('FilesRepository', () => { - const sandbox: SinonSandbox = createSandbox() const sut: FilesRepository = new FilesRepository() const testFile = createFileModel() @@ -57,10 +54,6 @@ describe('FilesRepository', () => { ) }) - afterEach(() => { - sandbox.restore() - }) - describe('getDatasetFiles', () => { const testTotalCount = 4 const testFilesSuccessfulResponse = { @@ -114,7 +107,7 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/files` test('should return files when providing id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFiles( @@ -124,8 +117,8 @@ describe('FilesRepository', () => { testFileOrderCriteria ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, expectedFiles) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(expectedFiles) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -137,16 +130,15 @@ describe('FilesRepository', () => { testFileOrderCriteria ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, expectedFiles) + expect(actual).toStrictEqual(expectedFiles) }) test('should return files when providing id, version id, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesSuccessfulResponse) const actual = await sut.getDatasetFiles( testDatasetId, @@ -158,16 +150,15 @@ describe('FilesRepository', () => { testFileCriteria ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional ) - assert.match(actual, expectedFiles) + expect(actual).toStrictEqual(expectedFiles) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut @@ -179,8 +170,8 @@ describe('FilesRepository', () => { ) .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - expect(error).to.be.instanceOf(Error) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(Error) }) }) @@ -188,7 +179,7 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/files?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return files when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFiles( @@ -198,8 +189,8 @@ describe('FilesRepository', () => { testFileOrderCriteria ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, expectedFiles) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(expectedFiles) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -211,16 +202,15 @@ describe('FilesRepository', () => { testFileOrderCriteria ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, expectedFiles) + expect(actual).toStrictEqual(expectedFiles) }) test('should return files when providing persistent id, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFilesSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesSuccessfulResponse) const actual = await sut.getDatasetFiles( TestConstants.TEST_DUMMY_PERSISTENT_ID, @@ -232,16 +222,15 @@ describe('FilesRepository', () => { testFileCriteria ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional ) - assert.match(actual, expectedFiles) + expect(actual).toStrictEqual(expectedFiles) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut @@ -253,8 +242,8 @@ describe('FilesRepository', () => { ) .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - expect(error).to.be.instanceOf(Error) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -297,7 +286,7 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetId}/versions/${testDatasetVersionId}/files/counts` test('should return file counts when providing id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileCountsSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFileCounts( @@ -306,8 +295,8 @@ describe('FilesRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, expectedCount) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(expectedCount) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -318,16 +307,15 @@ describe('FilesRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, expectedCount) + expect(actual).toStrictEqual(expectedCount) }) test('should return file counts when providing id, version id, optional params, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileCountsSuccessfulResponse) const actual = await sut.getDatasetFileCounts( testDatasetId, @@ -336,24 +324,23 @@ describe('FilesRepository', () => { testFileCriteria ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional ) - assert.match(actual, expectedCount) + expect(actual).toStrictEqual(expectedCount) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getDatasetFileCounts(testDatasetId, testDatasetVersionId, testIncludeDeaccessioned) .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - expect(error).to.be.instanceOf(Error) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(Error) }) }) @@ -361,7 +348,7 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/files/counts?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return files when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileCountsSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileCountsSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFileCounts( @@ -370,8 +357,8 @@ describe('FilesRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, expectedCount) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(expectedCount) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -382,16 +369,15 @@ describe('FilesRepository', () => { testIncludeDeaccessioned ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, expectedCount) + expect(actual).toStrictEqual(expectedCount) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut @@ -402,8 +388,8 @@ describe('FilesRepository', () => { ) .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - expect(error).to.be.instanceOf(Error) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -449,9 +435,7 @@ describe('FilesRepository', () => { describe('by numeric id and version id', () => { test('should return files total download size when providing id, version id, mode, and response is successful', async () => { - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testFilesTotalDownloadSizeSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesTotalDownloadSizeSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFilesTotalDownloadSize( @@ -461,8 +445,8 @@ describe('FilesRepository', () => { testFileDownloadSizeMode ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, expectedSize) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(expectedSize) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -474,18 +458,15 @@ describe('FilesRepository', () => { testFileDownloadSizeMode ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, expectedSize) + expect(actual).toStrictEqual(expectedSize) }) test('should return files total download size when providing id, version id, mode, optional params, and response is successful', async () => { - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testFilesTotalDownloadSizeSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesTotalDownloadSizeSuccessfulResponse) const actual = await sut.getDatasetFilesTotalDownloadSize( testDatasetId, @@ -495,16 +476,15 @@ describe('FilesRepository', () => { testFileCriteria ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional ) - assert.match(actual, expectedSize) + expect(actual).toStrictEqual(expectedSize) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut @@ -516,8 +496,8 @@ describe('FilesRepository', () => { ) .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - expect(error).to.be.instanceOf(Error) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(Error) }) }) @@ -525,9 +505,7 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testDatasetVersionId}/downloadsize?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return files total download size when providing persistent id, version id, and response is successful', async () => { - const axiosGetStub = sandbox - .stub(axios, 'get') - .resolves(testFilesTotalDownloadSizeSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFilesTotalDownloadSizeSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFilesTotalDownloadSize( @@ -537,8 +515,8 @@ describe('FilesRepository', () => { testFileDownloadSizeMode ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - assert.match(actual, expectedSize) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(expectedSize) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -550,16 +528,15 @@ describe('FilesRepository', () => { testFileDownloadSizeMode ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, expectedRequestConfigSessionCookie ) - assert.match(actual, expectedSize) + expect(actual).toStrictEqual(expectedSize) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut @@ -571,8 +548,8 @@ describe('FilesRepository', () => { ) .catch((e) => (error = e)) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey) - expect(error).to.be.instanceOf(Error) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -592,43 +569,40 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/downloadCount` test('should return count when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileDownloadCountResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileDownloadCountResponse) // API Key auth let actual = await sut.getFileDownloadCount(testFile.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testCount) + expect(actual).toStrictEqual(testCount) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFileDownloadCount(testFile.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testCount) + expect(actual).toStrictEqual(testCount) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getFileDownloadCount(testFile.id).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -636,45 +610,42 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/downloadCount?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return count when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileDownloadCountResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileDownloadCountResponse) // API Key auth let actual = await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testCount) + expect(actual).toStrictEqual(testCount) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testCount) + expect(actual).toStrictEqual(testCount) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -692,43 +663,40 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/access/datafile/${testFile.id}/userPermissions` test('should return file user permissions when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileUserPermissionsResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileUserPermissionsResponse) // API Key auth let actual = await sut.getFileUserPermissions(testFile.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testFileUserPermissions) + expect(actual).toStrictEqual(testFileUserPermissions) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFileUserPermissions(testFile.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testFileUserPermissions) + expect(actual).toStrictEqual(testFileUserPermissions) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getFileUserPermissions(testFile.id).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -736,44 +704,41 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/access/datafile/:persistentId/userPermissions?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return file user permissions when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testFileUserPermissionsResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testFileUserPermissionsResponse) // API Key auth let actual = await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, testFileUserPermissions) + expect(actual).toStrictEqual(testFileUserPermissions) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, testFileUserPermissions) + expect(actual).toStrictEqual(testFileUserPermissions) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -791,43 +756,40 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/dataTables` test('should return data tables when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileDataTablesResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testGetFileDataTablesResponse) // API Key auth let actual = await sut.getFileDataTables(testFile.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, expectedDataTables) + expect(actual).toStrictEqual(expectedDataTables) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFileDataTables(testFile.id) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, expectedDataTables) + expect(actual).toStrictEqual(expectedDataTables) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getFileDataTables(testFile.id).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -835,45 +797,42 @@ describe('FilesRepository', () => { const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/dataTables?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` test('should return data tables when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileDataTablesResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testGetFileDataTablesResponse) // API Key auth let actual = await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, expectedDataTables) + expect(actual).toStrictEqual(expectedDataTables) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, expectedDataTables) + expect(actual).toStrictEqual(expectedDataTables) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) @@ -887,43 +846,40 @@ describe('FilesRepository', () => { } } test('should return file when providing id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testGetFileResponse) // API Key auth let actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, createFileModel()) + expect(actual).toStrictEqual(createFileModel()) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, createFileModel()) + expect(actual).toStrictEqual(createFileModel()) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) describe('by persistent id', () => { @@ -935,7 +891,7 @@ describe('FilesRepository', () => { } } test('should return file when providing persistent id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testGetFileResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testGetFileResponse) // API Key auth let actual = await sut.getFile( @@ -943,12 +899,11 @@ describe('FilesRepository', () => { DatasetNotNumberedVersion.LATEST ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - assert.match(actual, createFileModel()) + expect(actual).toStrictEqual(createFileModel()) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) @@ -958,28 +913,26 @@ describe('FilesRepository', () => { DatasetNotNumberedVersion.LATEST ) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - assert.match(actual, createFileModel()) + expect(actual).toStrictEqual(createFileModel()) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut .getFile(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST) .catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) diff --git a/test/unit/files/GetDatasetFileCounts.test.ts b/test/unit/files/GetDatasetFileCounts.test.ts index 34cb6305..56308301 100644 --- a/test/unit/files/GetDatasetFileCounts.test.ts +++ b/test/unit/files/GetDatasetFileCounts.test.ts @@ -1,30 +1,22 @@ import { GetDatasetFileCounts } from '../../../src/files/domain/useCases/GetDatasetFileCounts' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { DatasetNotNumberedVersion } from '../../../src/datasets' import { FileCounts } from '../../../src/files/domain/models/FileCounts' import { createFileCountsModel } from '../../testHelpers/files/fileCountsHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return file counts on repository success', async () => { const testFileCounts: FileCounts = createFileCountsModel() - const filesRepositoryStub = {} - const getDatasetFileCountsStub = sandbox.stub().returns(testFileCounts) - filesRepositoryStub.getDatasetFileCounts = getDatasetFileCountsStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFileCounts = jest.fn().mockResolvedValue(testFileCounts) + const sut = new GetDatasetFileCounts(filesRepositoryStub) const actual = await sut.execute(1) - assert.match(actual, testFileCounts) - assert.calledWithExactly( - getDatasetFileCountsStub, + expect(actual).toEqual(testFileCounts) + expect(filesRepositoryStub.getDatasetFileCounts).toHaveBeenCalledWith( 1, DatasetNotNumberedVersion.LATEST, false, @@ -33,14 +25,11 @@ describe('execute', () => { }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} - const testReadError = new ReadError() - filesRepositoryStub.getDatasetFileCounts = sandbox.stub().throwsException(testReadError) - const sut = new GetDatasetFileCounts(filesRepositoryStub) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFileCounts = jest.fn().mockRejectedValue(new ReadError()) - let actualError: ReadError = undefined - await sut.execute(1).catch((e: ReadError) => (actualError = e)) + const sut = new GetDatasetFileCounts(filesRepositoryStub) - assert.match(actualError, testReadError) + await expect(sut.execute(1)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/files/GetDatasetFiles.test.ts b/test/unit/files/GetDatasetFiles.test.ts index 14fc9f6c..dd4712ae 100644 --- a/test/unit/files/GetDatasetFiles.test.ts +++ b/test/unit/files/GetDatasetFiles.test.ts @@ -1,6 +1,5 @@ import { GetDatasetFiles } from '../../../src/files/domain/useCases/GetDatasetFiles' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { File } from '../../../src/files/domain/models/File' import { createFileModel } from '../../testHelpers/files/filesHelper' @@ -8,24 +7,17 @@ import { DatasetNotNumberedVersion } from '../../../src/datasets' import { FileOrderCriteria } from '../../../src/files/domain/models/FileCriteria' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return files on repository success', async () => { const testFiles: File[] = [createFileModel()] - const filesRepositoryStub = {} - const getDatasetFilesStub = sandbox.stub().returns(testFiles) - filesRepositoryStub.getDatasetFiles = getDatasetFilesStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFiles = jest.fn().mockResolvedValue(testFiles) + const sut = new GetDatasetFiles(filesRepositoryStub) const actual = await sut.execute(1) - assert.match(actual, testFiles) - assert.calledWithExactly( - getDatasetFilesStub, + expect(actual).toEqual(testFiles) + expect(filesRepositoryStub.getDatasetFiles).toHaveBeenCalledWith( 1, DatasetNotNumberedVersion.LATEST, false, @@ -37,14 +29,11 @@ describe('execute', () => { }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} - const testReadError = new ReadError() - filesRepositoryStub.getDatasetFiles = sandbox.stub().throwsException(testReadError) - const sut = new GetDatasetFiles(filesRepositoryStub) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFiles = jest.fn().mockRejectedValue(new ReadError()) - let actualError: ReadError = undefined - await sut.execute(1).catch((e: ReadError) => (actualError = e)) + const sut = new GetDatasetFiles(filesRepositoryStub) - assert.match(actualError, testReadError) + await expect(sut.execute(1)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts b/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts index 7e799ae9..f057cff8 100644 --- a/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts +++ b/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts @@ -1,4 +1,3 @@ -import { assert, createSandbox, SinonSandbox } from 'sinon' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' import { DatasetNotNumberedVersion, @@ -10,25 +9,20 @@ import { import { GetDatasetFilesTotalDownloadSize } from '../../../src/files/domain/useCases/GetDatasetFilesTotalDownloadSize' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - const testDatasetTotalDownloadSize = 123456789 - afterEach(() => { - sandbox.restore() - }) - test('should return dataset files total download size of the latest version given a dataset id', async () => { - const filesRepositoryStub = {} - const getDatasetTotalDownloadSizeStub = sandbox.stub().returns(testDatasetTotalDownloadSize) - filesRepositoryStub.getDatasetFilesTotalDownloadSize = getDatasetTotalDownloadSizeStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFilesTotalDownloadSize = jest + .fn() + .mockResolvedValue(testDatasetTotalDownloadSize) + const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) const actual = await sut.execute(1) - assert.match(actual, testDatasetTotalDownloadSize) - assert.calledWithExactly( - getDatasetTotalDownloadSizeStub, + expect(actual).toEqual(testDatasetTotalDownloadSize) + expect(filesRepositoryStub.getDatasetFilesTotalDownloadSize).toHaveBeenCalledWith( 1, DatasetNotNumberedVersion.LATEST, false, @@ -38,9 +32,10 @@ describe('execute', () => { }) test('should return dataset files total download size given a dataset id, version, file download size mode and search criteria', async () => { - const filesRepositoryStub = {} - const getDatasetTotalDownloadSizeStub = sandbox.stub().returns(testDatasetTotalDownloadSize) - filesRepositoryStub.getDatasetFilesTotalDownloadSize = getDatasetTotalDownloadSizeStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFilesTotalDownloadSize = jest + .fn() + .mockResolvedValue(testDatasetTotalDownloadSize) const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) const testVersionId = '1.0' @@ -57,9 +52,8 @@ describe('execute', () => { testFileSearchCriteria ) - assert.match(actual, testDatasetTotalDownloadSize) - assert.calledWithExactly( - getDatasetTotalDownloadSizeStub, + expect(actual).toEqual(testDatasetTotalDownloadSize) + expect(filesRepositoryStub.getDatasetFilesTotalDownloadSize).toHaveBeenCalledWith( 1, testVersionId, false, @@ -69,16 +63,12 @@ describe('execute', () => { }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} - const testReadError = new ReadError() - filesRepositoryStub.getDatasetFilesTotalDownloadSize = sandbox - .stub() - .throwsException(testReadError) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFilesTotalDownloadSize = jest + .fn() + .mockRejectedValue(new ReadError()) const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(1).catch((e: ReadError) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(1)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/files/GetFile.test.ts b/test/unit/files/GetFile.test.ts index 28ea574c..56dfcdfb 100644 --- a/test/unit/files/GetFile.test.ts +++ b/test/unit/files/GetFile.test.ts @@ -1,41 +1,32 @@ -import { assert, createSandbox, SinonSandbox } from 'sinon' import { createFileModel } from '../../testHelpers/files/filesHelper' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' import { GetFile } from '../../../src/files/domain/useCases/GetFile' import { DatasetNotNumberedVersion, ReadError } from '../../../src' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return file on repository success when passing numeric id', async () => { const testFile = createFileModel() - const filesRepositoryStub = {} - const getFileStub = sandbox.stub().returns(testFile) - filesRepositoryStub.getFile = getFileStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testFile) const sut = new GetFile(filesRepositoryStub) const actual = await sut.execute(1) - assert.match(actual, testFile) - assert.calledWithExactly(getFileStub, 1, DatasetNotNumberedVersion.LATEST) + expect(actual).toEqual(testFile) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith(1, DatasetNotNumberedVersion.LATEST) }) test('should return file on repository success when passing string id', async () => { const testFile = createFileModel() - const filesRepositoryStub = {} - const getFileStub = sandbox.stub().returns(testFile) - filesRepositoryStub.getFile = getFileStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testFile) + const sut = new GetFile(filesRepositoryStub) const actual = await sut.execute('doi:10.5072/FK2/J8SJZB') - assert.match(actual, testFile) - assert.calledWithExactly( - getFileStub, + expect(actual).toEqual(testFile) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith( 'doi:10.5072/FK2/J8SJZB', DatasetNotNumberedVersion.LATEST ) @@ -43,26 +34,22 @@ describe('execute', () => { test('should return file on repository success when passing string id and version id', async () => { const testFile = createFileModel() - const filesRepositoryStub = {} - const getFileStub = sandbox.stub().returns(testFile) - filesRepositoryStub.getFile = getFileStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testFile) + const sut = new GetFile(filesRepositoryStub) const actual = await sut.execute('doi:10.5072/FK2/J8SJZB', '2.0') - assert.match(actual, testFile) - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', '2.0') + expect(actual).toEqual(testFile) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith('doi:10.5072/FK2/J8SJZB', '2.0') }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} - const testReadError = new ReadError() - filesRepositoryStub.getFile = sandbox.stub().throwsException(testReadError) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetFile(filesRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(1).catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(1)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/files/GetFileDataTables.test.ts b/test/unit/files/GetFileDataTables.test.ts index 9957f01d..206817e9 100644 --- a/test/unit/files/GetFileDataTables.test.ts +++ b/test/unit/files/GetFileDataTables.test.ts @@ -1,40 +1,33 @@ import { GetFileDataTables } from '../../../src/files/domain/useCases/GetFileDataTables' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { FileDataTable } from '../../../src/files/domain/models/FileDataTable' import { createFileDataTableModel } from '../../testHelpers/files/fileDataTablesHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testFileId = 1 - afterEach(() => { - sandbox.restore() - }) - test('should return file data tables on repository success', async () => { const testDataTables: FileDataTable[] = [createFileDataTableModel()] - const filesRepositoryStub = {} - const getFileDataTablesStub = sandbox.stub().returns(testDataTables) - filesRepositoryStub.getFileDataTables = getFileDataTablesStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDataTables = jest.fn().mockResolvedValue(testDataTables) const sut = new GetFileDataTables(filesRepositoryStub) const actual = await sut.execute(testFileId) - assert.match(actual, testDataTables) - assert.calledWithExactly(getFileDataTablesStub, testFileId) + expect(actual).toBe(testDataTables) + expect(filesRepositoryStub.getFileDataTables).toHaveBeenCalledWith(testFileId) }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} const testReadError = new ReadError() - filesRepositoryStub.getFileDataTables = sandbox.stub().throwsException(testReadError) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDataTables = jest.fn().mockRejectedValue(testReadError) const sut = new GetFileDataTables(filesRepositoryStub) let actualError: ReadError = undefined await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)) - assert.match(actualError, testReadError) + expect(actualError).toBe(testReadError) }) }) diff --git a/test/unit/files/GetFileDownloadCount.test.ts b/test/unit/files/GetFileDownloadCount.test.ts index d74323e4..fd54d383 100644 --- a/test/unit/files/GetFileDownloadCount.test.ts +++ b/test/unit/files/GetFileDownloadCount.test.ts @@ -1,54 +1,41 @@ import { GetFileDownloadCount } from '../../../src/files/domain/useCases/GetFileDownloadCount' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { TestConstants } from '../../testHelpers/TestConstants' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testFileId = 1 const testCount = 10 - afterEach(() => { - sandbox.restore() - }) - test('should return count on repository success filtering by id', async () => { - const filesRepositoryStub = {} - const getFileGuestbookResponsesCountStub = sandbox.stub().returns(testCount) - filesRepositoryStub.getFileDownloadCount = getFileGuestbookResponsesCountStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDownloadCount = jest.fn().mockResolvedValue(testCount) const sut = new GetFileDownloadCount(filesRepositoryStub) const actual = await sut.execute(testFileId) - assert.match(actual, testCount) - assert.calledWithExactly(getFileGuestbookResponsesCountStub, testFileId) + expect(actual).toBe(testCount) + expect(filesRepositoryStub.getFileDownloadCount).toHaveBeenCalledWith(testFileId) }) test('should return count on repository success filtering by persistent id', async () => { - const filesRepositoryStub = {} - const getFileGuestbookResponsesCountStub = sandbox.stub().returns(testCount) - filesRepositoryStub.getFileDownloadCount = getFileGuestbookResponsesCountStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDownloadCount = jest.fn().mockResolvedValue(testCount) const sut = new GetFileDownloadCount(filesRepositoryStub) const actual = await sut.execute(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.match(actual, testCount) - assert.calledWithExactly( - getFileGuestbookResponsesCountStub, + expect(actual).toBe(testCount) + expect(filesRepositoryStub.getFileDownloadCount).toHaveBeenCalledWith( TestConstants.TEST_DUMMY_PERSISTENT_ID ) }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} - const testReadError = new ReadError() - filesRepositoryStub.getFileDownloadCount = sandbox.stub().throwsException(testReadError) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDownloadCount = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetFileDownloadCount(filesRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testFileId).catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testFileId)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/files/GetFileUserPermissions.test.ts b/test/unit/files/GetFileUserPermissions.test.ts index b158dd1c..d37c6ca6 100644 --- a/test/unit/files/GetFileUserPermissions.test.ts +++ b/test/unit/files/GetFileUserPermissions.test.ts @@ -1,39 +1,31 @@ import { GetFileUserPermissions } from '../../../src/files/domain/useCases/GetFileUserPermissions' import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { createFileUserPermissionsModel } from '../../testHelpers/files/fileUserPermissionsHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testFileId = 1 - afterEach(() => { - sandbox.restore() - }) - test('should return file user permissions on repository success', async () => { const testFileUserPermissions = createFileUserPermissionsModel() - const filesRepositoryStub = {} - const getFileUserPermissionsStub = sandbox.stub().returns(testFileUserPermissions) - filesRepositoryStub.getFileUserPermissions = getFileUserPermissionsStub + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileUserPermissions = jest + .fn() + .mockResolvedValue(testFileUserPermissions) + const sut = new GetFileUserPermissions(filesRepositoryStub) const actual = await sut.execute(testFileId) - assert.match(actual, testFileUserPermissions) - assert.calledWithExactly(getFileUserPermissionsStub, testFileId) + expect(actual).toEqual(testFileUserPermissions) + expect(filesRepositoryStub.getFileUserPermissions).toHaveBeenCalledWith(testFileId) }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {} - const testReadError = new ReadError() - filesRepositoryStub.getFileUserPermissions = sandbox.stub().throwsException(testReadError) + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileUserPermissions = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetFileUserPermissions(filesRepositoryStub) - let actualError: ReadError = undefined - await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute(testFileId)).rejects.toThrow(ReadError) }) }) diff --git a/test/unit/info/DataverseInfoRepository.test.ts b/test/unit/info/DataverseInfoRepository.test.ts index 2bd34c94..3ab062f5 100644 --- a/test/unit/info/DataverseInfoRepository.test.ts +++ b/test/unit/info/DataverseInfoRepository.test.ts @@ -1,19 +1,13 @@ -import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import axios from 'axios' -import { expect } from 'chai' -import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { - ApiConfig, - DataverseApiAuthMechanism -} from '../../../src/core/infra/repositories/ApiConfig' +import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository' +import { ApiConfig, ReadError } from '../../../src' import { TestConstants } from '../../testHelpers/TestConstants' +import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' +let sut: DataverseInfoRepository describe('DataverseInfoRepository', () => { - const sandbox: SinonSandbox = createSandbox() - const sut: DataverseInfoRepository = new DataverseInfoRepository() - beforeEach(() => { + sut = new DataverseInfoRepository() ApiConfig.init( TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, @@ -21,10 +15,6 @@ describe('DataverseInfoRepository', () => { ) }) - afterEach(() => { - sandbox.restore() - }) - describe('getDataverseVersion', () => { test('should return Dataverse version on successful response', async () => { const testVersionNumber = '5.13' @@ -38,31 +28,29 @@ describe('DataverseInfoRepository', () => { } } } - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) const actual = await sut.getDataverseVersion() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/info/version`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual.number, testVersionNumber) - assert.match(actual.build, testVersionBuild) + expect(actual.number).toMatch(testVersionNumber) + expect(actual.build).toMatch(testVersionBuild) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined await sut.getDataverseVersion().catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/info/version`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -75,30 +63,28 @@ describe('DataverseInfoRepository', () => { data: testZipDownloadLimit.toString() } } - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) const actual = await sut.getZipDownloadLimit() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/info/zipDownloadLimit`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual, testZipDownloadLimit) + expect(actual).toBe(testZipDownloadLimit) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined await sut.getZipDownloadLimit().catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/info/zipDownloadLimit`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) @@ -113,30 +99,28 @@ describe('DataverseInfoRepository', () => { } } } - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) const actual = await sut.getMaxEmbargoDurationInMonths() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/info/settings/:MaxEmbargoDurationInMonths`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual, testDuration) + expect(actual).toBe(testDuration) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/info/settings/:MaxEmbargoDurationInMonths`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) }) diff --git a/test/unit/info/GetDataverseVersion.test.ts b/test/unit/info/GetDataverseVersion.test.ts index a054b307..929752df 100644 --- a/test/unit/info/GetDataverseVersion.test.ts +++ b/test/unit/info/GetDataverseVersion.test.ts @@ -1,35 +1,30 @@ import { GetDataverseVersion } from '../../../src/info/domain/useCases/GetDataverseVersion' import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return successful result with version on repository success', async () => { const testDataverseVersion = '5.13' - const dataverseInfoRepositoryStub = {} - dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().returns(testDataverseVersion) + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getDataverseVersion = jest + .fn() + .mockResolvedValue(testDataverseVersion) const sut = new GetDataverseVersion(dataverseInfoRepositoryStub) const actual = await sut.execute() - assert.match(actual, testDataverseVersion) + expect(actual).toBe(testDataverseVersion) }) test('should return error result on repository error', async () => { - const dataverseInfoRepositoryStub = {} + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository const testReadError = new ReadError() - dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().throwsException(testReadError) + dataverseInfoRepositoryStub.getDataverseVersion = jest.fn().mockRejectedValue(testReadError) const sut = new GetDataverseVersion(dataverseInfoRepositoryStub) let actualError: ReadError = undefined await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testReadError) + expect(actualError).toBe(testReadError) }) }) diff --git a/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts b/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts index eb896e56..fa710982 100644 --- a/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts +++ b/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts @@ -1,37 +1,29 @@ import { GetMaxEmbargoDurationInMonths } from '../../../src/info/domain/useCases/GetMaxEmbargoDurationInMonths' import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return duration on repository success', async () => { const testDuration = 12 - const dataverseInfoRepositoryStub = {} - dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = sandbox.stub().returns(testDuration) + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = jest + .fn() + .mockResolvedValue(testDuration) + const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub) const actual = await sut.execute() - assert.match(actual, testDuration) + expect(actual).toBe(testDuration) }) test('should return error result on repository error', async () => { - const dataverseInfoRepositoryStub = {} - const testReadError = new ReadError() - dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = sandbox - .stub() - .throwsException(testReadError) + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = jest + .fn() + .mockRejectedValue(new ReadError()) const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub) - let actualError: ReadError = undefined - await sut.execute().catch((e) => (actualError = e)) - - assert.match(actualError, testReadError) + await expect(sut.execute()).rejects.toBeInstanceOf(ReadError) }) }) diff --git a/test/unit/info/GetZipDownloadLimit.test.ts b/test/unit/info/GetZipDownloadLimit.test.ts index d503a681..4e475367 100644 --- a/test/unit/info/GetZipDownloadLimit.test.ts +++ b/test/unit/info/GetZipDownloadLimit.test.ts @@ -1,35 +1,30 @@ import { GetZipDownloadLimit } from '../../../src/info/domain/useCases/GetZipDownloadLimit' import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return successful result on repository success', async () => { const testZipDownloadLimit = 100 - const dataverseInfoRepositoryStub = {} - dataverseInfoRepositoryStub.getZipDownloadLimit = sandbox.stub().returns(testZipDownloadLimit) + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getZipDownloadLimit = jest + .fn() + .mockResolvedValue(testZipDownloadLimit) + const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) const actual = await sut.execute() - assert.match(actual, testZipDownloadLimit) + expect(actual).toEqual(testZipDownloadLimit) }) test('should return error result on repository error', async () => { - const dataverseInfoRepositoryStub = {} - const testReadError = new ReadError() - dataverseInfoRepositoryStub.getZipDownloadLimit = sandbox.stub().throwsException(testReadError) + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getZipDownloadLimit = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) - let actualError: ReadError = undefined + let actualError: ReadError await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testReadError) + expect(actualError).toBeInstanceOf(ReadError) }) }) diff --git a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts index 7c7d00e0..76ec3711 100644 --- a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts +++ b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts @@ -1,41 +1,35 @@ import { GetMetadataBlockByName } from '../../../src/metadataBlocks/domain/useCases/GetMetadataBlockByName' import { IMetadataBlocksRepository } from '../../../src/metadataBlocks/domain/repositories/IMetadataBlocksRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { createMetadataBlockModel } from '../../testHelpers/metadataBlocks/metadataBlockHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testMetadataBlockName = 'test' - afterEach(() => { - sandbox.restore() - }) - test('should return metadata block on repository success', async () => { const testMetadataBlock = createMetadataBlockModel() - const metadataBlocksRepositoryStub = {} - const getMetadataBlockByNameStub = sandbox.stub().returns(testMetadataBlock) - metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub + const metadataBlocksRepositoryStub: IMetadataBlocksRepository = { + getMetadataBlockByName: jest.fn().mockReturnValue(testMetadataBlock) + } const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub) const actual = await sut.execute(testMetadataBlockName) - assert.match(actual, testMetadataBlock) - assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlockName) + expect(actual).toMatchObject(testMetadataBlock) + expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith( + testMetadataBlockName + ) }) test('should return error result on repository error', async () => { - const metadataBlocksRepositoryStub = {} - const testReadError = new ReadError() - metadataBlocksRepositoryStub.getMetadataBlockByName = sandbox - .stub() - .throwsException(testReadError) + const metadataBlocksRepositoryStub: IMetadataBlocksRepository = { + getMetadataBlockByName: jest.fn().mockRejectedValue(new ReadError()) + } const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub) - let actualError: ReadError = undefined + let actualError: ReadError await sut.execute(testMetadataBlockName).catch((e) => (actualError = e)) - assert.match(actualError, testReadError) + expect(actualError).toBeInstanceOf(ReadError) }) }) diff --git a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts index b7a87eee..339c34d1 100644 --- a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts @@ -1,7 +1,4 @@ import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' -import axios from 'axios' -import { expect } from 'chai' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { ApiConfig, @@ -12,9 +9,9 @@ import { createMetadataBlockPayload } from '../../testHelpers/metadataBlocks/metadataBlockHelper' import { TestConstants } from '../../testHelpers/TestConstants' +import axios from 'axios' describe('getMetadataBlockByName', () => { - const sandbox: SinonSandbox = createSandbox() const sut: MetadataBlocksRepository = new MetadataBlocksRepository() const testMetadataBlockName = 'test' @@ -26,10 +23,6 @@ describe('getMetadataBlockByName', () => { ) }) - afterEach(() => { - sandbox.restore() - }) - test('should return metadata block on successful response', async () => { const testSuccessfulResponse = { data: { @@ -37,16 +30,15 @@ describe('getMetadataBlockByName', () => { data: createMetadataBlockPayload() } } - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) const actual = await sut.getMetadataBlockByName(testMetadataBlockName) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/metadatablocks/${testMetadataBlockName}`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - assert.match(actual, createMetadataBlockModel()) + expect(actual).toMatchObject(createMetadataBlockModel()) }) test('should return error result on error response', async () => { @@ -56,16 +48,15 @@ describe('getMetadataBlockByName', () => { message: 'test' } } - const axiosGetStub = sandbox.stub(axios, 'get').rejects(testErrorResponse) + jest.spyOn(axios, 'get').mockRejectedValue(testErrorResponse) let error: ReadError = undefined await sut.getMetadataBlockByName(testMetadataBlockName).catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/metadatablocks/${testMetadataBlockName}`, TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) diff --git a/test/unit/users/GetCurrentAuthenticatedUser.test.ts b/test/unit/users/GetCurrentAuthenticatedUser.test.ts index f6b1142c..e0f94616 100644 --- a/test/unit/users/GetCurrentAuthenticatedUser.test.ts +++ b/test/unit/users/GetCurrentAuthenticatedUser.test.ts @@ -1,36 +1,30 @@ import { GetCurrentAuthenticatedUser } from '../../../src/users/domain/useCases/GetCurrentAuthenticatedUser' import { IUsersRepository } from '../../../src/users/domain/repositories/IUsersRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert, createSandbox, SinonSandbox } from 'sinon' import { createAuthenticatedUser } from '../../testHelpers/users/authenticatedUserHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return successful result with authenticated user on repository success', async () => { const testAuthenticatedUser = createAuthenticatedUser() - const usersRepositoryStub = {} - usersRepositoryStub.getCurrentAuthenticatedUser = sandbox.stub().returns(testAuthenticatedUser) + const usersRepositoryStub: IUsersRepository = { + getCurrentAuthenticatedUser: jest.fn().mockReturnValue(testAuthenticatedUser) + } const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub) const actual = await sut.execute() - assert.match(actual, testAuthenticatedUser) + expect(actual).toEqual(testAuthenticatedUser) }) test('should return error result on repository error', async () => { - const usersRepositoryStub = {} - const testReadError = new ReadError() - usersRepositoryStub.getCurrentAuthenticatedUser = sandbox.stub().throwsException(testReadError) + const usersRepositoryStub: IUsersRepository = { + getCurrentAuthenticatedUser: jest.fn().mockRejectedValue(new ReadError()) + } const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub) let actualError: ReadError = undefined await sut.execute().catch((e) => (actualError = e)) - assert.match(actualError, testReadError) + expect(actualError).toBeInstanceOf(ReadError) }) }) diff --git a/test/unit/users/UsersRepository.test.ts b/test/unit/users/UsersRepository.test.ts index 0ec58fa4..7cabe4ff 100644 --- a/test/unit/users/UsersRepository.test.ts +++ b/test/unit/users/UsersRepository.test.ts @@ -1,17 +1,14 @@ import { UsersRepository } from '../../../src/users/infra/repositories/UsersRepository' -import { assert, createSandbox, SinonSandbox } from 'sinon' import axios from 'axios' -import { expect } from 'chai' -import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { createAuthenticatedUser } from '../../testHelpers/users/authenticatedUserHelper' import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' import { TestConstants } from '../../testHelpers/TestConstants' +import { ReadError } from '../../../src' describe('getCurrentAuthenticatedUser', () => { - const sandbox: SinonSandbox = createSandbox() const sut: UsersRepository = new UsersRepository() beforeEach(() => { @@ -22,10 +19,6 @@ describe('getCurrentAuthenticatedUser', () => { ) }) - afterEach(() => { - sandbox.restore() - }) - test('should return authenticated user on successful response', async () => { const testAuthenticatedUser = createAuthenticatedUser() const testSuccessfulResponse = { @@ -48,44 +41,39 @@ describe('getCurrentAuthenticatedUser', () => { } } } - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testSuccessfulResponse) + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/users/:me` // API Key auth let actual = await sut.getCurrentAuthenticatedUser() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - - assert.match(actual, testAuthenticatedUser) + expect(actual).toMatchObject(testAuthenticatedUser) // Session cookie auth ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) actual = await sut.getCurrentAuthenticatedUser() - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE ) - - assert.match(actual, testAuthenticatedUser) + expect(actual).toMatchObject(testAuthenticatedUser) }) test('should return error result on error response', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE) + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) let error: ReadError = undefined await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/users/:me`, TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY ) - expect(error).to.be.instanceOf(Error) + expect(error).toBeInstanceOf(Error) }) }) From 2b54a34b29599eb111ce72cc420e596ef3a26914 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 13:55:57 +0100 Subject: [PATCH 05/11] feat(formatting): replace chai and sinon by jest in all integration tests --- .../infra/repositories/FilesRepository.ts | 3 +- test/integration/auth/AuthRepository.test.ts | 11 +- .../datasets/DatasetsRepository.test.ts | 136 +++++----- .../integration/files/FilesRepository.test.ts | 250 ++++++++---------- .../info/DataverseInfoRepository.test.ts | 20 +- .../MetadataBlocksRepository.test.ts | 13 +- .../integration/users/UsersRepository.test.ts | 15 +- 7 files changed, 189 insertions(+), 259 deletions(-) diff --git a/src/files/infra/repositories/FilesRepository.ts b/src/files/infra/repositories/FilesRepository.ts index 17f471a7..708dc124 100644 --- a/src/files/infra/repositories/FilesRepository.ts +++ b/src/files/infra/repositories/FilesRepository.ts @@ -15,6 +15,7 @@ import { FileCounts } from '../../domain/models/FileCounts' import { transformFileCountsResponseToFileCounts } from './transformers/fileCountsTransformers' import { FileDownloadSizeMode } from '../../domain/models/FileDownloadSizeMode' import { DatasetNotNumberedVersion } from '../../../datasets' +import { ReadError } from '../../../core' export interface GetFilesQueryParams { includeDeaccessioned: boolean @@ -179,7 +180,7 @@ export class FilesRepository extends ApiRepository implements IFilesRepository { return this.buildApiEndpoint(this.filesResourceName, '', fileId) } // TODO: Implement once it is supported by the API https://github.com/IQSS/dataverse/issues/10280 - throw new Error( + throw new ReadError( `Requesting a file by its dataset version is not yet supported. Requested version: ${datasetVersionId}. Please try using the :latest or :draft version instead.` ) } diff --git a/test/integration/auth/AuthRepository.test.ts b/test/integration/auth/AuthRepository.test.ts index 8cdaf663..99fb7568 100644 --- a/test/integration/auth/AuthRepository.test.ts +++ b/test/integration/auth/AuthRepository.test.ts @@ -1,5 +1,4 @@ import { AuthRepository } from '../../../src/auth/infra/repositories/AuthRepository' -import { assert } from 'sinon' import { WriteError } from '../../../src/core/domain/repositories/WriteError' import { ApiConfig, @@ -17,12 +16,10 @@ describe('logout', () => { ) test('should return error due to disabled feature flag', async () => { - let error: WriteError = undefined - await sut.logout().catch((e) => (error = e)) - - assert.match( - error.message, - 'There was an error when writing the resource. Reason was: [500] This endpoint is only available when session authentication feature flag is enabled' + const expectedError = new WriteError( + '[500] This endpoint is only available when session authentication feature flag is enabled' ) + + await expect(sut.logout()).rejects.toThrow(expectedError) }) }) diff --git a/test/integration/datasets/DatasetsRepository.test.ts b/test/integration/datasets/DatasetsRepository.test.ts index 1c4689c6..62ea4468 100644 --- a/test/integration/datasets/DatasetsRepository.test.ts +++ b/test/integration/datasets/DatasetsRepository.test.ts @@ -1,5 +1,4 @@ import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository' -import { assert } from 'sinon' import { TestConstants } from '../../testHelpers/TestConstants' import { createPrivateUrlViaApi, @@ -13,7 +12,6 @@ import { DatasetLockType, DatasetPreviewSubset } from '../../../src/datasets' -import { fail } from 'assert' import { ApiConfig } from '../../../src' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' @@ -36,29 +34,29 @@ describe('DatasetsRepository', () => { test('should return all dataset previews when no pagination params are defined', async () => { const actual: DatasetPreviewSubset = await sut.getAllDatasetPreviews() - assert.match(actual.datasetPreviews.length, 2) - assert.match(actual.datasetPreviews[0].title, 'Second Dataset') - assert.match(actual.totalDatasetCount, 2) + expect(actual.datasetPreviews.length).toBe(2) + expect(actual.datasetPreviews[0].title).toBe('Second Dataset') + expect(actual.totalDatasetCount).toBe(2) }) test('should return first dataset preview page', async () => { const actual = await sut.getAllDatasetPreviews(testPageLimit, 0) - assert.match(actual.datasetPreviews.length, 1) - assert.match(actual.datasetPreviews[0].title, 'Second Dataset') - assert.match(actual.totalDatasetCount, 2) + expect(actual.datasetPreviews.length).toBe(1) + expect(actual.datasetPreviews[0].title).toBe('Second Dataset') + expect(actual.totalDatasetCount).toBe(2) }) test('should return second dataset preview page', async () => { const actual = await sut.getAllDatasetPreviews(testPageLimit, 1) - assert.match(actual.datasetPreviews.length, 1) - assert.match(actual.datasetPreviews[0].title, 'First Dataset') - assert.match(actual.totalDatasetCount, 2) + expect(actual.datasetPreviews.length).toBe(1) + expect(actual.datasetPreviews[0].title).toBe('First Dataset') + expect(actual.totalDatasetCount).toBe(2) }) test('should return third dataset preview page', async () => { const actual = await sut.getAllDatasetPreviews(testPageLimit, 2) - assert.match(actual.datasetPreviews.length, 0) - assert.match(actual.totalDatasetCount, 2) + expect(actual.datasetPreviews.length).toBe(0) + expect(actual.totalDatasetCount).toBe(2) }) }) @@ -66,7 +64,7 @@ describe('DatasetsRepository', () => { test('should return not empty field list on successful response', async () => { const actual = await sut.getDatasetSummaryFieldNames() - assert.pass(actual.length > 0) + expect(actual.length).toBeGreaterThan(0) }) }) @@ -82,15 +80,13 @@ describe('DatasetsRepository', () => { }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - await sut - .getDataset(nonExistentTestDatasetId, latestVersionId, false) - .catch((e) => (error = e)) - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + const expectedError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` ) + + await expect( + sut.getDataset(nonExistentTestDatasetId, latestVersionId, false) + ).rejects.toThrow(expectedError) }) }) describe('by persistent id', () => { @@ -105,24 +101,20 @@ describe('DatasetsRepository', () => { }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - const testWrongPersistentId = 'wrongPersistentId' - await sut - .getDataset(testWrongPersistentId, latestVersionId, false) - .catch((e) => (error = e)) + const expectedError = new ReadError( + `[404] Dataset with Persistent ID ${testWrongPersistentId} not found.` + ) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.` + await expect(sut.getDataset(testWrongPersistentId, latestVersionId, false)).rejects.toThrow( + expectedError ) }) }) }) describe('Private URLs', () => { - const expectedErrorInvalidToken = - 'There was an error when reading the resource. Reason was: [404] Private URL user not found' + const expectedErrorInvalidToken = '[404] Private URL user not found' let privateUrlToken: string = undefined beforeAll(async () => { @@ -131,7 +123,7 @@ describe('DatasetsRepository', () => { privateUrlToken = response.data.data.token }) .catch(() => { - fail('Tests beforeAll(): Error while creating Dataset private URL') + throw new Error('Tests beforeAll(): Error while creating Dataset private URL') }) }) @@ -143,11 +135,9 @@ describe('DatasetsRepository', () => { }) test('should return error when token is not valid', async () => { - let error: ReadError = undefined - - await sut.getPrivateUrlDataset('invalidToken').catch((e) => (error = e)) + const expectedError = new ReadError(expectedErrorInvalidToken) - assert.match(error.message, expectedErrorInvalidToken) + await expect(sut.getPrivateUrlDataset('invalidToken')).rejects.toThrow(expectedError) }) }) @@ -159,32 +149,31 @@ describe('DatasetsRepository', () => { }) test('should return error when token is not valid', async () => { - let error: ReadError = undefined + const expectedError = new ReadError(expectedErrorInvalidToken) - await sut.getPrivateUrlDataset('invalidToken').catch((e) => (error = e)) - - assert.match(error.message, expectedErrorInvalidToken) + await expect(sut.getPrivateUrlDatasetCitation('invalidToken')).rejects.toThrow( + expectedError + ) }) }) describe('getDatasetUserPermissions', () => { test('should return user permissions filtering by dataset id', async () => { const actual = await sut.getDatasetUserPermissions(TestConstants.TEST_CREATED_DATASET_1_ID) - assert.match(actual.canViewUnpublishedDataset, true) - assert.match(actual.canEditDataset, true) - assert.match(actual.canPublishDataset, true) - assert.match(actual.canManageDatasetPermissions, true) - assert.match(actual.canDeleteDatasetDraft, true) + expect(actual.canViewUnpublishedDataset).toBe(true) + expect(actual.canEditDataset).toBe(true) + expect(actual.canPublishDataset).toBe(true) + expect(actual.canManageDatasetPermissions).toBe(true) + expect(actual.canDeleteDatasetDraft).toBe(true) }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - - await sut.getDatasetUserPermissions(nonExistentTestDatasetId).catch((e) => (error = e)) + const expectedError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + await expect(sut.getDatasetUserPermissions(nonExistentTestDatasetId)).rejects.toThrow( + expectedError ) }) }) @@ -194,27 +183,23 @@ describe('DatasetsRepository', () => { await publishDatasetViaApi(TestConstants.TEST_CREATED_DATASET_2_ID) .then() .catch(() => { - assert.fail('Error while publishing test Dataset') + throw new Error('Error while publishing test Dataset') }) const actual = await sut.getDatasetLocks(TestConstants.TEST_CREATED_DATASET_2_ID) - assert.match(actual.length, 1) - assert.match(actual[0].lockType, DatasetLockType.FINALIZE_PUBLICATION) - assert.match(actual[0].userId, 'dataverseAdmin') - assert.match( - actual[0].message, + expect(actual.length).toBe(1) + expect(actual[0].lockType).toBe(DatasetLockType.FINALIZE_PUBLICATION) + expect(actual[0].userId).toBe('dataverseAdmin') + expect(actual[0].message).toBe( 'Publishing the dataset; Validating Datafiles Asynchronously' ) }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - - await sut.getDatasetLocks(nonExistentTestDatasetId).catch((e) => (error = e)) - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + const expectedError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` ) + + await expect(sut.getDatasetLocks(nonExistentTestDatasetId)).rejects.toThrow(expectedError) }) }) }) @@ -230,29 +215,26 @@ describe('DatasetsRepository', () => { }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - await sut - .getDatasetCitation(nonExistentTestDatasetId, latestVersionId, false) - .catch((e) => (error = e)) - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` + const expectedError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` ) + + await expect( + sut.getDatasetCitation(nonExistentTestDatasetId, latestVersionId, false) + ).rejects.toThrow(expectedError) }) test('should return citation when dataset is deaccessioned', async () => { await waitForNoLocks(TestConstants.TEST_CREATED_DATASET_2_ID, 10) .then() .catch(() => { - assert.fail('Error while waiting for no locks') + throw new Error('Error while waiting for no locks') }) await deaccessionDatasetViaApi(TestConstants.TEST_CREATED_DATASET_2_ID, '1.0') .then() - .catch((error) => { - console.log(JSON.stringify(error)) - assert.fail('Error while deaccessioning test Dataset') + .catch(() => { + throw new Error('Error while deaccessioning test Dataset') }) const actualDatasetCitation = await sut.getDatasetCitation( diff --git a/test/integration/files/FilesRepository.test.ts b/test/integration/files/FilesRepository.test.ts index c72332f8..dd83a70e 100644 --- a/test/integration/files/FilesRepository.test.ts +++ b/test/integration/files/FilesRepository.test.ts @@ -3,8 +3,6 @@ import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' -import { assert } from 'sinon' -import { expect } from 'chai' import { TestConstants } from '../../testHelpers/TestConstants' import { registerFileViaApi, uploadFileViaApi } from '../../testHelpers/files/filesHelper' import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository' @@ -17,7 +15,6 @@ import { import { DatasetNotNumberedVersion } from '../../../src/datasets' import { FileCounts } from '../../../src/files/domain/models/FileCounts' import { FileDownloadSizeMode } from '../../../src' -import { fail } from 'assert' describe('FilesRepository', () => { const sut: FilesRepository = new FilesRepository() @@ -51,28 +48,28 @@ describe('FilesRepository', () => { .then() .catch((e) => { console.log(e) - fail(`Tests beforeAll(): Error while uploading file ${testTextFile1Name}`) + throw new Error(`Tests beforeAll(): Error while uploading file ${testTextFile1Name}`) }) // Uploading test file 2 await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile2Name) .then() .catch((e) => { console.log(e) - fail(`Tests beforeAll(): Error while uploading file ${testTextFile2Name}`) + throw new Error(`Tests beforeAll(): Error while uploading file ${testTextFile2Name}`) }) // Uploading test file 3 await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile3Name) .then() .catch((e) => { console.log(e) - fail(`Tests beforeAll(): Error while uploading file ${testTextFile3Name}`) + throw new Error(`Tests beforeAll(): Error while uploading file ${testTextFile3Name}`) }) // Uploading test file 4 await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTabFile4Name) .then() .catch((e) => { console.log(e) - fail(`Tests beforeAll(): Error while uploading file ${testTabFile4Name}`) + throw new Error(`Tests beforeAll(): Error while uploading file ${testTabFile4Name}`) }) // Registering test file 1 await registerFileViaApi(uploadFileResponse.data.data.files[0].dataFile.id) @@ -99,12 +96,13 @@ describe('FilesRepository', () => { false, FileOrderCriteria.NAME_AZ ) - assert.match(actual.files.length, 4) - assert.match(actual.files[0].name, testTextFile1Name) - assert.match(actual.files[1].name, testTextFile2Name) - assert.match(actual.files[2].name, testTextFile3Name) - assert.match(actual.files[3].name, testTabFile4Name) - assert.match(actual.totalFilesCount, 4) + + expect(actual.files).toHaveLength(4) + expect(actual.files[0].name).toBe(testTextFile1Name) + expect(actual.files[1].name).toBe(testTextFile2Name) + expect(actual.files[2].name).toBe(testTextFile3Name) + expect(actual.files[3].name).toBe(testTabFile4Name) + expect(actual.totalFilesCount).toBe(4) }) test('should return correct files filtering by dataset id, version id, and paginating', async () => { @@ -117,9 +115,10 @@ describe('FilesRepository', () => { 3, undefined ) - assert.match(actual.files.length, 1) - assert.match(actual.files[0].name, testTabFile4Name) - assert.match(actual.totalFilesCount, 4) + + expect(actual.files).toHaveLength(1) + expect(actual.files[0].name).toBe(testTabFile4Name) + expect(actual.totalFilesCount).toBe(4) }) test('should return correct files filtering by dataset id, version id, and applying newest file criteria', async () => { @@ -132,30 +131,28 @@ describe('FilesRepository', () => { undefined, testFileCriteria ) - assert.match(actual.files.length, 3) - assert.match(actual.files[0].name, testTextFile3Name) - assert.match(actual.files[1].name, testTextFile2Name) - assert.match(actual.files[2].name, testTextFile1Name) - assert.match(actual.totalFilesCount, 3) + + expect(actual.files).toHaveLength(3) + expect(actual.files[0].name).toBe(testTextFile3Name) + expect(actual.files[1].name).toBe(testTextFile2Name) + expect(actual.files[2].name).toBe(testTextFile1Name) + expect(actual.totalFilesCount).toBe(3) }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - const nonExistentTestDatasetId = 100 - await sut - .getDatasetFiles( + const errorExpected: ReadError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + + await expect( + sut.getDatasetFiles( nonExistentTestDatasetId, latestDatasetVersionId, false, FileOrderCriteria.NAME_AZ ) - .catch((e) => (error = e)) - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with ID ${nonExistentTestDatasetId} not found.` - ) + ).rejects.toThrow(errorExpected) }) }) @@ -172,12 +169,13 @@ describe('FilesRepository', () => { false, FileOrderCriteria.NAME_AZ ) - assert.match(actual.files.length, 4) - assert.match(actual.files[0].name, testTextFile1Name) - assert.match(actual.files[1].name, testTextFile2Name) - assert.match(actual.files[2].name, testTextFile3Name) - assert.match(actual.files[3].name, testTabFile4Name) - assert.match(actual.totalFilesCount, 4) + + expect(actual.files).toHaveLength(4) + expect(actual.files[0].name).toBe(testTextFile1Name) + expect(actual.files[1].name).toBe(testTextFile2Name) + expect(actual.files[2].name).toBe(testTextFile3Name) + expect(actual.files[3].name).toBe(testTabFile4Name) + expect(actual.totalFilesCount).toBe(4) }) test('should return correct files filtering by persistent id, version id, and paginating', async () => { @@ -195,9 +193,10 @@ describe('FilesRepository', () => { 3, undefined ) - assert.match(actual.files.length, 1) - assert.match(actual.files[0].name, testTabFile4Name) - assert.match(actual.totalFilesCount, 4) + + expect(actual.files).toHaveLength(1) + expect(actual.files[0].name).toBe(testTabFile4Name) + expect(actual.totalFilesCount).toBe(4) }) test('should return correct files filtering by persistent id, version id, and applying newest file criteria', async () => { @@ -215,30 +214,28 @@ describe('FilesRepository', () => { undefined, testFileCriteria ) - assert.match(actual.files.length, 3) - assert.match(actual.files[0].name, testTextFile3Name) - assert.match(actual.files[1].name, testTextFile2Name) - assert.match(actual.files[2].name, testTextFile1Name) - assert.match(actual.totalFilesCount, 3) + + expect(actual.files).toHaveLength(3) + expect(actual.files[0].name).toBe(testTextFile3Name) + expect(actual.files[1].name).toBe(testTextFile2Name) + expect(actual.files[2].name).toBe(testTextFile1Name) + expect(actual.totalFilesCount).toBe(3) }) test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined - const testWrongPersistentId = 'wrongPersistentId' - await sut - .getDatasetFiles( + const errorExpected = new ReadError( + `[404] Dataset with Persistent ID ${testWrongPersistentId} not found.` + ) + + await expect( + sut.getDatasetFiles( testWrongPersistentId, latestDatasetVersionId, false, FileOrderCriteria.NAME_AZ ) - .catch((e) => (error = e)) - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.` - ) + ).rejects.toThrow(errorExpected) }) }) }) @@ -276,10 +273,13 @@ describe('FilesRepository', () => { latestDatasetVersionId, false ) - assert.match(actual.total, expectedFileCounts.total) - expect(actual.perContentType).to.have.deep.members(expectedFileCounts.perContentType) - expect(actual.perAccessStatus).to.have.deep.members(expectedFileCounts.perAccessStatus) - expect(actual.perCategoryName).to.have.deep.members(expectedFileCounts.perCategoryName) + + expect(actual.total).toBe(expectedFileCounts.total) + expect(actual.perContentType).toEqual( + expect.arrayContaining(expectedFileCounts.perContentType) + ) + expect(actual.perAccessStatus).toEqual(expectedFileCounts.perAccessStatus) + expect(actual.perCategoryName).toEqual(expectedFileCounts.perCategoryName) }) test('should return file count filtering by numeric id and applying category criteria', async () => { @@ -311,16 +311,11 @@ describe('FilesRepository', () => { false, testCriteria ) - assert.match(actual.total, expectedFileCountsForCriteria.total) - expect(actual.perContentType).to.have.deep.members( - expectedFileCountsForCriteria.perContentType - ) - expect(actual.perAccessStatus).to.have.deep.members( - expectedFileCountsForCriteria.perAccessStatus - ) - expect(actual.perCategoryName).to.have.deep.members( - expectedFileCountsForCriteria.perCategoryName - ) + + expect(actual.total).toBe(expectedFileCountsForCriteria.total) + expect(actual.perContentType).toEqual(expectedFileCountsForCriteria.perContentType) + expect(actual.perAccessStatus).toEqual(expectedFileCountsForCriteria.perAccessStatus) + expect(actual.perCategoryName).toEqual(expectedFileCountsForCriteria.perCategoryName) }) test('should return file count filtering by persistent id', async () => { @@ -334,10 +329,13 @@ describe('FilesRepository', () => { latestDatasetVersionId, false ) - assert.match(actual.total, expectedFileCounts.total) - expect(actual.perContentType).to.have.deep.members(expectedFileCounts.perContentType) - expect(actual.perAccessStatus).to.have.deep.members(expectedFileCounts.perAccessStatus) - expect(actual.perCategoryName).to.have.deep.members(expectedFileCounts.perCategoryName) + + expect(actual.total).toBe(expectedFileCounts.total) + expect(actual.perContentType).toEqual( + expect.arrayContaining(expectedFileCounts.perContentType) + ) + expect(actual.perAccessStatus).toEqual(expectedFileCounts.perAccessStatus) + expect(actual.perCategoryName).toEqual(expectedFileCounts.perCategoryName) }) }) @@ -351,7 +349,7 @@ describe('FilesRepository', () => { false, FileDownloadSizeMode.ORIGINAL ) - assert.match(actual, expectedTotalDownloadSize) + expect(actual).toBe(expectedTotalDownloadSize) }) test('should return total download size filtering by persistent id and ignoring original tabular size', async () => { @@ -366,7 +364,7 @@ describe('FilesRepository', () => { false, FileDownloadSizeMode.ORIGINAL ) - assert.match(actual, expectedTotalDownloadSize) + expect(actual).toBe(expectedTotalDownloadSize) }) test('should return total download size filtering by numeric id, ignoring original tabular size and applying category criteria', async () => { @@ -379,7 +377,7 @@ describe('FilesRepository', () => { FileDownloadSizeMode.ORIGINAL, testCriteria ) - assert.match(actual, expectedTotalDownloadSizeForCriteria) + expect(actual).toBe(expectedTotalDownloadSizeForCriteria) }) }) @@ -393,18 +391,13 @@ describe('FilesRepository', () => { ) const testFile = currentTestFilesSubset.files[0] const actual = await sut.getFileDownloadCount(testFile.id) - assert.match(actual, 0) + expect(actual).toBe(0) }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined - - await sut.getFileDownloadCount(nonExistentFiledId).catch((e) => (error = e)) + const expectedError = new ReadError(`[404] File with ID ${nonExistentFiledId} not found.`) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] File with ID ${nonExistentFiledId} not found.` - ) + await expect(sut.getFileDownloadCount(nonExistentFiledId)).rejects.toThrow(expectedError) }) }) @@ -418,20 +411,16 @@ describe('FilesRepository', () => { ) const testFile = currentTestFilesSubset.files[0] const actual = await sut.getFileUserPermissions(testFile.id) - assert.match(actual.canDownloadFile, true) - assert.match(actual.canManageFilePermissions, true) - assert.match(actual.canEditOwnerDataset, true) + + expect(actual.canDownloadFile).toBe(true) + expect(actual.canManageFilePermissions).toBe(true) + expect(actual.canEditOwnerDataset).toBe(true) }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined - - await sut.getFileUserPermissions(nonExistentFiledId).catch((e) => (error = e)) + const errorExpected = new ReadError(`[404] File with ID ${nonExistentFiledId} not found.`) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] File with ID ${nonExistentFiledId} not found.` - ) + await expect(sut.getFileUserPermissions(nonExistentFiledId)).rejects.toThrow(errorExpected) }) }) @@ -445,7 +434,7 @@ describe('FilesRepository', () => { ) const testFile = currentTestFilesSubset.files[3] const actual = await sut.getFileDataTables(testFile.id) - assert.match(actual[0].varQuantity, 3) + expect(actual[0].varQuantity).toBe(3) }) test('should return error when file is not tabular and version id', async () => { @@ -457,25 +446,17 @@ describe('FilesRepository', () => { ) const testFile = currentTestFilesSubset.files[0] - let error: ReadError = undefined - - await sut.getFileDataTables(testFile.id).catch((e) => (error = e)) - - assert.match( - error.message, - 'There was an error when reading the resource. Reason was: [400] This operation is only available for tabular files.' + const errorExpected = new ReadError( + '[400] This operation is only available for tabular files.' ) + + await expect(sut.getFileDataTables(testFile.id)).rejects.toThrow(errorExpected) }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined - - await sut.getFileDataTables(nonExistentFiledId).catch((e) => (error = e)) + const errorExpected = new ReadError('[404] File not found for given id.') - assert.match( - error.message, - 'There was an error when reading the resource. Reason was: [404] File not found for given id.' - ) + await expect(sut.getFileDataTables(nonExistentFiledId)).rejects.toThrow(errorExpected) }) }) @@ -484,77 +465,62 @@ describe('FilesRepository', () => { test('should return file when providing a valid id', async () => { const actual = await sut.getFile(testFileId, DatasetNotNumberedVersion.LATEST) - assert.match(actual.name, testTextFile1Name) + expect(actual.name).toBe(testTextFile1Name) }) test('should return file draft when providing a valid id and version is draft', async () => { const actual = await sut.getFile(testFileId, DatasetNotNumberedVersion.DRAFT) - assert.match(actual.name, testTextFile1Name) + expect(actual.name).toBe(testTextFile1Name) }) test('should return Not Implemented Yet error when when providing a valid id and version is different than latest and draft', async () => { // This tests can be removed once the API supports getting a file by version - let error: ReadError = undefined - - await sut.getFile(testFileId, '1.0').catch((e) => (error = e)) - - assert.match( - error.message, + const errorExpected = new ReadError( `Requesting a file by its dataset version is not yet supported. Requested version: 1.0. Please try using the :latest or :draft version instead.` ) + + await expect(sut.getFile(testFileId, '1.0')).rejects.toThrow(errorExpected) }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined - - await sut - .getFile(nonExistentFiledId, DatasetNotNumberedVersion.LATEST) - .catch((e) => (error = e)) + const errorExpected = new ReadError(`[400] Error attempting get the requested data file.`) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.` - ) + await expect( + sut.getFile(nonExistentFiledId, DatasetNotNumberedVersion.LATEST) + ).rejects.toThrow(errorExpected) }) }) describe('by persistent id', () => { test('should return file when providing a valid persistent id', async () => { const actual = await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.LATEST) - assert.match(actual.name, testTextFile1Name) + expect(actual.name).toBe(testTextFile1Name) }) test('should return file draft when providing a valid persistent id and version is draft', async () => { const actual = await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.DRAFT) - assert.match(actual.name, testTextFile1Name) + expect(actual.name).toBe(testTextFile1Name) }) test('should return Not Implemented Yet error when when providing a valid persistent id and version is different than latest and draft', async () => { // This tests can be removed once the API supports getting a file by version - let error: ReadError = undefined - - await sut.getFile(testFilePersistentId, '1.0').catch((e) => (error = e)) - - assert.match( - error.message, + const errorExpected = new ReadError( `Requesting a file by its dataset version is not yet supported. Requested version: 1.0. Please try using the :latest or :draft version instead.` ) + + await expect(sut.getFile(testFilePersistentId, '1.0')).rejects.toThrow(errorExpected) }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined + const errorExpected = new ReadError(`[400] Error attempting get the requested data file.`) const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId' - await sut - .getFile(nonExistentFiledPersistentId, DatasetNotNumberedVersion.LATEST) - .catch((e) => (error = e)) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.` - ) + await expect( + sut.getFile(nonExistentFiledPersistentId, DatasetNotNumberedVersion.LATEST) + ).rejects.toThrow(errorExpected) }) }) }) diff --git a/test/integration/info/DataverseInfoRepository.test.ts b/test/integration/info/DataverseInfoRepository.test.ts index 37ef9891..ed3e5d98 100644 --- a/test/integration/info/DataverseInfoRepository.test.ts +++ b/test/integration/info/DataverseInfoRepository.test.ts @@ -6,8 +6,6 @@ import { import { TestConstants } from '../../testHelpers/TestConstants' import { setMaxEmbargoDurationInMonthsViaApi } from '../../testHelpers/info/infoHelper' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert } from 'sinon' -import { fail } from 'assert' describe('DataverseInfoRepository', () => { const sut: DataverseInfoRepository = new DataverseInfoRepository() @@ -36,25 +34,19 @@ describe('DataverseInfoRepository', () => { describe('getMaxEmbargoDurationInMonths', () => { test('should return error when the setting does not exist', async () => { - let error: ReadError = undefined - await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)) - assert.match( - error.message, - 'There was an error when reading the resource. Reason was: [404] Setting :MaxEmbargoDurationInMonths not found' + const errorExpected: ReadError = new ReadError( + '[404] Setting :MaxEmbargoDurationInMonths not found' ) + + await expect(sut.getMaxEmbargoDurationInMonths()).rejects.toThrow(errorExpected) }) test('should return duration when the setting exists', async () => { const testMaxEmbargoDurationInMonths = 12 await setMaxEmbargoDurationInMonthsViaApi(testMaxEmbargoDurationInMonths) - .then() - .catch(() => { - fail( - 'Test getMaxEmbargoDurationInMonths: Error while setting :MaxEmbargoDurationInMonths' - ) - }) const actual = await sut.getMaxEmbargoDurationInMonths() - assert.match(actual, testMaxEmbargoDurationInMonths) + + expect(actual).toBe(testMaxEmbargoDurationInMonths) }) }) }) diff --git a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts index 8ef0d8b3..ac15c3dd 100644 --- a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts @@ -1,6 +1,5 @@ import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert } from 'sinon' import { ApiConfig, DataverseApiAuthMechanism @@ -17,13 +16,13 @@ describe('getMetadataBlockByName', () => { ) test('should return error when metadata block does not exist', async () => { - let error: ReadError = undefined const nonExistentMetadataBlockName = 'nonExistentMetadataBlock' - await sut.getMetadataBlockByName(nonExistentMetadataBlockName).catch((e) => (error = e)) + const errorExpected: ReadError = new ReadError( + `[404] Can't find metadata block '${nonExistentMetadataBlockName}'` + ) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Can't find metadata block '${nonExistentMetadataBlockName}'` + await expect(sut.getMetadataBlockByName(nonExistentMetadataBlockName)).rejects.toThrow( + errorExpected ) }) @@ -31,6 +30,6 @@ describe('getMetadataBlockByName', () => { const citationMetadataBlockName = 'citation' const actual = await sut.getMetadataBlockByName(citationMetadataBlockName) - assert.match(actual.name, citationMetadataBlockName) + expect(actual.name).toBe(citationMetadataBlockName) }) }) diff --git a/test/integration/users/UsersRepository.test.ts b/test/integration/users/UsersRepository.test.ts index 696c1034..4592482f 100644 --- a/test/integration/users/UsersRepository.test.ts +++ b/test/integration/users/UsersRepository.test.ts @@ -1,11 +1,10 @@ import { UsersRepository } from '../../../src/users/infra/repositories/UsersRepository' -import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { assert } from 'sinon' import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' import { TestConstants } from '../../testHelpers/TestConstants' +import { ReadError } from '../../../src' describe('getCurrentAuthenticatedUser', () => { const sut: UsersRepository = new UsersRepository() @@ -13,13 +12,8 @@ describe('getCurrentAuthenticatedUser', () => { test('should return error when authentication is not valid', async () => { ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, 'invalidApiKey') - let error: ReadError = undefined - await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)) - - assert.match( - error.message, - 'There was an error when reading the resource. Reason was: [401] Bad API key' - ) + const errorExpected: ReadError = new ReadError('[401] Bad API key') + await expect(sut.getCurrentAuthenticatedUser()).rejects.toThrow(errorExpected) }) test('should return authenticated user when valid authentication is provided', async () => { @@ -30,7 +24,6 @@ describe('getCurrentAuthenticatedUser', () => { ) const actual = await sut.getCurrentAuthenticatedUser() - - assert.match(actual.firstName, 'Dataverse') + expect(actual.firstName).toBe('Dataverse') }) }) From 3190eec55df813a85f34653c25c31ea62f1e06e6 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 14:00:15 +0100 Subject: [PATCH 06/11] feat(formatting): remove sinon and chai libraries --- package-lock.json | 204 +----------------- package.json | 4 - test/unit/auth/Logout.test.ts | 7 - test/unit/datasets/GetDatasetCitation.test.ts | 6 - .../GetDatasetSummaryFieldNames.test.ts | 7 - 5 files changed, 1 insertion(+), 227 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18881de5..1d1e3861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,12 +16,9 @@ "typescript": "^4.9.5" }, "devDependencies": { - "@types/chai": "^4.3.4", "@types/jest": "^29.4.0", - "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "5.51.0", "@typescript-eslint/parser": "5.51.0", - "chai": "^4.3.7", "eslint": "8.33.0", "eslint-config-prettier": "8.6.0", "eslint-plugin-import": "2.27.5", @@ -30,9 +27,8 @@ "eslint-plugin-simple-import-sort": "10.0.0", "eslint-plugin-unused-imports": "2.0.0", "jest": "^29.4.3", - "pre-commit": "^1.2.2", + "pre-commit": "1.2.2", "prettier": "2.8.4", - "sinon": "^15.0.3", "testcontainers": "^9.9.1", "ts-jest": "^29.0.5", "ts-node": "^10.9.2" @@ -1241,32 +1237,6 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -1341,12 +1311,6 @@ "@babel/types": "^7.3.0" } }, - "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true - }, "node_modules/@types/docker-modem": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.2.tgz", @@ -1448,21 +1412,6 @@ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, - "node_modules/@types/sinon": { - "version": "10.0.15", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", - "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true - }, "node_modules/@types/ssh2": { "version": "1.11.11", "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.11.11.tgz", @@ -2277,15 +2226,6 @@ "safer-buffer": "~2.1.0" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -2647,24 +2587,6 @@ } ] }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2690,15 +2612,6 @@ "node": ">=10" } }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -2952,18 +2865,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3028,15 +2929,6 @@ "node": ">=8" } }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", @@ -4024,15 +3916,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -4688,12 +4571,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5403,12 +5280,6 @@ "node": ">=6" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -5527,12 +5398,6 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -5557,15 +5422,6 @@ "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", "dev": true }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5737,28 +5593,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, "node_modules/node-fetch": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", @@ -6017,15 +5851,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6035,15 +5860,6 @@ "node": ">=8" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -6716,24 +6532,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/sinon": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz", - "integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.4", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/package.json b/package.json index b619b8be..66bcee7e 100644 --- a/package.json +++ b/package.json @@ -43,12 +43,9 @@ }, "homepage": "https://github.com/IQSS/dataverse-client-javascript#readme", "devDependencies": { - "@types/chai": "^4.3.4", "@types/jest": "^29.4.0", - "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "5.51.0", "@typescript-eslint/parser": "5.51.0", - "chai": "^4.3.7", "eslint": "8.33.0", "eslint-config-prettier": "8.6.0", "eslint-plugin-import": "2.27.5", @@ -59,7 +56,6 @@ "jest": "^29.4.3", "pre-commit": "1.2.2", "prettier": "2.8.4", - "sinon": "^15.0.3", "testcontainers": "^9.9.1", "ts-jest": "^29.0.5", "ts-node": "^10.9.2" diff --git a/test/unit/auth/Logout.test.ts b/test/unit/auth/Logout.test.ts index e3db6e52..e5634e15 100644 --- a/test/unit/auth/Logout.test.ts +++ b/test/unit/auth/Logout.test.ts @@ -1,15 +1,8 @@ import { Logout } from '../../../src/auth/domain/useCases/Logout' -import { createSandbox, SinonSandbox } from 'sinon' import { IAuthRepository } from '../../../src/auth/domain/repositories/IAuthRepository' import { WriteError } from '../../../src/core/domain/repositories/WriteError' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should not return error on repository success', async () => { const authRepositoryStub: IAuthRepository = {} as IAuthRepository authRepositoryStub.logout = jest.fn() diff --git a/test/unit/datasets/GetDatasetCitation.test.ts b/test/unit/datasets/GetDatasetCitation.test.ts index 1fa18930..e8cd9653 100644 --- a/test/unit/datasets/GetDatasetCitation.test.ts +++ b/test/unit/datasets/GetDatasetCitation.test.ts @@ -1,16 +1,10 @@ import { GetDatasetCitation } from '../../../src/datasets/domain/useCases/GetDatasetCitation' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() const testId = 1 - afterEach(() => { - sandbox.restore() - }) - test('should return successful result with citation on repository success', async () => { const testCitation = 'test citation' const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository diff --git a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts index 3bfd5dd5..2d0a10b5 100644 --- a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts +++ b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts @@ -1,15 +1,8 @@ import { GetDatasetSummaryFieldNames } from '../../../src/datasets/domain/useCases/GetDatasetSummaryFieldNames' import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' import { ReadError } from '../../../src/core/domain/repositories/ReadError' -import { createSandbox, SinonSandbox } from 'sinon' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox() - - afterEach(() => { - sandbox.restore() - }) - test('should return successful result with field names on repository success', async () => { const testFieldNames = ['test1', 'test2'] const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository From 0705808e49ecc260c943054f2f8190651fa956c9 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 14:03:57 +0100 Subject: [PATCH 07/11] feat(formatting): disable eslint specifit lines --- .../transformers/datasetTransformers.ts | 9 ++++++--- .../transformers/fileCountsTransformers.ts | 6 +++--- .../transformers/fileDataTableTransformers.ts | 13 +++++++++---- .../transformers/metadataBlockTransformers.ts | 1 + test/integration/environment/setup.ts | 2 ++ test/testHelpers/datasets/datasetHelper.ts | 1 + test/testHelpers/files/fileCountsHelper.ts | 1 + test/testHelpers/files/fileDataTablesHelper.ts | 1 + test/testHelpers/files/filesHelper.ts | 2 ++ .../metadataBlocks/metadataBlockHelper.ts | 1 + 10 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/datasets/infra/repositories/transformers/datasetTransformers.ts b/src/datasets/infra/repositories/transformers/datasetTransformers.ts index b8af6d9d..9c59338c 100644 --- a/src/datasets/infra/repositories/transformers/datasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetTransformers.ts @@ -58,8 +58,9 @@ const transformPayloadToDatasetLicense = (licensePayload: any): DatasetLicense = } return datasetLicense } -// eslint-disable-next-line @typescript-eslint/no-explicit-any + const transformPayloadToDatasetMetadataBlocks = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any metadataBlocksPayload: any ): DatasetMetadataBlocks => { return Object.keys(metadataBlocksPayload).map((metadataBlockKey) => { @@ -71,8 +72,9 @@ const transformPayloadToDatasetMetadataBlocks = ( } }) as DatasetMetadataBlocks } -// eslint-disable-next-line @typescript-eslint/no-explicit-any + const transformPayloadToDatasetMetadataFields = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any metadataFieldsPayload: any ): DatasetMetadataFields => { const metadataFieldKeys = Object.keys(metadataFieldsPayload) @@ -86,8 +88,9 @@ const transformPayloadToDatasetMetadataFields = ( } return metadataFields } -// eslint-disable-next-line @typescript-eslint/no-explicit-any + const transformPayloadToDatasetMetadataFieldValue = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any metadataFieldValuePayload: any ): DatasetMetadataFieldValue => { let metadataFieldValue: DatasetMetadataFieldValue diff --git a/src/files/infra/repositories/transformers/fileCountsTransformers.ts b/src/files/infra/repositories/transformers/fileCountsTransformers.ts index 0d7a57aa..8938224f 100644 --- a/src/files/infra/repositories/transformers/fileCountsTransformers.ts +++ b/src/files/infra/repositories/transformers/fileCountsTransformers.ts @@ -17,8 +17,8 @@ export const transformFileCountsResponseToFileCounts = (response: AxiosResponse) } } -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const transformCountsPerContentTypePayload = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any countsPerContentTypePayload: any ): FileContentTypeCount[] => { const fileContentTypeCounts: FileContentTypeCount[] = [] @@ -32,8 +32,8 @@ export const transformCountsPerContentTypePayload = ( return fileContentTypeCounts } -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const transformCountsPerCategoryNamePayload = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any countsPerCategoryNamePayload: any ): FileCategoryNameCount[] => { const fileCategoryNameCounts: FileCategoryNameCount[] = [] @@ -47,8 +47,8 @@ export const transformCountsPerCategoryNamePayload = ( return fileCategoryNameCounts } -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const transformCountsPerAccessStatusPayload = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any countsPerAccessStatusPayload: any ): FileAccessStatusCount[] => { const fileAccessStatusCounts: FileAccessStatusCount[] = [] diff --git a/src/files/infra/repositories/transformers/fileDataTableTransformers.ts b/src/files/infra/repositories/transformers/fileDataTableTransformers.ts index 69b1a901..fea178ae 100644 --- a/src/files/infra/repositories/transformers/fileDataTableTransformers.ts +++ b/src/files/infra/repositories/transformers/fileDataTableTransformers.ts @@ -38,6 +38,7 @@ const transformPayloadToFileDataTable = (fileDataTablePayload: any): FileDataTab // eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToDataVariables = (fileDataVariablesPayload: any): FileDataVariable[] => { const fileDataVariables: FileDataVariable[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any fileDataVariablesPayload.forEach(function (fileDataVariablePayload: any) { fileDataVariables.push({ id: fileDataVariablePayload.id, @@ -93,11 +94,12 @@ const transformPayloadToDataVariables = (fileDataVariablesPayload: any): FileDat return fileDataVariables } -// eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToFileVariableMetadata = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any fileVariableMetadataPayload: any ): FileDataVariableMetadata[] => { const fileDataVariableMetadata: FileDataVariableMetadata[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any fileVariableMetadataPayload.forEach(function (fileVariableMetadataElementPayload: any) { fileDataVariableMetadata.push({ id: fileVariableMetadataElementPayload.id, @@ -133,11 +135,12 @@ const transformPayloadToFileVariableMetadata = ( return fileDataVariableMetadata } -// eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToFileDataVariableCategoryMetadatas = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any categoryMetadatasPayload: any ): FileDataVariableCategoryMetadata[] => { const fileDataVariableCategoryMetadatas: FileDataVariableCategoryMetadata[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any categoryMetadatasPayload.forEach(function (categoryMetadataPayload: any) { fileDataVariableCategoryMetadatas.push({ ...(categoryMetadataPayload.wFreq && { wFreq: categoryMetadataPayload.wFreq }), @@ -149,11 +152,12 @@ const transformPayloadToFileDataVariableCategoryMetadatas = ( return fileDataVariableCategoryMetadatas } -// eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToDataVariableInvalidRanges = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any dataVariableInvalidRangesPayload: any ): FileDataVariableInvalidRanges[] => { const dataVariableInvalidRanges: FileDataVariableInvalidRanges[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any dataVariableInvalidRangesPayload.forEach(function (dataVariableInvalidRangePayload: any) { dataVariableInvalidRanges.push({ ...(dataVariableInvalidRangePayload.beginValue && { @@ -176,11 +180,12 @@ const transformPayloadToDataVariableInvalidRanges = ( return dataVariableInvalidRanges } -// eslint-disable-next-line @typescript-eslint/no-explicit-any const transformPayloadToFileDataVariableCategories = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any fileDataVariableCategoriesPayload: any ): FileDataVariableCategory[] => { const fileDataVariableCategories: FileDataVariableCategory[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any fileDataVariableCategoriesPayload.forEach(function (fileDataVariableCategoryPayload: any) { fileDataVariableCategories.push({ ...(fileDataVariableCategoryPayload.label && { diff --git a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts index e6ad29b7..c433bb0d 100644 --- a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts +++ b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts @@ -20,6 +20,7 @@ export const transformMetadataBlockResponseToMetadataBlock = ( } const transformPayloadMetadataFieldInfo = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any metadataFieldInfoPayload: any, isChild = false ): MetadataFieldInfo => { diff --git a/test/integration/environment/setup.ts b/test/integration/environment/setup.ts index d4fc13f8..daa2d7be 100644 --- a/test/integration/environment/setup.ts +++ b/test/integration/environment/setup.ts @@ -54,6 +54,7 @@ async function setupTestFixtures(): Promise { await waitForDatasetsIndexingInSolr() } +// eslint-disable-next-line @typescript-eslint/no-explicit-any async function createDatasetViaApi(datasetJson: any): Promise { await axios.post( `${TestConstants.TEST_API_URL}/dataverses/root/datasets`, @@ -92,6 +93,7 @@ async function waitForDatasetsIndexingInSolr(): Promise { console.log('Datasets indexed in Solr') } +// eslint-disable-next-line @typescript-eslint/no-explicit-any function buildRequestHeaders(): any { return { headers: { 'Content-Type': 'application/json', 'X-Dataverse-Key': process.env.TEST_API_KEY } diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index 66cc00c9..1d7a71a8 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -75,6 +75,7 @@ export const createDatasetModel = (license?: DatasetLicense): Dataset => { // eslint-disable-next-line @typescript-eslint/no-explicit-any export const createDatasetVersionPayload = (license?: DatasetLicense): any => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any const datasetPayload: any = { id: 19, datasetId: 1, diff --git a/test/testHelpers/files/fileCountsHelper.ts b/test/testHelpers/files/fileCountsHelper.ts index 32114731..7a658aaa 100644 --- a/test/testHelpers/files/fileCountsHelper.ts +++ b/test/testHelpers/files/fileCountsHelper.ts @@ -29,6 +29,7 @@ export const createFileCountsModel = (): FileCounts => { } } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createFileCountsPayload = (): any => { return { total: 4, diff --git a/test/testHelpers/files/fileDataTablesHelper.ts b/test/testHelpers/files/fileDataTablesHelper.ts index 7ef5b33f..afc1d0af 100644 --- a/test/testHelpers/files/fileDataTablesHelper.ts +++ b/test/testHelpers/files/fileDataTablesHelper.ts @@ -43,6 +43,7 @@ export const createFileDataTableModel = (): FileDataTable => { } } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createFileDataTablePayload = (): any => { return { varQuantity: 21, diff --git a/test/testHelpers/files/filesHelper.ts b/test/testHelpers/files/filesHelper.ts index a703cc76..7048b5a6 100644 --- a/test/testHelpers/files/filesHelper.ts +++ b/test/testHelpers/files/filesHelper.ts @@ -50,6 +50,7 @@ export const createFilesSubsetModel = (amount: number): FilesSubset => { } } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createFilePayload = (): any => { return { label: 'test', @@ -86,6 +87,7 @@ export const createFilePayload = (): any => { } } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createManyFilesPayload = (amount: number): any[] => { return Array.from({ length: amount }, () => createFilePayload()) } diff --git a/test/testHelpers/metadataBlocks/metadataBlockHelper.ts b/test/testHelpers/metadataBlocks/metadataBlockHelper.ts index a4ec24d3..03cbc188 100644 --- a/test/testHelpers/metadataBlocks/metadataBlockHelper.ts +++ b/test/testHelpers/metadataBlocks/metadataBlockHelper.ts @@ -56,6 +56,7 @@ export const createMetadataBlockModel = (): MetadataBlock => { } } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createMetadataBlockPayload = (): any => { return { id: 1, From 3a701bd0de4f827721759448bce66a4f3aeaf418 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 14:56:18 +0100 Subject: [PATCH 08/11] feat(coverage): add some tests to reach coverage check --- test/testHelpers/datasets/datasetHelper.ts | 20 +++- .../testHelpers/files/fileDataTablesHelper.ts | 108 +++++++++++++++++- test/testHelpers/files/filesHelper.ts | 8 ++ test/unit/datasets/DatasetsRepository.test.ts | 26 +++++ 4 files changed, 156 insertions(+), 6 deletions(-) diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index 1d7a71a8..cea8ab72 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -22,7 +22,10 @@ const DATAVERSE_API_REQUEST_HEADERS = { headers: { 'Content-Type': 'application/json', 'X-Dataverse-Key': process.env.TEST_API_KEY } } -export const createDatasetModel = (license?: DatasetLicense): Dataset => { +export const createDatasetModel = ( + license?: DatasetLicense, + addOptionalParameters = false +): Dataset => { const datasetModel: Dataset = { id: 1, persistentId: 'doi:10.5072/FK2/HC6KTB', @@ -70,11 +73,19 @@ export const createDatasetModel = (license?: DatasetLicense): Dataset => { if (license !== undefined) { datasetModel.license = license } + if (addOptionalParameters) { + datasetModel.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB' + datasetModel.publicationDate = '2021-01-01' + datasetModel.citationDate = '2021-01-01' + } return datasetModel } // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const createDatasetVersionPayload = (license?: DatasetLicense): any => { +export const createDatasetVersionPayload = ( + license?: DatasetLicense, + addOptionalProperties = false +): any => { // eslint-disable-next-line @typescript-eslint/no-explicit-any const datasetPayload: any = { id: 19, @@ -182,6 +193,11 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): any => { if (license !== undefined) { datasetPayload.license = license } + if (addOptionalProperties) { + datasetPayload.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB' + datasetPayload.publicationDate = '2021-01-01' + datasetPayload.citationDate = '2021-01-01' + } return datasetPayload } diff --git a/test/testHelpers/files/fileDataTablesHelper.ts b/test/testHelpers/files/fileDataTablesHelper.ts index afc1d0af..330a8e99 100644 --- a/test/testHelpers/files/fileDataTablesHelper.ts +++ b/test/testHelpers/files/fileDataTablesHelper.ts @@ -9,6 +9,7 @@ export const createFileDataTableModel = (): FileDataTable => { varQuantity: 21, caseQuantity: 122, UNF: 'UNF:6:awd/lz8bNdoXn8f1sjAAAQ==', + recordsPerCase: 1, dataVariables: [ { id: 3, @@ -25,7 +26,36 @@ export const createFileDataTableModel = (): FileDataTable => { medn: '28.27591', mode: '.', min: '27.6741' - } + }, + formatCategory: 'Character', + format: 'A', + fileStartPosition: 1, + fileEndPosition: 1, + recordSegmentNumber: 1, + numberOfDecimalPoints: 1, + invalidRanges: [ + { + beginValue: '1', + endValue: '2', + hasBeginValueType: false, + isBeginValueTypeMax: false, + hasEndValueType: false, + isBeginValueTypePoint: false, + isBeginValueTypeMin: false, + isBeginValueTypeMinExcl: false, + isBeginValueTypeMaxExcl: false, + endValueTypeMax: false, + endValueTypeMaxExcl: false + } + ], + variableCategories: [ + { + label: 'test1', + value: 'test1', + frequency: 10, + isMissing: false + } + ] }, { id: 15, @@ -37,7 +67,27 @@ export const createFileDataTableModel = (): FileDataTable => { isOrderedCategorical: false, fileOrder: 1, UNF: 'UNF:6:KPoFCWSEsLpy11Lh11CXWQ==', - variableMetadata: [] + variableMetadata: [ + { + id: 1, + label: 'test1', + metadataId: 1, + isWeighted: false, + isWeightVar: false, + weightVariableId: 1, + literalQuestion: 'test1', + interviewInstruction: 'test1', + postQuestion: 'test1', + universe: 'test1', + notes: 'test1', + categoryMetadatas: [ + { + categoryValue: 'test1', + wFreq: 1 + } + ] + } + ] } ] } @@ -49,6 +99,7 @@ export const createFileDataTablePayload = (): any => { varQuantity: 21, caseQuantity: 122, UNF: 'UNF:6:awd/lz8bNdoXn8f1sjAAAQ==', + recordsPerCase: 1, dataVariables: [ { id: 3, @@ -65,7 +116,36 @@ export const createFileDataTablePayload = (): any => { medn: '28.27591', mode: '.', min: '27.6741' - } + }, + formatCategory: 'Character', + format: 'A', + fileStartPosition: 1, + fileEndPosition: 1, + recordSegmentNumber: 1, + numberOfDecimalPoints: 1, + invalidRanges: [ + { + beginValue: '1', + endValue: '2', + hasBeginValueType: false, + isBeginValueTypeMax: false, + hasEndValueType: false, + isBeginValueTypePoint: false, + isBeginValueTypeMin: false, + isBeginValueTypeMinExcl: false, + isBeginValueTypeMaxExcl: false, + endValueTypeMax: false, + endValueTypeMaxExcl: false + } + ], + variableCategories: [ + { + label: 'test1', + value: 'test1', + frequency: 10, + isMissing: false + } + ] }, { id: 15, @@ -77,7 +157,27 @@ export const createFileDataTablePayload = (): any => { isOrderedCategorical: false, fileOrder: 1, UNF: 'UNF:6:KPoFCWSEsLpy11Lh11CXWQ==', - variableMetadata: [] + variableMetadata: [ + { + id: 1, + label: 'test1', + metadataId: 1, + isWeighted: false, + isWeightVar: false, + weightVariableId: 1, + literalQuestion: 'test1', + interviewInstruction: 'test1', + postQuestion: 'test1', + universe: 'test1', + notes: 'test1', + categoryMetadatas: [ + { + categoryValue: 'test1', + wFreq: 1 + } + ] + } + ] } ] } diff --git a/test/testHelpers/files/filesHelper.ts b/test/testHelpers/files/filesHelper.ts index 7048b5a6..6eb697f1 100644 --- a/test/testHelpers/files/filesHelper.ts +++ b/test/testHelpers/files/filesHelper.ts @@ -17,6 +17,10 @@ export const createFileModel = (): File => { version: 1, restricted: false, latestRestricted: false, + description: 'some description', + originalSize: 127426, + originalName: 'test.png', + tabularTags: [], contentType: 'image/png', friendlyType: 'PNG Image', storageIdentifier: 'local://18945a85439-9fa52783e5cb', @@ -61,6 +65,10 @@ export const createFilePayload = (): any => { id: 1, persistentId: '', filename: 'test', + description: 'some description', + originalSize: 127426, + originalName: 'test.png', + tabularTags: [], contentType: 'image/png', friendlyType: 'PNG Image', filesize: 127426, diff --git a/test/unit/datasets/DatasetsRepository.test.ts b/test/unit/datasets/DatasetsRepository.test.ts index b6af59a4..64409a69 100644 --- a/test/unit/datasets/DatasetsRepository.test.ts +++ b/test/unit/datasets/DatasetsRepository.test.ts @@ -169,6 +169,32 @@ describe('DatasetsRepository', () => { expect(actual).toStrictEqual(createDatasetModel(testDatasetLicenseWithoutIconUri)) }) + test('should return dataset with alternative persistent id, publication date and citation date when they are present in the response', async () => { + const testDatasetVersionWithAlternativePersistentIdAndDatesSuccessfulResponse = { + data: { + status: 'OK', + data: createDatasetVersionPayload(undefined, true) + } + } + jest + .spyOn(axios, 'get') + .mockResolvedValue( + testDatasetVersionWithAlternativePersistentIdAndDatesSuccessfulResponse + ) + + const actual = await sut.getDataset( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) + + expect(axios.get).toHaveBeenCalledWith( + `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, + expectedRequestConfigApiKey + ) + expect(actual).toStrictEqual(createDatasetModel(undefined, true)) + }) + test('should return error on repository read error', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) From 210c2cdf6ad95a62fd16c7399fcca3e1fdadc65d Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 14:59:07 +0100 Subject: [PATCH 09/11] feat(formatting): disable eslint for any type --- test/testHelpers/datasets/datasetHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index cea8ab72..ddf39991 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -81,10 +81,10 @@ export const createDatasetModel = ( return datasetModel } -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createDatasetVersionPayload = ( license?: DatasetLicense, addOptionalProperties = false + // eslint-disable-next-line @typescript-eslint/no-explicit-any ): any => { // eslint-disable-next-line @typescript-eslint/no-explicit-any const datasetPayload: any = { From 4885882dd536a75f09fcc1799a8ab330ae846a4b Mon Sep 17 00:00:00 2001 From: MellyGray Date: Thu, 8 Feb 2024 16:52:35 +0100 Subject: [PATCH 10/11] feat(formatting): add lint workflow to Github actions --- .github/workflows/lint.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..3eeeeb66 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,24 @@ +name: lint + +on: push + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 19 + + - name: Install npm dependencies + run: npm ci + + - name: Type check + run: npm run typecheck + + - name: ESLint + run: npm run lint:eslint + + - name: Prettier + run: npm run lint:prettier From 2d914bd086843b799b2923a78bf6cd7ceb6ad7af Mon Sep 17 00:00:00 2001 From: MellyGray Date: Mon, 4 Mar 2024 15:24:17 +0100 Subject: [PATCH 11/11] fix: add tests to reach coverage threshold --- test/testHelpers/datasets/newDatasetHelper.ts | 11 +++++++--- test/testHelpers/files/filesHelper.ts | 20 ++++++++++++++++-- test/unit/.DS_Store | Bin 6148 -> 8196 bytes .../datasets/newDatasetTransformers.test.ts | 19 +++++++++++++++++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/test/testHelpers/datasets/newDatasetHelper.ts b/test/testHelpers/datasets/newDatasetHelper.ts index 7fdfe2d5..dd9c8f6f 100644 --- a/test/testHelpers/datasets/newDatasetHelper.ts +++ b/test/testHelpers/datasets/newDatasetHelper.ts @@ -2,7 +2,7 @@ import { NewDatasetDTO, NewDatasetMetadataFieldValueDTO } from '../../../src/datasets/domain/dtos/NewDatasetDTO' -import { MetadataBlock } from '../../../src' +import { DatasetLicense, MetadataBlock } from '../../../src' import { NewDatasetRequestPayload } from '../../../src/datasets/infra/repositories/transformers/newDatasetTransformers' export const createNewDatasetDTO = ( @@ -10,7 +10,8 @@ export const createNewDatasetDTO = ( authorFieldValue?: NewDatasetMetadataFieldValueDTO, alternativeRequiredTitleValue?: NewDatasetMetadataFieldValueDTO, timePeriodCoveredStartValue?: NewDatasetMetadataFieldValueDTO, - contributorTypeValue?: NewDatasetMetadataFieldValueDTO + contributorTypeValue?: NewDatasetMetadataFieldValueDTO, + license?: DatasetLicense ): NewDatasetDTO => { const validTitle = 'test dataset' const validAuthorFieldValue = [ @@ -25,6 +26,7 @@ export const createNewDatasetDTO = ( ] const validAlternativeRequiredTitleValue = ['alternative1', 'alternative2'] return { + ...(license && { license }), metadataBlockValues: [ { name: 'citation', @@ -257,9 +259,12 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { } } -export const createNewDatasetRequestPayload = (): NewDatasetRequestPayload => { +export const createNewDatasetRequestPayload = ( + license?: DatasetLicense +): NewDatasetRequestPayload => { return { datasetVersion: { + ...(license && { license }), metadataBlocks: { citation: { fields: [ diff --git a/test/testHelpers/files/filesHelper.ts b/test/testHelpers/files/filesHelper.ts index 54cb2b32..f8f5e48b 100644 --- a/test/testHelpers/files/filesHelper.ts +++ b/test/testHelpers/files/filesHelper.ts @@ -45,7 +45,15 @@ export const createFileModel = (): File => { version: 'DRAFT', displayName: 'First Dataset', isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' } - } + }, + description: 'description', + directoryLabel: 'directoryLabel', + datasetVersionId: 1, + originalFormat: 'originalFormat', + originalSize: 127426, + originalName: 'originalName', + tabularTags: ['tag1', 'tag2'], + publicationDate: new Date('2023-07-11') } } @@ -99,7 +107,15 @@ export const createFilePayload = (): FilePayload => { version: 'DRAFT', displayName: 'First Dataset', isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' } - } + }, + description: 'description', + directoryLabel: 'directoryLabel', + datasetVersionId: 1, + originalFormat: 'originalFormat', + originalSize: 127426, + originalName: 'originalName', + tabularTags: ['tag1', 'tag2'], + publicationDate: '2023-07-11' } } } diff --git a/test/unit/.DS_Store b/test/unit/.DS_Store index dca8550d2dc6ebc74620c8e14c9642b046f64290..6b5f1ed387502584f8f72f64eb32f5d2e8ddadaf 100644 GIT binary patch literal 8196 zcmeHMTWl3Y7@lui=c(3vd~pW@t?*0_ujh!MCU5fJ-BlCqGgq8ybn+B&F+t^g#( z6(CAfr+Yx;lPtO_JE=*idPIscd{o%cao{19Fic`z_0wc~FP(LrAZ%*-8cJFDwCNSRg3sXl zyNCRd?$8YLLA#mTE3_WpchjZ1neKJ$kwLw>!}mhd@$6jW;8-?w+1KZImOs+&=RGTk ze7mKAt6Uw_YfhYKZf$BzwluFh*_b@Bu9@nqT3Sz@RQcSxl^b>q9&v{~|8Y4L6t@F5 zYuwbHm~38dQ0S2JDw|iD*SDp4soD&qx36Ct)T;{g@?F``@x7qe&IKd~^*I4ea%;x- zcIIqh@5}gZe%K2J^~#LtX7a8X+HJ1e?L1%y{h@s<6t#iC&xIXP$9{)=McbgR=L36} zO%6`M?j*OMdfdxHJv(!5;?^b0npUsByK~Eqofl@!o}+73T6JH+37oWR?;dfiaA=Pi zWNgoJyu$;8pcgua96P60qEGGd%whY&y!kb{vB0=_Dle|r@&0_;IhuFEVni#l7`4V?&i9J;j+{-UY}V?H230qCPe49Oi!H}7=yGDp-C6Dc#M{7py!ex`?gnmu}QfqW^zDEq!W?3|jKEGz({ksf< z7RK=k4zZdRT#{S=igR9<#^3q9D612_m1 zhu|ZN90DB2DLjlv@fc3yIXsUS@FHHvS-gpJcnhE4GklIO@C|;%Pxu*^@E88ZWkpr0 zl*P*JO1-jFX;4~}wMv_Ob)^(F17nG&w39wzH=wA=%BWF}P8KzZdp2*mKBDI0Oc5uQ zRX0`7T~t@Uyt#El>I#)4`AU4dn#U1!#}GcEZnWCtIY$v?ELf-|b`!VlW8>C&caq9PtV_MEokkL2@-GN`j=j%5X6M-jBJ8j1H}(g+OeCF+Y9irTji>N5p24#?gO~9N zUd3w>ec#3h;|RHJEFtmXWP~hq=RDW<4wJ1!pLNnZKGkm|{zEmf4GQj&$z YfBqpL`aK_?|5yKDjnDsxiZ@j84^vGm_y7O^ delta 133 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGqg=C6q~50D9Q+A12Isnm?4#+grT@BxF~O8 zp*kbu=G9^`j2j!|*%q^Na0oJkGy&Cd0|{3kZrfP+oq009j4mh0gabg#FxiGjnuiHu N2gq86&G9@lm;ug+6~_Po diff --git a/test/unit/datasets/newDatasetTransformers.test.ts b/test/unit/datasets/newDatasetTransformers.test.ts index ee2d29fa..0ad1525f 100644 --- a/test/unit/datasets/newDatasetTransformers.test.ts +++ b/test/unit/datasets/newDatasetTransformers.test.ts @@ -4,6 +4,7 @@ import { createNewDatasetRequestPayload } from '../../testHelpers/datasets/newDatasetHelper' import { transformNewDatasetModelToRequestPayload } from '../../../src/datasets/infra/repositories/transformers/newDatasetTransformers' +import { createDatasetLicenseModel } from '../../testHelpers/datasets/datasetHelper' describe('transformNewDatasetModelToRequestPayload', () => { test('should correctly transform a new dataset model to a new dataset request payload', async () => { @@ -14,4 +15,22 @@ describe('transformNewDatasetModelToRequestPayload', () => { expect(actual).toEqual(expectedNewDatasetRequestPayload) }) + + it('should correctly transform a new dataset model to a new dataset request payload when it contains a license', () => { + const testNewDataset = createNewDatasetDTO( + undefined, + undefined, + undefined, + undefined, + undefined, + createDatasetLicenseModel() + ) + const testMetadataBlocks = [createNewDatasetMetadataBlockModel()] + const expectedNewDatasetRequestPayload = createNewDatasetRequestPayload( + createDatasetLicenseModel() + ) + const actual = transformNewDatasetModelToRequestPayload(testNewDataset, testMetadataBlocks) + + expect(actual).toEqual(expectedNewDatasetRequestPayload) + }) })