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/.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 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 df3efac0..14e1e91c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -18,7 +18,6 @@ An unstable 2.x version of this package with breaking changes is under developme Until a 2.0 version is officially released, it can be installed from https://github.com/IQSS/dataverse-client-javascript/pkgs/npm/dataverse-client-javascript - ### Create a `.npmrc` file and add a token To install the [@iqss/dataverse-client-javascript](https://github.com/IQSS/dataverse-client-javascript/pkgs/npm/dataverse-client-javascript) @@ -89,20 +88,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 3fc847ae..413a7b88 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -53,16 +53,16 @@ Returns a [Dataset](../src/datasets/domain/models/Dataset.ts) instance, given th ##### Example call: ```typescript -import { getDataset } from '@iqss/dataverse-client-javascript'; +import { getDataset } 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) => { /* ... */ -}); +}) /* ... */ ``` @@ -80,15 +80,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -102,16 +102,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -129,15 +129,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -151,15 +151,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[]) => { /* ... */ -}); +}) /* ... */ ``` @@ -175,13 +175,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[]) => { /* ... */ -}); +}) /* ... */ ``` @@ -195,15 +195,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -219,17 +219,17 @@ 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 collectionId = 'subcollection1'; +const limit = 10 +const offset = 20 +const collectionId = 'subcollection1' getAllDatasetPreviews.execute(limit, offset, collectionId).then((subset: DatasetPreviewSubset) => { /* ... */ -}); +}) /* ... */ ``` @@ -253,7 +253,7 @@ This use case validates the submitted fields of each metadata block and can retu ##### Example call: ```typescript -import { createDataset } from '@iqss/dataverse-client-javascript'; +import { createDataset } from '@iqss/dataverse-client-javascript' /* ... */ @@ -266,36 +266,35 @@ const newDatasetDTO: NewDatasetDTO = { author: [ { authorName: 'John Doe', - authorAffiliation: 'Dataverse', + authorAffiliation: 'Dataverse' }, { authorName: 'John Lee', - authorAffiliation: 'Dataverse', - }, + authorAffiliation: 'Dataverse' + } ], datasetContact: [ { datasetContactEmail: 'johndoe@dataverse.com', - datasetContactName: 'John', - }, + datasetContactName: 'John' + } ], dsDescription: [ { - dsDescriptionValue: 'This is the description of our new dataset', - }, + dsDescriptionValue: 'This is the description of our new dataset' + } ], - subject: 'Earth and Environmental Sciences', + subject: 'Earth and Environmental Sciences' /* Rest of field values... */ - - }, - }, - ], -}; + } + } + ] +} createDataset.execute(newDatasetDTO).then((newDatasetIds: CreatedDatasetIdentifiers) => { /* ... */ -}); +}) /* ... */ ``` @@ -317,16 +316,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -339,23 +338,23 @@ The optional `datasetVersionId` parameter can correspond to a numeric version id #### Get a File and its Dataset -Returns a tuple of [File](../src/files/domain/models/File.ts) and [Dataset](../src/datasets/domain/models/Dataset.ts) objects (`[File, Dataset]`), given the search parameters to identify the file. +Returns a tuple of [File](../src/files/domain/models/File.ts) and [Dataset](../src/datasets/domain/models/Dataset.ts) objects (`[File, Dataset]`), given the search parameters to identify the file. The returned dataset object corresponds to the dataset version associated with the requested file. ##### Example call: ```typescript -import { getFileAndDataset } from '@iqss/dataverse-client-javascript'; +import { getFileAndDataset } from '@iqss/dataverse-client-javascript' /* ... */ -const fileId = 2; -const datasetVersionId = '1.0'; +const fileId = 2 +const datasetVersionId = '1.0' getFileAndDataset.execute(fileId, datasetVersionId).then((fileAndDataset: [File, Dataset]) => { /* ... */ -}); +}) /* ... */ ``` @@ -373,16 +372,16 @@ Returns the File citation text. ##### Example call: ```typescript -import { getFileCitation } from '@iqss/dataverse-client-javascript'; +import { getFileCitation } from '@iqss/dataverse-client-javascript' /* ... */ -const fileId = 3; -const datasetVersionId = '1.0'; +const fileId = 3 +const datasetVersionId = '1.0' getFileCitation.execute(fileId, datasetVersionId).then((citationText: string) => { /* ... */ -}); +}) /* ... */ ``` @@ -405,16 +404,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -430,22 +429,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) => { /* ... */ - }); + }) /* ... */ ``` @@ -457,15 +456,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[]) => { /* ... */ -}); +}) /* ... */ ``` @@ -481,15 +480,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -505,16 +504,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -536,23 +535,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) => { /* ... */ - }); + }) /* ... */ ``` @@ -570,15 +569,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -594,16 +593,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -623,25 +622,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) => { /* ... */ - }); + }) /* ... */ ``` @@ -657,15 +664,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -683,13 +690,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -705,13 +712,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) => { /* ... */ -}); +}) /* ... */ ``` @@ -727,13 +734,13 @@ that can be returned, please refer to the `MaxEmbargoDurationInMonths` property ##### Example call: ```typescript -import { getMaxEmbargoDurationInMonths } from '@iqss/dataverse-client-javascript'; +import { getMaxEmbargoDurationInMonths } from '@iqss/dataverse-client-javascript' /* ... */ getMaxEmbargoDurationInMonths.execute().then((months: number) => { /* ... */ -}); +}) /* ... */ ``` @@ -747,13 +754,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.js deleted file mode 100644 index 8c380e1c..00000000 --- a/jest.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - roots: ['/test'], - transform: { - '^.+\\.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, -}; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 00000000..37971368 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,23 @@ +import type { Config } from 'jest' + +const config: Config = { + roots: ['/test'], + transform: { + '^.+\\.ts$': 'ts-jest' + }, + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.ts$', + moduleFileExtensions: ['ts', 'js', 'json', 'node'], + coveragePathIgnorePatterns: ['node_modules', 'testHelpers'], + globalSetup: '/test/integration/environment/setup.ts', + testTimeout: 25000, + coverageThreshold: { + global: { + branches: 95, + functions: 95, + lines: 95, + statements: 95 + } + } +} + +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..a5ebb7fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,19 +16,22 @@ "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.54.0", - "@typescript-eslint/parser": "^5.52.0", - "chai": "^4.3.7", - "eslint": "^8.35.0", - "eslint-plugin-jest": "^27.2.1", + "@types/jest": "^29.5.12", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", + "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", + "pre-commit": "1.2.2", + "prettier": "2.8.4", "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 +645,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 +682,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 +705,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", @@ -1230,30 +1237,28 @@ "@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/@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/@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/@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/@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==", + "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": { @@ -1306,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", @@ -1366,9 +1365,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1381,6 +1380,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", @@ -1407,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", @@ -1467,19 +1457,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 +1490,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 +1617,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 +1709,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 +1735,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 +1849,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 +1876,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 +1902,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 +1919,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 +1939,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,21 +2103,120 @@ "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-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "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", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { "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", @@ -1854,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", @@ -1880,6 +2243,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 +2531,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", @@ -2194,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", @@ -2237,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", @@ -2353,6 +2719,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", @@ -2405,6 +2822,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", @@ -2442,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", @@ -2469,6 +2880,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", @@ -2486,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", @@ -2628,6 +3062,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 +3183,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 +3198,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 +3223,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 +3238,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 +3379,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 +3452,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 +3541,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 +3684,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 +3814,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 +3863,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", @@ -3132,13 +3916,23 @@ "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==", + "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": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-package-type": { @@ -3174,6 +3968,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 +4017,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 +4031,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 +4066,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,13 +4102,85 @@ "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", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=8" + "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": { @@ -3378,19 +4287,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": { - "has": "^1.0.3" + "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-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3435,6 +4429,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 +4450,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 +4474,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,11 +4514,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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/isexe": { "version": "2.0.0", @@ -4180,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", @@ -4304,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", @@ -4334,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", @@ -4462,6 +5541,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", @@ -4505,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", @@ -4580,6 +5646,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", @@ -4621,6 +5740,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", @@ -4723,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", @@ -4741,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", @@ -4823,24 +5933,96 @@ "p-try": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "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/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "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": { - "p-limit": "^2.2.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=8" + "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", @@ -4851,9 +6033,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 +6047,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", @@ -4927,6 +6121,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", @@ -4938,9 +6138,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 +6232,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 +6271,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 +6374,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 +6418,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 +6456,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,30 +6508,30 @@ "node": ">=8" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "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==", + "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": { - "@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" + "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": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "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", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -5265,6 +6566,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", @@ -5372,6 +6684,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 +6957,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 +7110,77 @@ "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/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", @@ -5680,6 +7193,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 +7253,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 +7319,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 +7450,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 a6d962d6..4c2835de 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,26 @@ ], "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", + "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 .", + "lint:prettier": "prettier --check '**/*.(yml|json|md)'", + "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:coverage:check" + ], "repository": { "type": "git", "url": "git+https://github.com/IQSS/dataverse-client-javascript.git" @@ -31,19 +43,22 @@ }, "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.54.0", - "@typescript-eslint/parser": "^5.52.0", - "chai": "^4.3.7", - "eslint": "^8.35.0", - "eslint-plugin-jest": "^27.2.1", + "@types/jest": "^29.5.12", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", + "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", + "pre-commit": "1.2.2", + "prettier": "2.8.4", "testcontainers": "^9.9.1", - "ts-jest": "^29.0.5" + "ts-jest": "^29.0.5", + "ts-node": "^10.9.2" }, "dependencies": { "@types/node": "^18.15.11", 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/models/DvObjectOwnerNode.ts b/src/core/domain/models/DvObjectOwnerNode.ts index d1770e89..89a893ce 100644 --- a/src/core/domain/models/DvObjectOwnerNode.ts +++ b/src/core/domain/models/DvObjectOwnerNode.ts @@ -1,14 +1,14 @@ export interface DvObjectOwnerNode { - type: DvObjectType; - displayName: string; - identifier: string; - persistentIdentifier?: string; - version?: string; - isPartOf?: DvObjectOwnerNode; + type: DvObjectType + displayName: string + identifier: string + persistentIdentifier?: string + version?: string + isPartOf?: DvObjectOwnerNode } export enum DvObjectType { DATAVERSE = 'DATAVERSE', DATASET = 'DATASET', - FILE = 'FILE', + FILE = 'FILE' } 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/domain/useCases/validators/NewResourceValidator.ts b/src/core/domain/useCases/validators/NewResourceValidator.ts index 2abb70ae..e6fd5e83 100644 --- a/src/core/domain/useCases/validators/NewResourceValidator.ts +++ b/src/core/domain/useCases/validators/NewResourceValidator.ts @@ -1,6 +1,4 @@ -import { ResourceValidationError } from './errors/ResourceValidationError'; - export interface NewResourceValidator { // eslint-disable-next-line @typescript-eslint/no-explicit-any - validate(...args: any[]): Promise; + validate(...args: any[]): void } diff --git a/src/core/domain/useCases/validators/errors/ResourceValidationError.ts b/src/core/domain/useCases/validators/errors/ResourceValidationError.ts index 4d4f7cbb..bdf64f5d 100644 --- a/src/core/domain/useCases/validators/errors/ResourceValidationError.ts +++ b/src/core/domain/useCases/validators/errors/ResourceValidationError.ts @@ -1,5 +1,5 @@ export class ResourceValidationError extends Error { constructor(message: string) { - super(message); + super(message) } } diff --git a/src/core/index.ts b/src/core/index.ts index 054d9644..369532c0 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,4 +1,4 @@ -export { ReadError } from './domain/repositories/ReadError'; -export { WriteError } from './domain/repositories/WriteError'; -export { ApiConfig } from './infra/repositories/ApiConfig'; -export { DvObjectOwnerNode, DvObjectType } from './domain/models/DvObjectOwnerNode'; +export { ReadError } from './domain/repositories/ReadError' +export { WriteError } from './domain/repositories/WriteError' +export { ApiConfig } from './infra/repositories/ApiConfig' +export { DvObjectOwnerNode, DvObjectType } from './domain/models/DvObjectOwnerNode' 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 f0eafbb9..6168ce97 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,18 +73,18 @@ 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: if (typeof ApiConfig.dataverseApiKey !== 'undefined') { - requestConfig.headers['X-Dataverse-Key'] = ApiConfig.dataverseApiKey; + requestConfig.headers['X-Dataverse-Key'] = ApiConfig.dataverseApiKey } - break; + break } - return requestConfig; + return requestConfig } private buildRequestUrl(apiEndpoint: string): string { - return `${ApiConfig.dataverseApiUrl}${apiEndpoint}`; + return `${ApiConfig.dataverseApiUrl}${apiEndpoint}` } } diff --git a/src/core/infra/repositories/transformers/OwnerNodePayload.ts b/src/core/infra/repositories/transformers/OwnerNodePayload.ts index 28469223..4828a3f1 100644 --- a/src/core/infra/repositories/transformers/OwnerNodePayload.ts +++ b/src/core/infra/repositories/transformers/OwnerNodePayload.ts @@ -1,8 +1,8 @@ export interface OwnerNodePayload { - type: string; - displayName: string; - identifier: string; - persistentIdentifier?: string; - version?: string; - isPartOf?: OwnerNodePayload; + type: string + displayName: string + identifier: string + persistentIdentifier?: string + version?: string + isPartOf?: OwnerNodePayload } diff --git a/src/core/infra/repositories/transformers/dvObjectOwnerNodeTransformer.ts b/src/core/infra/repositories/transformers/dvObjectOwnerNodeTransformer.ts index 3c94c7a4..2bb9da10 100644 --- a/src/core/infra/repositories/transformers/dvObjectOwnerNodeTransformer.ts +++ b/src/core/infra/repositories/transformers/dvObjectOwnerNodeTransformer.ts @@ -1,15 +1,19 @@ -import { OwnerNodePayload } from './OwnerNodePayload'; -import { DvObjectOwnerNode, DvObjectType } from '../../../domain/models/DvObjectOwnerNode'; +import { OwnerNodePayload } from './OwnerNodePayload' +import { DvObjectOwnerNode, DvObjectType } from '../../../domain/models/DvObjectOwnerNode' -export const transformPayloadToOwnerNode = (ownerNodePayload: OwnerNodePayload): DvObjectOwnerNode => { +export const transformPayloadToOwnerNode = ( + ownerNodePayload: OwnerNodePayload +): DvObjectOwnerNode => { return { type: ownerNodePayload.type as DvObjectType, displayName: ownerNodePayload.displayName, identifier: ownerNodePayload.identifier, ...(ownerNodePayload.persistentIdentifier && { - persistentIdentifier: ownerNodePayload.persistentIdentifier, + persistentIdentifier: ownerNodePayload.persistentIdentifier }), ...(ownerNodePayload.version && { version: ownerNodePayload.version }), - ...(ownerNodePayload.isPartOf && { isPartOf: transformPayloadToOwnerNode(ownerNodePayload.isPartOf) }), - }; -}; + ...(ownerNodePayload.isPartOf && { + isPartOf: transformPayloadToOwnerNode(ownerNodePayload.isPartOf) + }) + } +} diff --git a/src/datasets/domain/dtos/NewDatasetDTO.ts b/src/datasets/domain/dtos/NewDatasetDTO.ts index 5d6cdaff..31f4d165 100644 --- a/src/datasets/domain/dtos/NewDatasetDTO.ts +++ b/src/datasets/domain/dtos/NewDatasetDTO.ts @@ -1,21 +1,21 @@ -import { DatasetLicense } from '../models/Dataset'; +import { DatasetLicense } from '../models/Dataset' export interface NewDatasetDTO { - license?: DatasetLicense; - metadataBlockValues: NewDatasetMetadataBlockValuesDTO[]; + license?: DatasetLicense + metadataBlockValues: NewDatasetMetadataBlockValuesDTO[] } export interface NewDatasetMetadataBlockValuesDTO { - name: string; - fields: NewDatasetMetadataFieldsDTO; + name: string + fields: NewDatasetMetadataFieldsDTO } -export type NewDatasetMetadataFieldsDTO = Record; +export type NewDatasetMetadataFieldsDTO = Record export type NewDatasetMetadataFieldValueDTO = | string | string[] | NewDatasetMetadataChildFieldValueDTO - | NewDatasetMetadataChildFieldValueDTO[]; + | NewDatasetMetadataChildFieldValueDTO[] -export type NewDatasetMetadataChildFieldValueDTO = Record; +export type NewDatasetMetadataChildFieldValueDTO = Record diff --git a/src/datasets/domain/models/CreatedDatasetIdentifiers.ts b/src/datasets/domain/models/CreatedDatasetIdentifiers.ts index c4dc825a..e4dfa412 100644 --- a/src/datasets/domain/models/CreatedDatasetIdentifiers.ts +++ b/src/datasets/domain/models/CreatedDatasetIdentifiers.ts @@ -1,4 +1,4 @@ export interface CreatedDatasetIdentifiers { - persistentId: string; - numericId: number; + persistentId: string + numericId: number } diff --git a/src/datasets/domain/models/Dataset.ts b/src/datasets/domain/models/Dataset.ts index 8ae3fe90..75046d2d 100644 --- a/src/datasets/domain/models/Dataset.ts +++ b/src/datasets/domain/models/Dataset.ts @@ -1,185 +1,185 @@ -import { DvObjectOwnerNode } from '../../../core/domain/models/DvObjectOwnerNode'; +import { DvObjectOwnerNode } from '../../../core/domain/models/DvObjectOwnerNode' export interface Dataset { - id: number; - persistentId: string; - versionId: number; - versionInfo: DatasetVersionInfo; - license?: DatasetLicense; - alternativePersistentId?: string; - publicationDate?: string; - citationDate?: string; - metadataBlocks: DatasetMetadataBlocks; - isPartOf: DvObjectOwnerNode; + id: number + persistentId: string + versionId: number + versionInfo: DatasetVersionInfo + license?: DatasetLicense + alternativePersistentId?: string + publicationDate?: string + citationDate?: string + metadataBlocks: DatasetMetadataBlocks + isPartOf: DvObjectOwnerNode } 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 00f46a25..d3bfb4b3 100644 --- a/src/datasets/domain/models/DatasetNotNumberedVersion.ts +++ b/src/datasets/domain/models/DatasetNotNumberedVersion.ts @@ -1,5 +1,5 @@ export enum DatasetNotNumberedVersion { DRAFT = ':draft', LATEST = ':latest', - LATEST_PUBLISHED = ':latest-published', + LATEST_PUBLISHED = ':latest-published' } 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 4aed91b3..5337263d 100644 --- a/src/datasets/domain/repositories/IDatasetsRepository.ts +++ b/src/datasets/domain/repositories/IDatasetsRepository.ts @@ -1,23 +1,35 @@ -import { Dataset } from '../models/Dataset'; -import { DatasetUserPermissions } from '../models/DatasetUserPermissions'; -import { DatasetLock } from '../models/DatasetLock'; -import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset'; -import { NewDatasetDTO } from '../dtos/NewDatasetDTO'; -import { MetadataBlock } from '../../../metadataBlocks'; -import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers'; +import { Dataset } from '../models/Dataset' +import { DatasetUserPermissions } from '../models/DatasetUserPermissions' +import { DatasetLock } from '../models/DatasetLock' +import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset' +import { NewDatasetDTO } from '../dtos/NewDatasetDTO' +import { MetadataBlock } from '../../../metadataBlocks' +import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers' 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, collectionId?: string): 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, + collectionId?: string + ): Promise createDataset( newDataset: NewDatasetDTO, datasetMetadataBlocks: MetadataBlock[], - collectionId: string, - ): Promise; + collectionId: string + ): Promise } diff --git a/src/datasets/domain/useCases/CreateDataset.ts b/src/datasets/domain/useCases/CreateDataset.ts index 04da2fed..aae563e1 100644 --- a/src/datasets/domain/useCases/CreateDataset.ts +++ b/src/datasets/domain/useCases/CreateDataset.ts @@ -1,24 +1,24 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IDatasetsRepository } from '../repositories/IDatasetsRepository'; -import { NewDatasetDTO, NewDatasetMetadataBlockValuesDTO } from '../dtos/NewDatasetDTO'; -import { NewResourceValidator } from '../../../core/domain/useCases/validators/NewResourceValidator'; -import { IMetadataBlocksRepository } from '../../../metadataBlocks/domain/repositories/IMetadataBlocksRepository'; -import { MetadataBlock } from '../../../metadataBlocks'; -import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { NewDatasetDTO, NewDatasetMetadataBlockValuesDTO } from '../dtos/NewDatasetDTO' +import { NewResourceValidator } from '../../../core/domain/useCases/validators/NewResourceValidator' +import { IMetadataBlocksRepository } from '../../../metadataBlocks/domain/repositories/IMetadataBlocksRepository' +import { MetadataBlock } from '../../../metadataBlocks' +import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers' export class CreateDataset implements UseCase { - private datasetsRepository: IDatasetsRepository; - private metadataBlocksRepository: IMetadataBlocksRepository; - private newDatasetValidator: NewResourceValidator; + private datasetsRepository: IDatasetsRepository + private metadataBlocksRepository: IMetadataBlocksRepository + private newDatasetValidator: NewResourceValidator constructor( datasetsRepository: IDatasetsRepository, metadataBlocksRepository: IMetadataBlocksRepository, - newDatasetValidator: NewResourceValidator, + newDatasetValidator: NewResourceValidator ) { - this.datasetsRepository = datasetsRepository; - this.metadataBlocksRepository = metadataBlocksRepository; - this.newDatasetValidator = newDatasetValidator; + this.datasetsRepository = datasetsRepository + this.metadataBlocksRepository = metadataBlocksRepository + this.newDatasetValidator = newDatasetValidator } /** @@ -31,19 +31,28 @@ export class CreateDataset implements UseCase { * @throws {ReadError} - If there are errors while reading data. * @throws {WriteError} - If there are errors while writing data. */ - async execute(newDataset: NewDatasetDTO, collectionId = 'root'): Promise { - const metadataBlocks = await this.getNewDatasetMetadataBlocks(newDataset); - this.newDatasetValidator.validate(newDataset, metadataBlocks); - return this.datasetsRepository.createDataset(newDataset, metadataBlocks, collectionId); + async execute( + newDataset: NewDatasetDTO, + collectionId = 'root' + ): Promise { + const metadataBlocks = await this.getNewDatasetMetadataBlocks(newDataset) + + this.newDatasetValidator.validate(newDataset, metadataBlocks) + + return this.datasetsRepository.createDataset(newDataset, metadataBlocks, collectionId) } async getNewDatasetMetadataBlocks(newDataset: NewDatasetDTO): Promise { - const metadataBlocks: MetadataBlock[] = []; + const metadataBlocks: MetadataBlock[] = [] await Promise.all( - newDataset.metadataBlockValues.map(async (metadataBlockValue: NewDatasetMetadataBlockValuesDTO) => { - metadataBlocks.push(await this.metadataBlocksRepository.getMetadataBlockByName(metadataBlockValue.name)); - }), - ); - return metadataBlocks; + newDataset.metadataBlockValues.map( + async (metadataBlockValue: NewDatasetMetadataBlockValuesDTO) => { + metadataBlocks.push( + await this.metadataBlocksRepository.getMetadataBlockByName(metadataBlockValue.name) + ) + } + ) + ) + return metadataBlocks } } diff --git a/src/datasets/domain/useCases/GetAllDatasetPreviews.ts b/src/datasets/domain/useCases/GetAllDatasetPreviews.ts index 5522553e..f8d41bd5 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,7 +17,11 @@ export class GetAllDatasetPreviews implements UseCase { * @param {string} [collectionId] - Collection id (optional). * @returns {Promise} */ - async execute(limit?: number, offset?: number, collectionId?: string): Promise { - return await this.datasetsRepository.getAllDatasetPreviews(limit, offset, collectionId); + async execute( + limit?: number, + offset?: number, + collectionId?: string + ): Promise { + return await this.datasetsRepository.getAllDatasetPreviews(limit, offset, collectionId) } } 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 11dbb089..aaa13e65 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/domain/useCases/validators/BaseMetadataFieldValidator.ts b/src/datasets/domain/useCases/validators/BaseMetadataFieldValidator.ts index 717f2b4c..f7d8a45b 100644 --- a/src/datasets/domain/useCases/validators/BaseMetadataFieldValidator.ts +++ b/src/datasets/domain/useCases/validators/BaseMetadataFieldValidator.ts @@ -1,29 +1,29 @@ -import { NewDatasetMetadataFieldValueDTO } from '../../dtos/NewDatasetDTO'; -import { FieldValidationError } from './errors/FieldValidationError'; -import { MetadataFieldInfo } from '../../../../metadataBlocks'; +import { NewDatasetMetadataFieldValueDTO } from '../../dtos/NewDatasetDTO' +import { FieldValidationError } from './errors/FieldValidationError' +import { MetadataFieldInfo } from '../../../../metadataBlocks' export interface NewDatasetMetadataFieldAndValueInfo { - metadataFieldInfo: MetadataFieldInfo; - metadataFieldKey: string; - metadataFieldValue: NewDatasetMetadataFieldValueDTO; - metadataBlockName: string; - metadataParentFieldKey?: string; - metadataFieldPosition?: number; + metadataFieldInfo: MetadataFieldInfo + metadataFieldKey: string + metadataFieldValue: NewDatasetMetadataFieldValueDTO + metadataBlockName: string + metadataParentFieldKey?: string + metadataFieldPosition?: number } export abstract class BaseMetadataFieldValidator { - abstract validate(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo): void; + abstract validate(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo): void protected createGeneralValidationError( newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo, - reason: string, + reason: string ): FieldValidationError { return new FieldValidationError( newDatasetMetadataFieldAndValueInfo.metadataFieldKey, newDatasetMetadataFieldAndValueInfo.metadataBlockName, newDatasetMetadataFieldAndValueInfo.metadataParentFieldKey, newDatasetMetadataFieldAndValueInfo.metadataFieldPosition, - reason, - ); + reason + ) } } diff --git a/src/datasets/domain/useCases/validators/MetadataFieldValidator.ts b/src/datasets/domain/useCases/validators/MetadataFieldValidator.ts index 35111901..995fb54e 100644 --- a/src/datasets/domain/useCases/validators/MetadataFieldValidator.ts +++ b/src/datasets/domain/useCases/validators/MetadataFieldValidator.ts @@ -1,23 +1,25 @@ -import { BaseMetadataFieldValidator, NewDatasetMetadataFieldAndValueInfo } from './BaseMetadataFieldValidator'; -import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator'; -import { SingleMetadataFieldValidator } from './SingleMetadataFieldValidator'; -import { EmptyFieldError } from './errors/EmptyFieldError'; -import { NewDatasetMetadataFieldValueDTO } from '../../dtos/NewDatasetDTO'; +import { + BaseMetadataFieldValidator, + NewDatasetMetadataFieldAndValueInfo +} from './BaseMetadataFieldValidator' +import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator' +import { SingleMetadataFieldValidator } from './SingleMetadataFieldValidator' +import { EmptyFieldError } from './errors/EmptyFieldError' +import { NewDatasetMetadataFieldValueDTO } from '../../dtos/NewDatasetDTO' export class MetadataFieldValidator extends BaseMetadataFieldValidator { constructor( private singleMetadataFieldValidator: SingleMetadataFieldValidator, - private multipleMetadataFieldValidator: MultipleMetadataFieldValidator, + private multipleMetadataFieldValidator: MultipleMetadataFieldValidator ) { - super(); + super() } validate(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo): void { - const metadataFieldValue = newDatasetMetadataFieldAndValueInfo.metadataFieldValue; - const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo; + const metadataFieldValue = newDatasetMetadataFieldAndValueInfo.metadataFieldValue + const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo if ( metadataFieldValue == undefined || - metadataFieldValue == null || this.isEmptyString(metadataFieldValue) || this.isEmptyArray(metadataFieldValue) ) { @@ -26,26 +28,27 @@ export class MetadataFieldValidator extends BaseMetadataFieldValidator { newDatasetMetadataFieldAndValueInfo.metadataFieldKey, newDatasetMetadataFieldAndValueInfo.metadataBlockName, newDatasetMetadataFieldAndValueInfo.metadataParentFieldKey, - newDatasetMetadataFieldAndValueInfo.metadataFieldPosition, - ); + newDatasetMetadataFieldAndValueInfo.metadataFieldPosition + ) } else { - return; + return } } if (newDatasetMetadataFieldAndValueInfo.metadataFieldInfo.multiple) { - this.multipleMetadataFieldValidator.validate(newDatasetMetadataFieldAndValueInfo); + this.multipleMetadataFieldValidator.validate(newDatasetMetadataFieldAndValueInfo) } else { - this.singleMetadataFieldValidator.validate(newDatasetMetadataFieldAndValueInfo); + this.singleMetadataFieldValidator.validate(newDatasetMetadataFieldAndValueInfo) } } private isEmptyString(metadataFieldValue: NewDatasetMetadataFieldValueDTO): boolean { - return typeof metadataFieldValue == 'string' && metadataFieldValue.trim() === ''; + return typeof metadataFieldValue == 'string' && metadataFieldValue.trim() === '' } private isEmptyArray(metadataFieldValue: NewDatasetMetadataFieldValueDTO): boolean { return ( - Array.isArray(metadataFieldValue) && (metadataFieldValue as Array).length == 0 - ); + Array.isArray(metadataFieldValue) && + (metadataFieldValue as Array).length == 0 + ) } } diff --git a/src/datasets/domain/useCases/validators/MultipleMetadataFieldValidator.ts b/src/datasets/domain/useCases/validators/MultipleMetadataFieldValidator.ts index ae0be7fa..cfde2893 100644 --- a/src/datasets/domain/useCases/validators/MultipleMetadataFieldValidator.ts +++ b/src/datasets/domain/useCases/validators/MultipleMetadataFieldValidator.ts @@ -1,39 +1,48 @@ -import { BaseMetadataFieldValidator, NewDatasetMetadataFieldAndValueInfo } from './BaseMetadataFieldValidator'; -import { NewDatasetMetadataFieldValueDTO } from '../../dtos/NewDatasetDTO'; -import { SingleMetadataFieldValidator } from './SingleMetadataFieldValidator'; +import { + BaseMetadataFieldValidator, + NewDatasetMetadataFieldAndValueInfo +} from './BaseMetadataFieldValidator' +import { NewDatasetMetadataFieldValueDTO } from '../../dtos/NewDatasetDTO' +import { SingleMetadataFieldValidator } from './SingleMetadataFieldValidator' export class MultipleMetadataFieldValidator extends BaseMetadataFieldValidator { constructor(private singleMetadataFieldValidator: SingleMetadataFieldValidator) { - super(); + super() } validate(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo): void { - const metadataFieldValue = newDatasetMetadataFieldAndValueInfo.metadataFieldValue; - const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo; + const metadataFieldValue = newDatasetMetadataFieldAndValueInfo.metadataFieldValue + const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo if (!Array.isArray(metadataFieldValue)) { - throw this.createGeneralValidationError(newDatasetMetadataFieldAndValueInfo, 'Expecting an array of values.'); + throw this.createGeneralValidationError( + newDatasetMetadataFieldAndValueInfo, + 'Expecting an array of values.' + ) } if (this.isValidArrayType(metadataFieldValue, 'string') && metadataFieldInfo.type === 'NONE') { throw this.createGeneralValidationError( newDatasetMetadataFieldAndValueInfo, - 'Expecting an array of child fields, not strings.', - ); - } else if (this.isValidArrayType(metadataFieldValue, 'object') && metadataFieldInfo.type !== 'NONE') { + 'Expecting an array of child fields, not strings.' + ) + } else if ( + this.isValidArrayType(metadataFieldValue, 'object') && + metadataFieldInfo.type !== 'NONE' + ) { throw this.createGeneralValidationError( newDatasetMetadataFieldAndValueInfo, - 'Expecting an array of strings, not child fields.', - ); + 'Expecting an array of strings, not child fields.' + ) } else if ( !this.isValidArrayType(metadataFieldValue, 'object') && !this.isValidArrayType(metadataFieldValue, 'string') ) { throw this.createGeneralValidationError( newDatasetMetadataFieldAndValueInfo, - 'The provided array of values is not valid.', - ); + 'The provided array of values is not valid.' + ) } - const fieldValues = metadataFieldValue as NewDatasetMetadataFieldValueDTO[]; + const fieldValues = metadataFieldValue as NewDatasetMetadataFieldValueDTO[] fieldValues.forEach((value, metadataFieldPosition) => { this.singleMetadataFieldValidator.validate({ metadataFieldInfo: metadataFieldInfo, @@ -41,15 +50,17 @@ export class MultipleMetadataFieldValidator extends BaseMetadataFieldValidator { metadataFieldValue: value, metadataBlockName: newDatasetMetadataFieldAndValueInfo.metadataBlockName, metadataParentFieldKey: newDatasetMetadataFieldAndValueInfo.metadataFieldKey, - metadataFieldPosition: metadataFieldPosition, - }); - }); + metadataFieldPosition: metadataFieldPosition + }) + }) } private isValidArrayType( metadataFieldValue: Array, - expectedType: 'string' | 'object', + expectedType: 'string' | 'object' ): boolean { - return metadataFieldValue.every((item: string | NewDatasetMetadataFieldValueDTO) => typeof item === expectedType); + return metadataFieldValue.every( + (item: string | NewDatasetMetadataFieldValueDTO) => typeof item === expectedType + ) } } diff --git a/src/datasets/domain/useCases/validators/NewDatasetResourceValidator.ts b/src/datasets/domain/useCases/validators/NewDatasetResourceValidator.ts index bb07efe6..658bc1f2 100644 --- a/src/datasets/domain/useCases/validators/NewDatasetResourceValidator.ts +++ b/src/datasets/domain/useCases/validators/NewDatasetResourceValidator.ts @@ -1,33 +1,32 @@ -import { NewDatasetDTO, NewDatasetMetadataBlockValuesDTO } from '../../dtos/NewDatasetDTO'; -import { NewResourceValidator } from '../../../../core/domain/useCases/validators/NewResourceValidator'; -import { MetadataBlock } from '../../../../metadataBlocks'; -import { ResourceValidationError } from '../../../../core/domain/useCases/validators/errors/ResourceValidationError'; -import { BaseMetadataFieldValidator } from './BaseMetadataFieldValidator'; +import { NewDatasetDTO, NewDatasetMetadataBlockValuesDTO } from '../../dtos/NewDatasetDTO' +import { NewResourceValidator } from '../../../../core/domain/useCases/validators/NewResourceValidator' +import { MetadataBlock } from '../../../../metadataBlocks' +import { BaseMetadataFieldValidator } from './BaseMetadataFieldValidator' export class NewDatasetResourceValidator implements NewResourceValidator { constructor(private metadataFieldValidator: BaseMetadataFieldValidator) {} - async validate(resource: NewDatasetDTO, metadataBlocks: MetadataBlock[]): Promise { + public validate(resource: NewDatasetDTO, metadataBlocks: MetadataBlock[]) { for (const metadataBlockValues of resource.metadataBlockValues) { - await this.validateMetadataBlock(metadataBlockValues, metadataBlocks); + this.validateMetadataBlock(metadataBlockValues, metadataBlocks) } } - private async validateMetadataBlock( + private validateMetadataBlock( metadataBlockValues: NewDatasetMetadataBlockValuesDTO, - metadataBlocks: MetadataBlock[], + metadataBlocks: MetadataBlock[] ) { - const metadataBlockName = metadataBlockValues.name; + const metadataBlockName = metadataBlockValues.name const metadataBlock: MetadataBlock = metadataBlocks.find( - (metadataBlock) => metadataBlock.name === metadataBlockName, - ); + (metadataBlock) => metadataBlock.name === metadataBlockName + ) for (const metadataFieldKey of Object.keys(metadataBlock.metadataFields)) { this.metadataFieldValidator.validate({ metadataFieldInfo: metadataBlock.metadataFields[metadataFieldKey], metadataFieldKey: metadataFieldKey, metadataFieldValue: metadataBlockValues.fields[metadataFieldKey], - metadataBlockName: metadataBlockName, - }); + metadataBlockName: metadataBlockName + }) } } } diff --git a/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts b/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts index e338457c..32b065d6 100644 --- a/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts +++ b/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts @@ -1,85 +1,97 @@ -import { BaseMetadataFieldValidator, NewDatasetMetadataFieldAndValueInfo } from './BaseMetadataFieldValidator'; -import { ControlledVocabularyFieldError } from './errors/ControlledVocabularyFieldError'; -import { DateFormatFieldError } from './errors/DateFormatFieldError'; -import { MetadataFieldValidator } from './MetadataFieldValidator'; -import { NewDatasetMetadataChildFieldValueDTO } from '../../dtos/NewDatasetDTO'; -import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator'; +import { + BaseMetadataFieldValidator, + NewDatasetMetadataFieldAndValueInfo +} from './BaseMetadataFieldValidator' +import { ControlledVocabularyFieldError } from './errors/ControlledVocabularyFieldError' +import { DateFormatFieldError } from './errors/DateFormatFieldError' +import { MetadataFieldValidator } from './MetadataFieldValidator' +import { NewDatasetMetadataChildFieldValueDTO } from '../../dtos/NewDatasetDTO' +import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator' export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { validate(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo): void { - const metadataFieldValue = newDatasetMetadataFieldAndValueInfo.metadataFieldValue; - const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo; + const metadataFieldValue = newDatasetMetadataFieldAndValueInfo.metadataFieldValue + const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo if (Array.isArray(metadataFieldValue)) { throw this.createGeneralValidationError( newDatasetMetadataFieldAndValueInfo, - 'Expecting a single field, not an array.', - ); + 'Expecting a single field, not an array.' + ) } if (typeof metadataFieldValue === 'object' && metadataFieldInfo.type !== 'NONE') { throw this.createGeneralValidationError( newDatasetMetadataFieldAndValueInfo, - 'Expecting a string, not child fields.', - ); + 'Expecting a string, not child fields.' + ) } if (typeof metadataFieldValue === 'string' && metadataFieldInfo.type === 'NONE') { throw this.createGeneralValidationError( newDatasetMetadataFieldAndValueInfo, - 'Expecting child fields, not a string.', - ); + 'Expecting child fields, not a string.' + ) } - this.validateFieldValue(newDatasetMetadataFieldAndValueInfo); + this.validateFieldValue(newDatasetMetadataFieldAndValueInfo) } - private validateFieldValue(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo) { - const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo; + private validateFieldValue( + newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo + ) { + const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo if (metadataFieldInfo.isControlledVocabulary) { - this.validateControlledVocabularyFieldValue(newDatasetMetadataFieldAndValueInfo); + this.validateControlledVocabularyFieldValue(newDatasetMetadataFieldAndValueInfo) } if (metadataFieldInfo.type == 'DATE') { - this.validateDateFieldValue(newDatasetMetadataFieldAndValueInfo); + this.validateDateFieldValue(newDatasetMetadataFieldAndValueInfo) } if (metadataFieldInfo.childMetadataFields != undefined) { - this.validateChildMetadataFieldValues(newDatasetMetadataFieldAndValueInfo); + this.validateChildMetadataFieldValues(newDatasetMetadataFieldAndValueInfo) } } private validateControlledVocabularyFieldValue( - newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo, + newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo ) { if ( !newDatasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues.includes( - newDatasetMetadataFieldAndValueInfo.metadataFieldValue as string, + newDatasetMetadataFieldAndValueInfo.metadataFieldValue as string ) ) { throw new ControlledVocabularyFieldError( newDatasetMetadataFieldAndValueInfo.metadataFieldKey, newDatasetMetadataFieldAndValueInfo.metadataBlockName, newDatasetMetadataFieldAndValueInfo.metadataParentFieldKey, - newDatasetMetadataFieldAndValueInfo.metadataFieldPosition, - ); + newDatasetMetadataFieldAndValueInfo.metadataFieldPosition + ) } } - private validateDateFieldValue(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo) { - const dateFormatRegex = /^\d{4}-\d{2}-\d{2}$/; + private validateDateFieldValue( + newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo + ) { + const dateFormatRegex = /^\d{4}-\d{2}-\d{2}$/ if (!dateFormatRegex.test(newDatasetMetadataFieldAndValueInfo.metadataFieldValue as string)) { throw new DateFormatFieldError( newDatasetMetadataFieldAndValueInfo.metadataFieldKey, newDatasetMetadataFieldAndValueInfo.metadataBlockName, newDatasetMetadataFieldAndValueInfo.metadataParentFieldKey, - newDatasetMetadataFieldAndValueInfo.metadataFieldPosition, - ); + newDatasetMetadataFieldAndValueInfo.metadataFieldPosition + ) } } - private validateChildMetadataFieldValues(newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo) { - const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo; - const childMetadataFieldKeys = Object.keys(metadataFieldInfo.childMetadataFields); - const metadataFieldValidator = new MetadataFieldValidator(this, new MultipleMetadataFieldValidator(this)); + private validateChildMetadataFieldValues( + newDatasetMetadataFieldAndValueInfo: NewDatasetMetadataFieldAndValueInfo + ) { + const metadataFieldInfo = newDatasetMetadataFieldAndValueInfo.metadataFieldInfo + const childMetadataFieldKeys = Object.keys(metadataFieldInfo.childMetadataFields) + const metadataFieldValidator = new MetadataFieldValidator( + this, + new MultipleMetadataFieldValidator(this) + ) for (const childMetadataFieldKey of childMetadataFieldKeys) { - const childMetadataFieldInfo = metadataFieldInfo.childMetadataFields[childMetadataFieldKey]; + const childMetadataFieldInfo = metadataFieldInfo.childMetadataFields[childMetadataFieldKey] metadataFieldValidator.validate({ metadataFieldInfo: childMetadataFieldInfo, metadataFieldKey: childMetadataFieldKey, @@ -88,8 +100,8 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { )[childMetadataFieldKey], metadataBlockName: newDatasetMetadataFieldAndValueInfo.metadataBlockName, metadataParentFieldKey: newDatasetMetadataFieldAndValueInfo.metadataFieldKey, - metadataFieldPosition: newDatasetMetadataFieldAndValueInfo.metadataFieldPosition, - }); + metadataFieldPosition: newDatasetMetadataFieldAndValueInfo.metadataFieldPosition + }) } } } diff --git a/src/datasets/domain/useCases/validators/errors/ControlledVocabularyFieldError.ts b/src/datasets/domain/useCases/validators/errors/ControlledVocabularyFieldError.ts index b628f53f..181d7521 100644 --- a/src/datasets/domain/useCases/validators/errors/ControlledVocabularyFieldError.ts +++ b/src/datasets/domain/useCases/validators/errors/ControlledVocabularyFieldError.ts @@ -1,18 +1,18 @@ -import { FieldValidationError } from './FieldValidationError'; +import { FieldValidationError } from './FieldValidationError' export class ControlledVocabularyFieldError extends FieldValidationError { constructor( metadataFieldName: string, citationBlockName: string, parentMetadataFieldName?: string, - fieldPosition?: number, + fieldPosition?: number ) { super( metadataFieldName, citationBlockName, parentMetadataFieldName, fieldPosition, - 'The field does not have a valid controlled vocabulary value.', - ); + 'The field does not have a valid controlled vocabulary value.' + ) } } diff --git a/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts b/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts index a6b36fa5..886751dc 100644 --- a/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts +++ b/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts @@ -1,18 +1,18 @@ -import { FieldValidationError } from './FieldValidationError'; +import { FieldValidationError } from './FieldValidationError' export class DateFormatFieldError extends FieldValidationError { constructor( metadataFieldName: string, citationBlockName: string, parentMetadataFieldName?: string, - fieldPosition?: number, + fieldPosition?: number ) { super( metadataFieldName, citationBlockName, parentMetadataFieldName, fieldPosition, - 'The field requires a valid date format (YYYY-MM-DD).', - ); + 'The field requires a valid date format (YYYY-MM-DD).' + ) } } diff --git a/src/datasets/domain/useCases/validators/errors/EmptyFieldError.ts b/src/datasets/domain/useCases/validators/errors/EmptyFieldError.ts index e1ca1d7a..a9e8ea0d 100644 --- a/src/datasets/domain/useCases/validators/errors/EmptyFieldError.ts +++ b/src/datasets/domain/useCases/validators/errors/EmptyFieldError.ts @@ -1,18 +1,18 @@ -import { FieldValidationError } from './FieldValidationError'; +import { FieldValidationError } from './FieldValidationError' export class EmptyFieldError extends FieldValidationError { constructor( metadataFieldName: string, citationBlockName: string, parentMetadataFieldName?: string, - fieldPosition?: number, + fieldPosition?: number ) { super( metadataFieldName, citationBlockName, parentMetadataFieldName, fieldPosition, - 'The field should not be empty.', - ); + 'The field should not be empty.' + ) } } diff --git a/src/datasets/domain/useCases/validators/errors/FieldValidationError.ts b/src/datasets/domain/useCases/validators/errors/FieldValidationError.ts index 2c3c6a2e..1b5f9ea2 100644 --- a/src/datasets/domain/useCases/validators/errors/FieldValidationError.ts +++ b/src/datasets/domain/useCases/validators/errors/FieldValidationError.ts @@ -1,32 +1,32 @@ -import { ResourceValidationError } from '../../../../../core/domain/useCases/validators/errors/ResourceValidationError'; +import { ResourceValidationError } from '../../../../../core/domain/useCases/validators/errors/ResourceValidationError' export class FieldValidationError extends ResourceValidationError { - citationBlockName: string; - metadataFieldName: string; - parentMetadataFieldName?: string; - fieldPosition?: number; + citationBlockName: string + metadataFieldName: string + parentMetadataFieldName?: string + fieldPosition?: number constructor( metadataFieldName: string, citationBlockName: string, parentMetadataFieldName?: string, fieldPosition?: number, - reason?: string, + reason?: string ) { - let message = `There was an error when validating the field ${metadataFieldName} from metadata block ${citationBlockName}`; + let message = `There was an error when validating the field ${metadataFieldName} from metadata block ${citationBlockName}` if (parentMetadataFieldName) { - message += ` with parent field ${parentMetadataFieldName}`; + message += ` with parent field ${parentMetadataFieldName}` } if (fieldPosition) { - message += ` in position ${fieldPosition}`; + message += ` in position ${fieldPosition}` } if (reason) { - message += `. Reason was: ${reason}`; + message += `. Reason was: ${reason}` } - super(message); - this.citationBlockName = citationBlockName; - this.metadataFieldName = metadataFieldName; - this.parentMetadataFieldName = parentMetadataFieldName; - this.fieldPosition = fieldPosition; + super(message) + this.citationBlockName = citationBlockName + this.metadataFieldName = metadataFieldName + this.parentMetadataFieldName = parentMetadataFieldName + this.fieldPosition = fieldPosition } } diff --git a/src/datasets/index.ts b/src/datasets/index.ts index b75784b6..27ffccca 100644 --- a/src/datasets/index.ts +++ b/src/datasets/index.ts @@ -1,39 +1,39 @@ -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 { NewDatasetResourceValidator } from './domain/useCases/validators/NewDatasetResourceValidator'; -import { MetadataBlocksRepository } from '../metadataBlocks/infra/repositories/MetadataBlocksRepository'; -import { CreateDataset } from './domain/useCases/CreateDataset'; -import { MetadataFieldValidator } from './domain/useCases/validators/MetadataFieldValidator'; -import { SingleMetadataFieldValidator } from './domain/useCases/validators/SingleMetadataFieldValidator'; -import { MultipleMetadataFieldValidator } from './domain/useCases/validators/MultipleMetadataFieldValidator'; +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 { NewDatasetResourceValidator } from './domain/useCases/validators/NewDatasetResourceValidator' +import { MetadataBlocksRepository } from '../metadataBlocks/infra/repositories/MetadataBlocksRepository' +import { CreateDataset } from './domain/useCases/CreateDataset' +import { MetadataFieldValidator } from './domain/useCases/validators/MetadataFieldValidator' +import { SingleMetadataFieldValidator } from './domain/useCases/validators/SingleMetadataFieldValidator' +import { MultipleMetadataFieldValidator } from './domain/useCases/validators/MultipleMetadataFieldValidator' -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 singleMetadataFieldValidator = new SingleMetadataFieldValidator(); +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 singleMetadataFieldValidator = new SingleMetadataFieldValidator() const metadataFieldValidator = new MetadataFieldValidator( new SingleMetadataFieldValidator(), - new MultipleMetadataFieldValidator(singleMetadataFieldValidator), -); + new MultipleMetadataFieldValidator(singleMetadataFieldValidator) +) const createDataset = new CreateDataset( datasetsRepository, new MetadataBlocksRepository(), - new NewDatasetResourceValidator(metadataFieldValidator), -); + new NewDatasetResourceValidator(metadataFieldValidator) +) export { getDatasetSummaryFieldNames, @@ -44,11 +44,11 @@ export { getDatasetUserPermissions, getDatasetLocks, getAllDatasetPreviews, - createDataset, -}; -export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'; -export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'; -export { DatasetLock, DatasetLockType } from './domain/models/DatasetLock'; + createDataset +} +export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion' +export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions' +export { DatasetLock, DatasetLockType } from './domain/models/DatasetLock' export { Dataset, DatasetVersionInfo, @@ -58,15 +58,15 @@ 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' export { NewDatasetDTO as NewDataset, NewDatasetMetadataBlockValuesDTO as NewDatasetMetadataBlockValues, NewDatasetMetadataFieldsDTO as NewDatasetMetadataFields, NewDatasetMetadataFieldValueDTO as NewDatasetMetadataFieldValue, - NewDatasetMetadataChildFieldValueDTO as NewDatasetMetadataChildFieldValue, -} from './domain/dtos/NewDatasetDTO'; -export { CreatedDatasetIdentifiers } from './domain/models/CreatedDatasetIdentifiers'; + NewDatasetMetadataChildFieldValueDTO as NewDatasetMetadataChildFieldValue +} from './domain/dtos/NewDatasetDTO' +export { CreatedDatasetIdentifiers } from './domain/models/CreatedDatasetIdentifiers' diff --git a/src/datasets/infra/repositories/DatasetsRepository.ts b/src/datasets/infra/repositories/DatasetsRepository.ts index a930b113..c393493b 100644 --- a/src/datasets/infra/repositories/DatasetsRepository.ts +++ b/src/datasets/infra/repositories/DatasetsRepository.ts @@ -1,49 +1,53 @@ -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 { NewDatasetDTO } from '../../domain/dtos/NewDatasetDTO'; -import { MetadataBlock } from '../../../metadataBlocks'; -import { transformNewDatasetModelToRequestPayload } from './transformers/newDatasetTransformers'; -import { CreatedDatasetIdentifiers } from '../../domain/models/CreatedDatasetIdentifiers'; +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 { NewDatasetDTO } from '../../domain/dtos/NewDatasetDTO' +import { MetadataBlock } from '../../../metadataBlocks' +import { transformNewDatasetModelToRequestPayload } from './transformers/newDatasetTransformers' +import { CreatedDatasetIdentifiers } from '../../domain/models/CreatedDatasetIdentifiers' export interface GetAllDatasetPreviewsQueryParams { - per_page?: number; - start?: number; - subtree?: string; + per_page?: number + start?: number + subtree?: string } 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}`), false, { - returnOwners: true, - }) + return this.doGet( + this.buildApiEndpoint(this.datasetsResourceName, `privateUrlDatasetVersion/${token}`), + false, + { + returnOwners: true + } + ) .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), @@ -51,95 +55,106 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi { includeDeaccessioned: includeDeaccessioned, excludeFiles: true, - returnOwners: true, - }, + returnOwners: true + } ) .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, - collectionId?: string, + collectionId?: string ): Promise { - const queryParams: GetAllDatasetPreviewsQueryParams = {}; + const queryParams: GetAllDatasetPreviewsQueryParams = {} if (limit !== undefined) { - queryParams.per_page = limit; + queryParams.per_page = limit } if (offset !== undefined) { - queryParams.start = offset; + queryParams.start = offset } if (collectionId !== undefined) { - queryParams.subtree = collectionId; + queryParams.subtree = collectionId } return this.doGet('/search?q=*&type=dataset&sort=date&order=desc', true, queryParams) .then((response) => transformDatasetPreviewsResponseToDatasetPreviewSubset(response)) .catch((error) => { - throw error; - }); + throw error + }) } public async createDataset( newDataset: NewDatasetDTO, datasetMetadataBlocks: MetadataBlock[], - collectionId: string, + collectionId: string ): Promise { return this.doPost( `/dataverses/${collectionId}/datasets`, - transformNewDatasetModelToRequestPayload(newDataset, datasetMetadataBlocks), + transformNewDatasetModelToRequestPayload(newDataset, datasetMetadataBlocks) ) .then((response) => { - const responseData = response.data.data; + const responseData = response.data.data return { persistentId: responseData.persistentId, - numericId: responseData.id, - }; + numericId: responseData.id + } }) .catch((error) => { - throw error; - }); + throw error + }) } } diff --git a/src/datasets/infra/repositories/transformers/DatasetPayload.ts b/src/datasets/infra/repositories/transformers/DatasetPayload.ts index a343334e..4f7b3ec2 100644 --- a/src/datasets/infra/repositories/transformers/DatasetPayload.ts +++ b/src/datasets/infra/repositories/transformers/DatasetPayload.ts @@ -1,53 +1,53 @@ -import { FilePayload } from '../../../../files/infra/repositories/transformers/FilePayload'; -import { OwnerNodePayload } from '../../../../core/infra/repositories/transformers/OwnerNodePayload'; +import { FilePayload } from '../../../../files/infra/repositories/transformers/FilePayload' +import { OwnerNodePayload } from '../../../../core/infra/repositories/transformers/OwnerNodePayload' export interface DatasetPayload { - datasetId: number; - datasetPersistentId: string; - id: number; - versionNumber: number; - versionMinorNumber: number; - versionState: string; - createTime: string; - lastUpdateTime: string; - releaseTime: string; - metadataBlocks: MetadataBlocksPayload; - license?: LicensePayload; - alternativePersistentId?: string; - publicationDate?: string; - citationDate?: string; - files: FilePayload[]; - isPartOf: OwnerNodePayload; + datasetId: number + datasetPersistentId: string + id: number + versionNumber: number + versionMinorNumber: number + versionState: string + createTime: string + lastUpdateTime: string + releaseTime: string + metadataBlocks: MetadataBlocksPayload + license?: LicensePayload + alternativePersistentId?: string + publicationDate?: string + citationDate?: string + files: FilePayload[] + isPartOf: OwnerNodePayload } export interface LicensePayload { - name: string; - uri: string; - iconUri?: string; + name: string + uri: string + iconUri?: string } export interface MetadataBlocksPayload { - [blockName: string]: MetadataBlockPayload; + [blockName: string]: MetadataBlockPayload } export interface MetadataBlockPayload { - name: string; - fields: MetadataFieldPayload[]; + name: string + fields: MetadataFieldPayload[] } export interface MetadataFieldPayload { - typeName: string; - value: MetadataFieldValuePayload; - typeClass: string; - multiple: boolean; + typeName: string + value: MetadataFieldValuePayload + typeClass: string + multiple: boolean } export type MetadataFieldValuePayload = | string | string[] | MetadataSubfieldValuePayload - | MetadataSubfieldValuePayload[]; + | MetadataSubfieldValuePayload[] export interface MetadataSubfieldValuePayload { - [key: string]: { value: string; typeName: string; multiple: boolean; typeClass: string }; + [key: string]: { value: string; typeName: string; multiple: boolean; typeClass: string } } 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 b7fd3b20..d08f6627 100644 --- a/src/datasets/infra/repositories/transformers/datasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetTransformers.ts @@ -6,26 +6,26 @@ import { DatasetMetadataFieldValue, DatasetLicense, DatasetMetadataBlocks, - ANONYMIZED_FIELD_VALUE, -} from '../../../domain/models/Dataset'; -import { AxiosResponse } from 'axios'; + ANONYMIZED_FIELD_VALUE +} from '../../../domain/models/Dataset' +import { AxiosResponse } from 'axios' import { DatasetPayload, LicensePayload, MetadataBlocksPayload, MetadataSubfieldValuePayload, MetadataFieldPayload, - MetadataFieldValuePayload, -} from './DatasetPayload'; -import { transformPayloadToOwnerNode } from '../../../../core/infra/repositories/transformers/dvObjectOwnerNodeTransformer'; -import TurndownService from 'turndown'; + MetadataFieldValuePayload +} from './DatasetPayload' +import { transformPayloadToOwnerNode } from '../../../../core/infra/repositories/transformers/dvObjectOwnerNodeTransformer' +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) +} export const transformVersionPayloadToDataset = (versionPayload: DatasetPayload): Dataset => { const datasetModel: Dataset = { @@ -38,105 +38,109 @@ export const transformVersionPayloadToDataset = (versionPayload: DatasetPayload) 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), - ...(versionPayload.isPartOf && { isPartOf: transformPayloadToOwnerNode(versionPayload.isPartOf) }), - }; + ...(versionPayload.isPartOf && { + isPartOf: transformPayloadToOwnerNode(versionPayload.isPartOf) + }) + } 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 +} const transformPayloadToDatasetLicense = (licensePayload: LicensePayload): 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 +} const transformPayloadToDatasetMetadataBlocks = ( - metadataBlocksPayload: MetadataBlocksPayload, + metadataBlocksPayload: MetadataBlocksPayload ): DatasetMetadataBlocks => { return Object.keys(metadataBlocksPayload).map((metadataBlockKey) => { - const metadataBlock = metadataBlocksPayload[metadataBlockKey]; + const metadataBlock = metadataBlocksPayload[metadataBlockKey] return { name: metadataBlock.name, - fields: transformPayloadToDatasetMetadataFields(metadataBlock.fields), - }; - }) as DatasetMetadataBlocks; -}; + fields: transformPayloadToDatasetMetadataFields(metadataBlock.fields) + } + }) as DatasetMetadataBlocks +} const transformPayloadToDatasetMetadataFields = ( - metadataFieldsPayload: MetadataFieldPayload[], + metadataFieldsPayload: MetadataFieldPayload[] ): DatasetMetadataFields => { return metadataFieldsPayload.reduce( (datasetMetadataFieldsMap: DatasetMetadataFields, field: MetadataFieldPayload) => { datasetMetadataFieldsMap[field.typeName] = transformPayloadToDatasetMetadataFieldValue( field.value, - field.typeClass, - ); - return datasetMetadataFieldsMap; + field.typeClass + ) + return datasetMetadataFieldsMap }, - {}, - ); -}; + {} + ) +} const transformPayloadToDatasetMetadataFieldValue = ( metadataFieldValuePayload: MetadataFieldValuePayload, - typeClass: string, + typeClass: string ): DatasetMetadataFieldValue => { function isArrayOfSubfieldValue( - array: (string | MetadataSubfieldValuePayload)[], + array: (string | MetadataSubfieldValuePayload)[] ): array is MetadataSubfieldValuePayload[] { - return array.length > 0 && typeof array[0] !== 'string'; + return array.length > 0 && typeof array[0] !== 'string' } if (typeClass === 'anonymized') { - return ANONYMIZED_FIELD_VALUE; + return ANONYMIZED_FIELD_VALUE } if (typeof metadataFieldValuePayload === 'string') { - return transformHtmlToMarkdown(metadataFieldValuePayload); + return transformHtmlToMarkdown(metadataFieldValuePayload) } else if (Array.isArray(metadataFieldValuePayload)) { if (isArrayOfSubfieldValue(metadataFieldValuePayload)) { return metadataFieldValuePayload.map((metadataSubfieldValuePayload) => - transformPayloadToDatasetMetadataSubfieldValue(metadataSubfieldValuePayload), - ); + transformPayloadToDatasetMetadataSubfieldValue(metadataSubfieldValuePayload) + ) } else { - return metadataFieldValuePayload.map(transformHtmlToMarkdown); + return metadataFieldValuePayload.map(transformHtmlToMarkdown) } } else { - return transformPayloadToDatasetMetadataSubfieldValue(metadataFieldValuePayload as MetadataSubfieldValuePayload); + return transformPayloadToDatasetMetadataSubfieldValue( + metadataFieldValuePayload as MetadataSubfieldValuePayload + ) } -}; +} const transformPayloadToDatasetMetadataSubfieldValue = ( - metadataSubfieldValuePayload: MetadataSubfieldValuePayload, + metadataSubfieldValuePayload: MetadataSubfieldValuePayload ): DatasetMetadataSubField => { - const result: DatasetMetadataSubField = {}; + const result: DatasetMetadataSubField = {} Object.keys(metadataSubfieldValuePayload).forEach((key) => { - const subFieldValue = metadataSubfieldValuePayload[key].value; - result[key] = transformHtmlToMarkdown(subFieldValue); - }); - return result; -}; + const subFieldValue = metadataSubfieldValuePayload[key].value + result[key] = transformHtmlToMarkdown(subFieldValue) + }) + return result +} 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/datasets/infra/repositories/transformers/newDatasetTransformers.ts b/src/datasets/infra/repositories/transformers/newDatasetTransformers.ts index f69b994c..00d72878 100644 --- a/src/datasets/infra/repositories/transformers/newDatasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/newDatasetTransformers.ts @@ -3,138 +3,149 @@ import { NewDatasetMetadataBlockValuesDTO, NewDatasetMetadataFieldsDTO, NewDatasetMetadataFieldValueDTO, - NewDatasetMetadataChildFieldValueDTO, -} from '../../../domain/dtos/NewDatasetDTO'; -import { DatasetLicense } from '../../../domain/models/Dataset'; -import { MetadataBlock, MetadataFieldInfo } from '../../../../metadataBlocks'; + NewDatasetMetadataChildFieldValueDTO +} from '../../../domain/dtos/NewDatasetDTO' +import { DatasetLicense } from '../../../domain/models/Dataset' +import { MetadataBlock, MetadataFieldInfo } from '../../../../metadataBlocks' export interface NewDatasetRequestPayload { datasetVersion: { - license?: DatasetLicense; - metadataBlocks: Record; - }; + license?: DatasetLicense + metadataBlocks: Record + } } export interface MetadataBlockRequestPayload { - fields: MetadataFieldRequestPayload[]; - displayName: string; + fields: MetadataFieldRequestPayload[] + displayName: string } export interface MetadataFieldRequestPayload { - value: MetadataFieldValueRequestPayload; - typeClass: string; - multiple: boolean; - typeName: string; + value: MetadataFieldValueRequestPayload + typeClass: string + multiple: boolean + typeName: string } export type MetadataFieldValueRequestPayload = | string | string[] | Record - | Record[]; + | Record[] export const transformNewDatasetModelToRequestPayload = ( newDataset: NewDatasetDTO, - metadataBlocks: MetadataBlock[], + metadataBlocks: MetadataBlock[] ): NewDatasetRequestPayload => { return { datasetVersion: { ...(newDataset.license && { license: newDataset.license }), - metadataBlocks: transformMetadataBlockModelsToRequestPayload(newDataset.metadataBlockValues, metadataBlocks), - }, - }; -}; + metadataBlocks: transformMetadataBlockModelsToRequestPayload( + newDataset.metadataBlockValues, + metadataBlocks + ) + } + } +} export const transformMetadataBlockModelsToRequestPayload = ( newDatasetMetadataBlocksValues: NewDatasetMetadataBlockValuesDTO[], - metadataBlocks: MetadataBlock[], + metadataBlocks: MetadataBlock[] ): Record => { - const metadataBlocksRequestPayload: Record = {}; - newDatasetMetadataBlocksValues.forEach(function (newDatasetMetadataBlockValues: NewDatasetMetadataBlockValuesDTO) { + const metadataBlocksRequestPayload: Record = {} + newDatasetMetadataBlocksValues.forEach(function ( + newDatasetMetadataBlockValues: NewDatasetMetadataBlockValuesDTO + ) { const metadataBlock: MetadataBlock = metadataBlocks.find( - (metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name, - ); + (metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name + ) metadataBlocksRequestPayload[newDatasetMetadataBlockValues.name] = { fields: transformMetadataFieldModelsToRequestPayload( newDatasetMetadataBlockValues.fields, - metadataBlock.metadataFields, + metadataBlock.metadataFields ), - displayName: metadataBlock.displayName, - }; - }); - return metadataBlocksRequestPayload; -}; + displayName: metadataBlock.displayName + } + }) + return metadataBlocksRequestPayload +} export const transformMetadataFieldModelsToRequestPayload = ( newDatasetMetadataFields: NewDatasetMetadataFieldsDTO, - metadataBlockFields: Record, + metadataBlockFields: Record ): MetadataFieldRequestPayload[] => { - const metadataFieldsRequestPayload: MetadataFieldRequestPayload[] = []; + const metadataFieldsRequestPayload: MetadataFieldRequestPayload[] = [] for (const metadataFieldKey of Object.keys(newDatasetMetadataFields)) { const newDatasetMetadataChildFieldValue: NewDatasetMetadataFieldValueDTO = - newDatasetMetadataFields[metadataFieldKey]; + newDatasetMetadataFields[metadataFieldKey] metadataFieldsRequestPayload.push({ value: transformMetadataFieldValueToRequestPayload( newDatasetMetadataChildFieldValue, - metadataBlockFields[metadataFieldKey], + metadataBlockFields[metadataFieldKey] ), typeClass: metadataBlockFields[metadataFieldKey].typeClass, multiple: metadataBlockFields[metadataFieldKey].multiple, - typeName: metadataFieldKey, - }); + typeName: metadataFieldKey + }) } - return metadataFieldsRequestPayload; -}; + return metadataFieldsRequestPayload +} export const transformMetadataFieldValueToRequestPayload = ( newDatasetMetadataFieldValue: NewDatasetMetadataFieldValueDTO, - metadataBlockFieldInfo: MetadataFieldInfo, + metadataBlockFieldInfo: MetadataFieldInfo ): MetadataFieldValueRequestPayload => { - let value: MetadataFieldValueRequestPayload; + let value: MetadataFieldValueRequestPayload if (metadataBlockFieldInfo.multiple) { const newDatasetMetadataChildFieldValues = newDatasetMetadataFieldValue as | string[] - | NewDatasetMetadataChildFieldValueDTO[]; + | NewDatasetMetadataChildFieldValueDTO[] if (typeof newDatasetMetadataChildFieldValues[0] == 'string') { - value = newDatasetMetadataFieldValue as string[]; + value = newDatasetMetadataFieldValue as string[] } else { - value = []; - (newDatasetMetadataChildFieldValues as NewDatasetMetadataChildFieldValueDTO[]).forEach(function ( - childMetadataFieldValue: NewDatasetMetadataChildFieldValueDTO, - ) { - (value as Record[]).push( - transformMetadataChildFieldValueToRequestPayload(childMetadataFieldValue, metadataBlockFieldInfo), - ); - }); + value = [] + ;(newDatasetMetadataChildFieldValues as NewDatasetMetadataChildFieldValueDTO[]).forEach( + function (childMetadataFieldValue: NewDatasetMetadataChildFieldValueDTO) { + ;(value as Record[]).push( + transformMetadataChildFieldValueToRequestPayload( + childMetadataFieldValue, + metadataBlockFieldInfo + ) + ) + } + ) } } else { if (typeof newDatasetMetadataFieldValue == 'string') { - value = newDatasetMetadataFieldValue; + value = newDatasetMetadataFieldValue } else { value = transformMetadataChildFieldValueToRequestPayload( newDatasetMetadataFieldValue as NewDatasetMetadataChildFieldValueDTO, - metadataBlockFieldInfo, - ); + metadataBlockFieldInfo + ) } } - return value; -}; + return value +} export const transformMetadataChildFieldValueToRequestPayload = ( newDatasetMetadataChildFieldValue: NewDatasetMetadataChildFieldValueDTO, - metadataBlockFieldInfo: MetadataFieldInfo, + metadataBlockFieldInfo: MetadataFieldInfo ): Record => { - const metadataChildFieldRequestPayload: Record = {}; + const metadataChildFieldRequestPayload: Record = {} for (const metadataChildFieldKey of Object.keys(newDatasetMetadataChildFieldValue)) { - const childMetadataFieldInfo: MetadataFieldInfo = metadataBlockFieldInfo.childMetadataFields[metadataChildFieldKey]; - const value: string = newDatasetMetadataChildFieldValue[metadataChildFieldKey] as unknown as string; + const childMetadataFieldInfo: MetadataFieldInfo = + metadataBlockFieldInfo.childMetadataFields[metadataChildFieldKey] + const value: string = newDatasetMetadataChildFieldValue[ + metadataChildFieldKey + ] as unknown as string metadataChildFieldRequestPayload[metadataChildFieldKey] = { value: value, typeClass: childMetadataFieldInfo.typeClass, multiple: childMetadataFieldInfo.multiple, - typeName: metadataChildFieldKey, - }; + typeName: metadataChildFieldKey + } } - return metadataChildFieldRequestPayload; -}; + return metadataChildFieldRequestPayload +} diff --git a/src/files/domain/models/File.ts b/src/files/domain/models/File.ts index 4630d104..0ebea1ea 100644 --- a/src/files/domain/models/File.ts +++ b/src/files/domain/models/File.ts @@ -1,47 +1,47 @@ -import { DvObjectOwnerNode } from '../../../core/domain/models/DvObjectOwnerNode'; +import { DvObjectOwnerNode } from '../../../core/domain/models/DvObjectOwnerNode' 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; - isPartOf?: DvObjectOwnerNode; + 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 + isPartOf?: DvObjectOwnerNode } 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 5ad26aa1..1a7af071 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 = 'EmbargoedThenPublic', - EMBARGOED_RESTRICTED = 'EmbargoedThenRestricted', + EMBARGOED_RESTRICTED = 'EmbargoedThenRestricted' } 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 8dd6fa8b..3526d695 100644 --- a/src/files/domain/repositories/IFilesRepository.ts +++ b/src/files/domain/repositories/IFilesRepository.ts @@ -1,11 +1,11 @@ -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 { Dataset } from '../../../datasets'; +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 { Dataset } from '../../../datasets' export interface IFilesRepository { getDatasetFiles( @@ -15,35 +15,39 @@ 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, - returnDatasetVersion: boolean, - ): Promise; + returnDatasetVersion: boolean + ): Promise - getFileCitation(fileId: number | string, datasetVersionId: string, includeDeaccessioned: boolean): Promise; + getFileCitation( + fileId: number | string, + datasetVersionId: string, + includeDeaccessioned: boolean + ): 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 dfa2a51e..823589ce 100644 --- a/src/files/domain/useCases/GetFile.ts +++ b/src/files/domain/useCases/GetFile.ts @@ -1,7 +1,7 @@ -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { File } from '../models/File'; -import { DatasetNotNumberedVersion } from '../../../datasets'; -import { UseCase } from '../../../core/domain/useCases/UseCase'; +import { IFilesRepository } from '../repositories/IFilesRepository' +import { File } from '../models/File' +import { DatasetNotNumberedVersion } from '../../../datasets' +import { UseCase } from '../../../core/domain/useCases/UseCase' export class GetFile implements UseCase { constructor(private readonly filesRepository: IFilesRepository) {} @@ -15,8 +15,8 @@ export class GetFile implements UseCase { */ async execute( fileId: number | string, - datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, + datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST ): Promise { - return (await this.filesRepository.getFile(fileId, datasetVersionId, false)) as File; + return (await this.filesRepository.getFile(fileId, datasetVersionId, false)) as File } } diff --git a/src/files/domain/useCases/GetFileAndDataset.ts b/src/files/domain/useCases/GetFileAndDataset.ts index de9c22ac..b0abc77d 100644 --- a/src/files/domain/useCases/GetFileAndDataset.ts +++ b/src/files/domain/useCases/GetFileAndDataset.ts @@ -1,7 +1,7 @@ -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { File } from '../models/File'; -import { DatasetNotNumberedVersion, Dataset } from '../../../datasets'; -import { UseCase } from '../../../core/domain/useCases/UseCase'; +import { IFilesRepository } from '../repositories/IFilesRepository' +import { File } from '../models/File' +import { DatasetNotNumberedVersion, Dataset } from '../../../datasets' +import { UseCase } from '../../../core/domain/useCases/UseCase' export class GetFileAndDataset implements UseCase<[File, Dataset]> { constructor(private readonly filesRepository: IFilesRepository) {} @@ -15,8 +15,8 @@ export class GetFileAndDataset implements UseCase<[File, Dataset]> { */ async execute( fileId: number | string, - datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, + datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST ): Promise<[File, Dataset]> { - return (await this.filesRepository.getFile(fileId, datasetVersionId, true)) as [File, Dataset]; + return (await this.filesRepository.getFile(fileId, datasetVersionId, true)) as [File, Dataset] } } diff --git a/src/files/domain/useCases/GetFileCitation.ts b/src/files/domain/useCases/GetFileCitation.ts index 196968f0..fde0710b 100644 --- a/src/files/domain/useCases/GetFileCitation.ts +++ b/src/files/domain/useCases/GetFileCitation.ts @@ -1,12 +1,12 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase'; -import { IFilesRepository } from '../repositories/IFilesRepository'; -import { DatasetNotNumberedVersion } from '../../../datasets'; +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IFilesRepository } from '../repositories/IFilesRepository' +import { DatasetNotNumberedVersion } from '../../../datasets' export class GetFileCitation implements UseCase { - private filesRepository: IFilesRepository; + private filesRepository: IFilesRepository constructor(filesRepository: IFilesRepository) { - this.filesRepository = filesRepository; + this.filesRepository = filesRepository } /** @@ -20,8 +20,12 @@ export class GetFileCitation implements UseCase { async execute( fileId: number, datasetVersionId: string | DatasetNotNumberedVersion = DatasetNotNumberedVersion.LATEST, - includeDeaccessioned = false, + includeDeaccessioned = false ): Promise { - return await this.filesRepository.getFileCitation(fileId, datasetVersionId, includeDeaccessioned); + return await this.filesRepository.getFileCitation( + fileId, + datasetVersionId, + includeDeaccessioned + ) } } 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 0c17b1ff..87c2b9f2 100644 --- a/src/files/index.ts +++ b/src/files/index.ts @@ -1,25 +1,25 @@ -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 { GetFileCitation } from './domain/useCases/GetFileCitation'; -import { GetFileAndDataset } from './domain/useCases/GetFileAndDataset'; +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 { GetFileCitation } from './domain/useCases/GetFileCitation' +import { GetFileAndDataset } from './domain/useCases/GetFileAndDataset' -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 getFileAndDataset = new GetFileAndDataset(filesRepository); -const getFileCitation = new GetFileCitation(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 getFileAndDataset = new GetFileAndDataset(filesRepository) +const getFileCitation = new GetFileCitation(filesRepository) export { getDatasetFiles, @@ -30,18 +30,22 @@ export { getDatasetFilesTotalDownloadSize, getFile, getFileAndDataset, - getFileCitation, -}; + getFileCitation +} -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, @@ -50,7 +54,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 f9a6907e..a3114481 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 { Dataset } 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 { Dataset } 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,99 +112,114 @@ 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) + .then((response) => parseInt(response.data.data.message)) .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, - returnDatasetVersion: boolean, + returnDatasetVersion: boolean ): Promise { - return this.doGet(this.buildApiEndpoint(this.filesResourceName, `versions/${datasetVersionId}`, fileId), true, { - returnDatasetVersion: returnDatasetVersion, - returnOwners: true, - }) + return this.doGet( + this.buildApiEndpoint(this.filesResourceName, `versions/${datasetVersionId}`, fileId), + true, + { + returnDatasetVersion: returnDatasetVersion, + returnOwners: true + } + ) .then((response) => transformFileResponseToFile(response, returnDatasetVersion)) .catch((error) => { - throw error; - }); + throw error + }) } public async getFileCitation( fileId: number | string, datasetVersionId: string, - includeDeaccessioned: boolean, + includeDeaccessioned: boolean ): Promise { return this.doGet( - this.buildApiEndpoint(this.filesResourceName, `versions/${datasetVersionId}/citation`, fileId), + this.buildApiEndpoint( + this.filesResourceName, + `versions/${datasetVersionId}/citation`, + fileId + ), true, - { includeDeaccessioned: includeDeaccessioned }, + { includeDeaccessioned: includeDeaccessioned } ) .then((response) => response.data.data.message) .catch((error) => { - throw error; - }); + throw error + }) } 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/FilePayload.ts b/src/files/infra/repositories/transformers/FilePayload.ts index 4ef4bd61..9f31a9ed 100644 --- a/src/files/infra/repositories/transformers/FilePayload.ts +++ b/src/files/infra/repositories/transformers/FilePayload.ts @@ -1,52 +1,52 @@ -import { OwnerNodePayload } from '../../../../core/infra/repositories/transformers/OwnerNodePayload'; +import { OwnerNodePayload } from '../../../../core/infra/repositories/transformers/OwnerNodePayload' export interface FilePayload { dataFile: { - id: number; - persistentId: string; - filename: string; - pidURL?: string; - filesize: number; - version: number; - description?: string; - restricted: boolean; - directoryLabel?: string; - datasetVersionId?: number; - categories?: string[]; - contentType: string; - friendlyType: string; - embargo?: EmbargoPayload; - storageIdentifier?: string; - originalFormat?: string; - originalFormatLabel?: string; - originalSize?: number; - originalName?: string; - UNF?: string; - rootDataFileId?: number; - previousDataFileId?: number; - md5?: string; - checksum?: ChecksumPayload; - fileMetadataId?: number; - tabularTags?: string[]; - creationDate?: string; - publicationDate?: string; - deleted: boolean; - tabularData: boolean; - fileAccessRequest?: boolean; - isPartOf?: OwnerNodePayload; - }; - version: number; - restricted: boolean; - label: string; - datasetVersionId: number; + id: number + persistentId: string + filename: string + pidURL?: string + filesize: number + version: number + description?: string + restricted: boolean + directoryLabel?: string + datasetVersionId?: number + categories?: string[] + contentType: string + friendlyType: string + embargo?: EmbargoPayload + storageIdentifier?: string + originalFormat?: string + originalFormatLabel?: string + originalSize?: number + originalName?: string + UNF?: string + rootDataFileId?: number + previousDataFileId?: number + md5?: string + checksum?: ChecksumPayload + fileMetadataId?: number + tabularTags?: string[] + creationDate?: string + publicationDate?: string + deleted: boolean + tabularData: boolean + fileAccessRequest?: boolean + isPartOf?: OwnerNodePayload + } + version: number + restricted: boolean + label: string + datasetVersionId: number } export interface EmbargoPayload { - dateAvailable: string; - reason?: string; + dateAvailable: string + reason?: string } export interface ChecksumPayload { - type: string; - value: string; + type: string + value: string } diff --git a/src/files/infra/repositories/transformers/fileCountsTransformers.ts b/src/files/infra/repositories/transformers/fileCountsTransformers.ts index fe4f7f60..8938224f 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 = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + 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 = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + 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 = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + 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..fea178ae 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,38 @@ 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[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any fileDataVariablesPayload.forEach(function (fileDataVariablePayload: any) { fileDataVariables.push({ id: fileDataVariablePayload.id, @@ -41,124 +46,159 @@ 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 = ( + // 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, 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, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + categoryMetadatasPayload: any ): FileDataVariableCategoryMetadata[] => { - const fileDataVariableCategoryMetadatas: 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 }), - ...(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, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + dataVariableInvalidRangesPayload: any ): FileDataVariableInvalidRanges[] => { - const dataVariableInvalidRanges: FileDataVariableInvalidRanges[] = []; + const dataVariableInvalidRanges: FileDataVariableInvalidRanges[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any 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, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + fileDataVariableCategoriesPayload: any ): FileDataVariableCategory[] => { - const fileDataVariableCategories: FileDataVariableCategory[] = []; + const fileDataVariableCategories: FileDataVariableCategory[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any 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 202fcfda..ac3438a3 100644 --- a/src/files/infra/repositories/transformers/fileTransformers.ts +++ b/src/files/infra/repositories/transformers/fileTransformers.ts @@ -1,34 +1,37 @@ -import { File, FileEmbargo, FileChecksum } from '../../../domain/models/File'; -import { AxiosResponse } from 'axios'; -import { FilesSubset } from '../../../domain/models/FilesSubset'; -import { Dataset } from '../../../../datasets'; -import { transformVersionPayloadToDataset } from '../../../../datasets/infra/repositories/transformers/datasetTransformers'; -import { ChecksumPayload, EmbargoPayload, FilePayload } from './FilePayload'; -import { transformPayloadToOwnerNode } from '../../../../core/infra/repositories/transformers/dvObjectOwnerNodeTransformer'; +import { File, FileEmbargo, FileChecksum } from '../../../domain/models/File' +import { AxiosResponse } from 'axios' +import { FilesSubset } from '../../../domain/models/FilesSubset' +import { Dataset } from '../../../../datasets' +import { transformVersionPayloadToDataset } from '../../../../datasets/infra/repositories/transformers/datasetTransformers' +import { ChecksumPayload, EmbargoPayload, FilePayload } from './FilePayload' +import { transformPayloadToOwnerNode } from '../../../../core/infra/repositories/transformers/dvObjectOwnerNodeTransformer' export const transformFilesResponseToFilesSubset = (response: AxiosResponse): FilesSubset => { - const filesPayload = response.data.data; - const files: File[] = []; + const filesPayload = response.data.data + const files: File[] = [] filesPayload.forEach(function (filePayload: FilePayload) { - files.push(transformFilePayloadToFile(filePayload)); - }); + files.push(transformFilePayloadToFile(filePayload)) + }) return { files: files, - totalFilesCount: response.data.totalCount, - }; -}; + totalFilesCount: response.data.totalCount + } +} export const transformFileResponseToFile = ( response: AxiosResponse, - returnDatasetVersion: boolean, + returnDatasetVersion: boolean ): File | [File, Dataset] => { - const filePayload = response.data.data; + const filePayload = response.data.data if (returnDatasetVersion) { - return [transformFilePayloadToFile(filePayload), transformVersionPayloadToDataset(filePayload.datasetVersion)]; + return [ + transformFilePayloadToFile(filePayload), + transformVersionPayloadToDataset(filePayload.datasetVersion) + ] } - return transformFilePayloadToFile(filePayload); -}; + return transformFilePayloadToFile(filePayload) +} const transformFilePayloadToFile = (filePayload: FilePayload): File => { return { @@ -41,45 +44,69 @@ const transformFilePayloadToFile = (filePayload: FilePayload): 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.isPartOf && { isPartOf: transformPayloadToOwnerNode(filePayload.dataFile.isPartOf) }), - }; -}; + ...(filePayload.dataFile.fileAccessRequest && { + fileAccessRequest: filePayload.dataFile.fileAccessRequest + }), + ...(filePayload.dataFile.isPartOf && { + isPartOf: transformPayloadToOwnerNode(filePayload.dataFile.isPartOf) + }) + } +} const transformEmbargoPayloadToEmbargo = (embargoPayload: EmbargoPayload): FileEmbargo => { return { dateAvailable: new Date(embargoPayload.dateAvailable), - ...(embargoPayload.reason && { reason: embargoPayload.reason }), - }; -}; + ...(embargoPayload.reason && { reason: embargoPayload.reason }) + } +} const transformChecksumPayloadToChecksum = (checksumPayload: ChecksumPayload): 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..71ba653b 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) + .then((response) => parseInt(response.data.data)) .catch((error) => { - throw error; - }); + throw error + }) } public async getMaxEmbargoDurationInMonths(): Promise { - return this.doGet(this.buildApiEndpoint(this.infoResourceName, `settings/:MaxEmbargoDurationInMonths`)) - .then((response) => response.data.data.message as number) + return this.doGet( + this.buildApiEndpoint(this.infoResourceName, `settings/:MaxEmbargoDurationInMonths`) + ) + .then((response) => parseInt(response.data.data.message)) .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 834d7908..4ed05395 100644 --- a/src/metadataBlocks/domain/models/MetadataBlock.ts +++ b/src/metadataBlocks/domain/models/MetadataBlock.ts @@ -1,23 +1,23 @@ 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; - typeClass: string; - watermark: string; - description: string; - multiple: boolean; - isControlledVocabulary: boolean; - controlledVocabularyValues?: string[]; - displayFormat: string; - childMetadataFields?: Record; - isRequired: boolean; - displayOrder: number; + name: string + displayName: string + title: string + type: string + typeClass: string + watermark: string + description: string + multiple: boolean + isControlledVocabulary: boolean + controlledVocabularyValues?: string[] + displayFormat: string + childMetadataFields?: Record + isRequired: boolean + displayOrder: number } 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 00d40262..c31c063b 100644 --- a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts +++ b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts @@ -1,23 +1,29 @@ -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 = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + metadataFieldInfoPayload: any, + isChild = false +): MetadataFieldInfo => { const metadataFieldInfo: MetadataFieldInfo = { name: metadataFieldInfoPayload.name, displayName: metadataFieldInfoPayload.displayName, @@ -30,18 +36,18 @@ const transformPayloadMetadataFieldInfo = (metadataFieldInfoPayload: any, isChil displayFormat: metadataFieldInfoPayload.displayFormat, isRequired: metadataFieldInfoPayload.isRequired, displayOrder: metadataFieldInfoPayload.displayOrder, - typeClass: metadataFieldInfoPayload.typeClass, - }; - if (!isChild && metadataFieldInfoPayload.hasOwnProperty('childFields')) { - const childMetadataFieldsPayload = metadataFieldInfoPayload.childFields; - const childMetadataFields: Record = {}; + typeClass: metadataFieldInfoPayload.typeClass + } + 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..99fb7568 100644 --- a/test/integration/auth/AuthRepository.test.ts +++ b/test/integration/auth/AuthRepository.test.ts @@ -1,21 +1,25 @@ -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 { 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)); + const expectedError = new WriteError( + '[500] This endpoint is only available when session authentication feature flag is enabled' + ) - 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', - ); - }); -}); + await expect(sut.logout()).rejects.toThrow(expectedError) + }) +}) diff --git a/test/integration/datasets/DatasetsRepository.test.ts b/test/integration/datasets/DatasetsRepository.test.ts index 621be5a2..ceccd49a 100644 --- a/test/integration/datasets/DatasetsRepository.test.ts +++ b/test/integration/datasets/DatasetsRepository.test.ts @@ -1,369 +1,379 @@ -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 { 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'; -import { NewDatasetDTO } from '../../../src/datasets/domain/dtos/NewDatasetDTO'; -import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository'; -import { Author, DatasetContact, DatasetDescription } from '../../../src/datasets/domain/models/Dataset'; + waitForNoLocks +} from '../../testHelpers/datasets/datasetHelper' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' +import { + DatasetNotNumberedVersion, + DatasetLockType, + DatasetPreviewSubset +} from '../../../src/datasets' +import { ApiConfig } from '../../../src' +import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' +import { MetadataBlocksRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataBlocksRepository' +import { + Author, + DatasetContact, + DatasetDescription +} from '../../../src/datasets/domain/models/Dataset' 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 beforeEach(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 + ) + }) afterEach(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 expectedTotalDatasetCount = 3; + const testPageLimit = 1 + const expectedTotalDatasetCount = 3 test('should return all dataset previews when no pagination params are defined', async () => { - const actual: DatasetPreviewSubset = await sut.getAllDatasetPreviews(); - assert.match(actual.datasetPreviews.length, expectedTotalDatasetCount); - assert.match(actual.datasetPreviews[0].title, 'Third Dataset'); - assert.match(actual.totalDatasetCount, expectedTotalDatasetCount); - }); + const actual: DatasetPreviewSubset = await sut.getAllDatasetPreviews() + expect(actual.datasetPreviews.length).toEqual(expectedTotalDatasetCount) + expect(actual.datasetPreviews[0].title).toMatch('Third Dataset') + expect(actual.totalDatasetCount).toEqual(expectedTotalDatasetCount) + }) 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, 'Third Dataset'); - assert.match(actual.totalDatasetCount, expectedTotalDatasetCount); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 0) + expect(actual.datasetPreviews.length).toEqual(1) + expect(actual.datasetPreviews[0].title).toMatch('Third Dataset') + expect(actual.totalDatasetCount).toEqual(expectedTotalDatasetCount) + }) 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, 'Second Dataset'); - assert.match(actual.totalDatasetCount, expectedTotalDatasetCount); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 1) + expect(actual.datasetPreviews.length).toEqual(1) + expect(actual.datasetPreviews[0].title).toMatch('Second Dataset') + expect(actual.totalDatasetCount).toEqual(expectedTotalDatasetCount) + }) test('should return third dataset preview page', async () => { - const actual = await sut.getAllDatasetPreviews(testPageLimit, 2); - assert.match(actual.datasetPreviews.length, 1); - assert.match(actual.datasetPreviews[0].title, 'First Dataset'); - assert.match(actual.totalDatasetCount, expectedTotalDatasetCount); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 2) + expect(actual.datasetPreviews.length).toEqual(1) + expect(actual.datasetPreviews[0].title).toMatch('First Dataset') + expect(actual.totalDatasetCount).toEqual(expectedTotalDatasetCount) + }) test('should return fourth dataset preview page', async () => { - const actual = await sut.getAllDatasetPreviews(testPageLimit, 3); - assert.match(actual.datasetPreviews.length, 0); - assert.match(actual.totalDatasetCount, expectedTotalDatasetCount); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 3) + expect(actual.datasetPreviews.length).toEqual(0) + expect(actual.totalDatasetCount).toEqual(expectedTotalDatasetCount) + }) test('should return datasets in the specified collection', async () => { - const actual = await sut.getAllDatasetPreviews(testPageLimit, 0, 'firstCollection'); - - assert.match(actual.datasetPreviews[0].title, 'Third Dataset'); - assert.match(actual.datasetPreviews.length, 1); - assert.match(actual.totalDatasetCount, 1); - }); - }); + const actual = await sut.getAllDatasetPreviews(testPageLimit, 0, 'firstCollection') + expect(actual.datasetPreviews[0].title).toMatch('Third Dataset') + expect(actual.datasetPreviews.length).toEqual(1) + expect(actual.totalDatasetCount).toEqual(1) + }) + }) describe('getDatasetSummaryFieldNames', () => { test('should return not empty field list on successful response', async () => { - const actual = await sut.getDatasetSummaryFieldNames(); - - assert.pass(actual.length > 0); - }); - }); + const actual = await sut.getDatasetSummaryFieldNames() + expect(actual.length).toBeGreaterThan(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); - }); + 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 is deaccessioned and includeDeaccessioned param is set', async () => { await publishDatasetViaApi(TestConstants.TEST_CREATED_DATASET_2_ID) - .then() - .catch(() => { - assert.fail('Error while publishing test Dataset'); - }); await waitForNoLocks(TestConstants.TEST_CREATED_DATASET_2_ID, 10) - .then() - .catch(() => { - 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'); - }); - const actual = await sut.getDataset(TestConstants.TEST_CREATED_DATASET_2_ID, latestVersionId, true); + const actual = await sut.getDataset( + TestConstants.TEST_CREATED_DATASET_2_ID, + latestVersionId, + true + ) - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_2_ID); - }); + expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_2_ID) + }) test('should return dataset when it is deaccessioned, includeDeaccessioned param is set, and user is unauthenticated', async () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, undefined); - const actual = await sut.getDataset(TestConstants.TEST_CREATED_DATASET_2_ID, latestVersionId, true); - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_2_ID); - }); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, undefined) + const actual = await sut.getDataset( + TestConstants.TEST_CREATED_DATASET_2_ID, + latestVersionId, + true + ) + expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_2_ID) + }) test('should return error when dataset is deaccessioned and includeDeaccessioned param is not set', async () => { - let error: ReadError = undefined; - await sut.getDataset(TestConstants.TEST_CREATED_DATASET_2_ID, latestVersionId, false).catch((e) => (error = e)); - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset version ${latestVersionId} of dataset ${TestConstants.TEST_CREATED_DATASET_2_ID} not found`, - ); - }); + const expectedError = new ReadError( + `[404] Dataset version ${latestVersionId} of dataset ${TestConstants.TEST_CREATED_DATASET_2_ID} not found` + ) + await expect( + sut.getDataset(TestConstants.TEST_CREATED_DATASET_2_ID, latestVersionId, false) + ).rejects.toThrow(expectedError) + }) 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', () => { 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; - - 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.`, - ); - }); - }); - }); + const testWrongPersistentId = 'wrongPersistentId' + const expectedError = new ReadError( + `[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'; - let privateUrlToken: string = undefined; + const expectedErrorInvalidToken = '[404] Private URL user not found' + let privateUrlToken: string beforeAll(async () => { - await createPrivateUrlViaApi(TestConstants.TEST_CREATED_DATASET_1_ID) - .then((response) => { - privateUrlToken = response.data.data.token; - }) - .catch(() => { - fail('Tests beforeAll(): Error while creating Dataset private URL'); - }); - }); + try { + const response = await createPrivateUrlViaApi(TestConstants.TEST_CREATED_DATASET_1_ID) + privateUrlToken = response.data.data.token + } catch (error) { + throw new Error('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); - - expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID); - }); + const actual = await sut.getPrivateUrlDataset(privateUrlToken) + expect(actual.id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID) + }) 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.getPrivateUrlDataset('invalidToken')).rejects.toThrow(expectedError) + }) + }) describe('getPrivateUrlDatasetCitation', () => { test('should return dataset citation when token is valid', async () => { - const actual = await sut.getPrivateUrlDatasetCitation(privateUrlToken); - - expect(typeof actual).toBe('string'); - }); + const actual = await sut.getPrivateUrlDatasetCitation(privateUrlToken) + expect(typeof actual).toBe('string') + }) 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.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); - }); + const actual = await sut.getDatasetUserPermissions(TestConstants.TEST_CREATED_DATASET_1_ID) + 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)); - - assert.match( - error.message, - `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((error) => { - console.log(JSON.stringify(error)); - 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; Registering PIDs for Datafiles; Validating Datafiles Asynchronously', - ); - }); - - test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + const expectedError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + + await expect(sut.getDatasetUserPermissions(nonExistentTestDatasetId)).rejects.toThrow( + expectedError + ) + }) + }) + }) + + 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((error) => { + console.log(JSON.stringify(error)) + }) + const actual = await sut.getDatasetLocks(TestConstants.TEST_CREATED_DATASET_2_ID) + 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; Registering PIDs for Datafiles; Validating Datafiles Asynchronously' + ) + }) - await sut.getDatasetLocks(nonExistentTestDatasetId).catch((e) => (error = e)); + test('should return error when dataset does not exist', async () => { + 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.getDatasetLocks(nonExistentTestDatasetId)).rejects.toThrow(expectedError) + }) + }) 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)); + 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.getDatasetCitation(nonExistentTestDatasetId, latestVersionId, false) + ).rejects.toThrow(expectedError) + }) test('should return citation when dataset is deaccessioned', async () => { const actualDatasetCitation = await sut.getDatasetCitation( TestConstants.TEST_CREATED_DATASET_2_ID, latestVersionId, - true, - ); - expect(typeof actualDatasetCitation).toBe('string'); - }); - }); + true + ) + expect(typeof actualDatasetCitation).toBe('string') + }) + }) describe('createDataset', () => { test('should create a dataset with the provided dataset citation fields', async () => { - const testTitle = 'Dataset created using the createDataset use case'; - const testAuthorName1 = 'Admin, Dataverse'; - const testAuthorName2 = 'Owner, Dataverse'; - const testAuthorAffiliation1 = 'Dataverse.org'; - const testAuthorAffiliation2 = 'Dataversedemo.org'; - const testContactEmail = 'finch@mailinator.com'; - const testContactName = 'Finch, Fiona'; - const testDescription = 'This is the description of the dataset.'; - const testSubject = ['Medicine, Health and Life Sciences']; - - const testNewDataset: NewDatasetDTO = { + const testNewDataset = { metadataBlockValues: [ { name: 'citation', fields: { - title: testTitle, + title: 'Dataset created using the createDataset use case', author: [ { - authorName: testAuthorName1, - authorAffiliation: testAuthorAffiliation1, + authorName: 'Admin, Dataverse', + authorAffiliation: 'Dataverse.org' }, { - authorName: testAuthorName2, - authorAffiliation: testAuthorAffiliation2, - }, + authorName: 'Owner, Dataverse', + authorAffiliation: 'Dataversedemo.org' + } ], datasetContact: [ { - datasetContactEmail: testContactEmail, - datasetContactName: testContactName, - }, + datasetContactEmail: 'finch@mailinator.com', + datasetContactName: 'Finch, Fiona' + } ], dsDescription: [ { - dsDescriptionValue: testDescription, - }, + dsDescriptionValue: 'This is the description of the dataset.' + } ], - subject: testSubject, - }, - }, - ], - }; - - const metadataBlocksRepository = new MetadataBlocksRepository(); - const citationMetadataBlock = await metadataBlocksRepository.getMetadataBlockByName('citation'); - const createdDataset = await sut.createDataset(testNewDataset, [citationMetadataBlock], 'root'); - const actualCreatedDataset = await sut.getDataset(createdDataset.numericId, latestVersionId, false); - - expect(actualCreatedDataset.metadataBlocks[0].fields.title).toBe(testTitle); - expect((actualCreatedDataset.metadataBlocks[0].fields.author[0] as Author).authorName).toBe(testAuthorName1); - expect((actualCreatedDataset.metadataBlocks[0].fields.author[0] as Author).authorAffiliation).toBe( - testAuthorAffiliation1, - ); - expect((actualCreatedDataset.metadataBlocks[0].fields.author[1] as Author).authorName).toBe(testAuthorName2); - expect((actualCreatedDataset.metadataBlocks[0].fields.author[1] as Author).authorAffiliation).toBe( - testAuthorAffiliation2, - ); + subject: ['Medicine, Health and Life Sciences'] + } + } + ] + } + + const metadataBlocksRepository = new MetadataBlocksRepository() + const citationMetadataBlock = await metadataBlocksRepository.getMetadataBlockByName( + 'citation' + ) + const createdDataset = await sut.createDataset( + testNewDataset, + [citationMetadataBlock], + 'root' + ) + const actualCreatedDataset = await sut.getDataset( + createdDataset.numericId, + latestVersionId, + false + ) + + expect(actualCreatedDataset.metadataBlocks[0].fields.title).toBe( + 'Dataset created using the createDataset use case' + ) + expect((actualCreatedDataset.metadataBlocks[0].fields.author[0] as Author).authorName).toBe( + 'Admin, Dataverse' + ) + expect( + (actualCreatedDataset.metadataBlocks[0].fields.author[0] as Author).authorAffiliation + ).toBe('Dataverse.org') + expect((actualCreatedDataset.metadataBlocks[0].fields.author[1] as Author).authorName).toBe( + 'Owner, Dataverse' + ) + expect( + (actualCreatedDataset.metadataBlocks[0].fields.author[1] as Author).authorAffiliation + ).toBe('Dataversedemo.org') expect( - (actualCreatedDataset.metadataBlocks[0].fields.datasetContact[0] as DatasetContact).datasetContactEmail, - ).toBe(testContactEmail); + (actualCreatedDataset.metadataBlocks[0].fields.datasetContact[0] as DatasetContact) + .datasetContactEmail + ).toBe('finch@mailinator.com') expect( - (actualCreatedDataset.metadataBlocks[0].fields.datasetContact[0] as DatasetContact).datasetContactName, - ).toBe(testContactName); + (actualCreatedDataset.metadataBlocks[0].fields.datasetContact[0] as DatasetContact) + .datasetContactName + ).toBe('Finch, Fiona') expect( - (actualCreatedDataset.metadataBlocks[0].fields.dsDescription[0] as DatasetDescription).dsDescriptionValue, - ).toBe(testDescription); - expect(actualCreatedDataset.metadataBlocks[0].fields.subject[0]).toBe(testSubject[0]); - expect(actualCreatedDataset.metadataBlocks[0].fields.subject[1]).toBe(testSubject[1]); - }); - }); -}); + (actualCreatedDataset.metadataBlocks[0].fields.dsDescription[0] as DatasetDescription) + .dsDescriptionValue + ).toBe('This is the description of the dataset.') + expect(actualCreatedDataset.metadataBlocks[0].fields.subject).toContain( + 'Medicine, Health and Life Sciences' + ) + }) + }) +}) diff --git a/test/integration/environment/setup.js b/test/integration/environment/setup.js deleted file mode 100644 index 7e07fc46..00000000 --- a/test/integration/environment/setup.js +++ /dev/null @@ -1,121 +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 datasetJson3 = require('../../testHelpers/datasets/test-dataset-3.json'); -const collectionJson = require('../../testHelpers/collections/test-collection-1.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(() => { - console.error('Tests setup: Error while creating test Dataset 1'); - }); - await createDatasetViaApi(datasetJson2).catch(() => { - console.error('Tests setup: Error while creating test Dataset 2'); - }); - await createCollectionViaApi(collectionJson) - .then() - .catch((error) => { - console.error('Tests setup: Error while creating test Collection 1'); - }); - await createDatasetViaApi(datasetJson3, collectionJson.alias) - .then() - .catch((error) => { - console.error('Tests setup: Error while creating test Dataset 3'); - }); - console.log('Test datasets created'); - await waitForDatasetsIndexingInSolr(); -} - -async function createCollectionViaApi(collectionJson) { - return await axios.post(`${TestConstants.TEST_API_URL}/dataverses/root`, collectionJson, buildRequestHeaders()); -} - -async function createDatasetViaApi(datasetJson, collectionId = 'root') { - return await axios.post( - `${TestConstants.TEST_API_URL}/dataverses/${collectionId}/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 == 3) { - 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..ede119e9 --- /dev/null +++ b/test/integration/environment/setup.ts @@ -0,0 +1,132 @@ +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' +import datasetJson3 from '../../testHelpers/datasets/test-dataset-3.json' +import collectionJson from '../../testHelpers/collections/test-collection-1.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') + 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(): Promise { + console.log('Creating test datasets...') + await createDatasetViaApi(datasetJson1) + .then() + .catch(() => { + console.error('Tests setup: Error while creating test Dataset 1') + }) + await createDatasetViaApi(datasetJson2).catch(() => { + console.error('Tests setup: Error while creating test Dataset 2') + }) + await createCollectionViaApi(collectionJson) + .then() + .catch(() => { + console.error('Tests setup: Error while creating test Collection 1') + }) + await createDatasetViaApi(datasetJson3, collectionJson.alias) + .then() + .catch(() => { + console.error('Tests setup: Error while creating test Dataset 3') + }) + console.log('Test datasets created') + await waitForDatasetsIndexingInSolr() +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +async function createCollectionViaApi(collectionJson: any): Promise { + return await axios.post( + `${TestConstants.TEST_API_URL}/dataverses/root`, + collectionJson, + buildRequestHeaders() + ) +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +async function createDatasetViaApi(datasetJson: any, collectionId = 'root'): Promise { + return await axios.post( + `${TestConstants.TEST_API_URL}/dataverses/${collectionId}/datasets`, + datasetJson, + buildRequestHeaders() + ) +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +async function waitForDatasetsIndexingInSolr(): Promise { + 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 === 3) { + 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') +} + +/* eslint-disable @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/integration/files/FilesRepository.test.ts b/test/integration/files/FilesRepository.test.ts index fe817bc6..ec755977 100644 --- a/test/integration/files/FilesRepository.test.ts +++ b/test/integration/files/FilesRepository.test.ts @@ -1,88 +1,98 @@ -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, Dataset } from '../../../src/datasets'; -import { File } from '../../../src/files/domain/models/File'; -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 { 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, Dataset } from '../../../src/datasets' +import { File } from '../../../src/files/domain/models/File' +import { FileCounts } from '../../../src/files/domain/models/FileCounts' +import { FileDownloadSizeMode } from '../../../src' import { deaccessionDatasetViaApi, publishDatasetViaApi, - waitForNoLocks, -} from '../../testHelpers/datasets/datasetHelper'; + waitForNoLocks +} from '../../testHelpers/datasets/datasetHelper' 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) + 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}`); - }); + console.log(e) + 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}`); - }); + console.log(e) + 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}`); - }); + console.log(e) + throw new Error(`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, - ); - testFileId = filesSubset.files[0].id; - testFilePersistentId = filesSubset.files[0].persistentId; - }); + FileOrderCriteria.NAME_AZ + ) + 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 () => { @@ -90,15 +100,16 @@ 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 + ) + + 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 () => { const actual = await sut.getDatasetFiles( @@ -108,12 +119,13 @@ 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 + ) + + 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 () => { const actual = await sut.getDatasetFiles( @@ -123,57 +135,61 @@ 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 + ) - test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + 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) + }) - const nonExistentTestDatasetId = 100; - await 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.`, - ); - }); - }); + test('should return error when dataset does not exist', async () => { + const nonExistentTestDatasetId = 100 + const errorExpected: ReadError = new ReadError( + `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` + ) + + await expect( + sut.getDatasetFiles( + nonExistentTestDatasetId, + latestDatasetVersionId, + false, + FileOrderCriteria.NAME_AZ + ) + ).rejects.toThrow(errorExpected) + }) + }) 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 + ) + + 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 () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); + false + ) const actual = await sut.getDatasetFiles( testDataset.persistentId, latestDatasetVersionId, @@ -181,19 +197,20 @@ 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 + ) + + 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 () => { const testDataset = await datasetRepository.getDataset( TestConstants.TEST_CREATED_DATASET_1_ID, latestDatasetVersionId, - false, - ); + false + ) const actual = await sut.getDatasetFiles( testDataset.persistentId, latestDatasetVersionId, @@ -201,30 +218,33 @@ 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); - }); - - test('should return error when dataset does not exist', async () => { - let error: ReadError = undefined; + testFileCriteria + ) - const testWrongPersistentId = 'wrongPersistentId'; - await sut - .getDatasetFiles(testWrongPersistentId, latestDatasetVersionId, false, FileOrderCriteria.NAME_AZ) - .catch((e) => (error = e)); + 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) + }) - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Dataset with Persistent ID ${testWrongPersistentId} not found.`, - ); - }); - }); - }); + test('should return error when dataset does not exist', async () => { + const testWrongPersistentId = 'wrongPersistentId' + const errorExpected = new ReadError( + `[404] Dataset with Persistent ID ${testWrongPersistentId} not found.` + ) + + await expect( + sut.getDatasetFiles( + testWrongPersistentId, + latestDatasetVersionId, + false, + FileOrderCriteria.NAME_AZ + ) + ).rejects.toThrow(errorExpected) + }) + }) + }) describe('getDatasetFileCounts', () => { const expectedFileCounts: FileCounts = { @@ -232,38 +252,41 @@ 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 + ) + + 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 () => { const expectedFileCountsForCriteria: FileCounts = { @@ -271,90 +294,98 @@ 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 + ) + + 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 () => { 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 + ) + + 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) + }) + }) 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 + ) + expect(actual).toBe(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 + ) + expect(actual).toBe(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 + ) + expect(actual).toBe(expectedTotalDownloadSizeForCriteria) + }) + }) describe('getFileDownloadCount', () => { test('should return count filtering by file id and version id', async () => { @@ -362,24 +393,19 @@ 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) + 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) + }) + }) describe('getFileUserPermissions', () => { test('should return user permissions filtering by file id and version id', async () => { @@ -387,26 +413,22 @@ 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) + + 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; + const errorExpected = new ReadError(`[404] File with ID ${nonExistentFiledId} not found.`) - 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.`, - ); - }); - }); + await expect(sut.getFileUserPermissions(nonExistentFiledId)).rejects.toThrow(errorExpected) + }) + }) describe('getFileDataTables', () => { test('should return data tables filtering by tabular file id and version id', async () => { @@ -414,142 +436,155 @@ 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) + expect(actual[0].varQuantity).toBe(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]; - - let error: ReadError = undefined; + FileOrderCriteria.NAME_AZ + ) + const testFile = currentTestFilesSubset.files[0] - await sut.getFileDataTables(testFile.id).catch((e) => (error = e)); + const errorExpected = new ReadError( + '[400] This operation is only available for tabular files.' + ) - assert.match( - error.message, - 'There was an error when reading the resource. Reason was: [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) + }) + }) describe('getFile', () => { describe('by numeric id', () => { test('should return file when providing a valid id', async () => { - const actual: File = (await sut.getFile(testFileId, DatasetNotNumberedVersion.LATEST, false)) as File; + const actual: File = (await sut.getFile( + testFileId, + DatasetNotNumberedVersion.LATEST, + false + )) as File - 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: File = (await sut.getFile(testFileId, DatasetNotNumberedVersion.DRAFT, false)) as File; + const actual: File = (await sut.getFile( + testFileId, + DatasetNotNumberedVersion.DRAFT, + false + )) as File - assert.match(actual.name, testTextFile1Name); - }); + expect(actual.name).toBe(testTextFile1Name) + }) test('should return file and dataset when providing id, version, and returnDatasetVersion is true', async () => { - const actual = (await sut.getFile(testFileId, DatasetNotNumberedVersion.DRAFT, true)) as [File, Dataset]; + const actual = (await sut.getFile(testFileId, DatasetNotNumberedVersion.DRAFT, true)) as [ + File, + Dataset + ] - assert.match(actual[0].name, testTextFile1Name); - assert.match(actual[1].id, TestConstants.TEST_CREATED_DATASET_1_ID); - }); + expect(actual[0].name).toBe(testTextFile1Name) + expect(actual[1].id).toBe(TestConstants.TEST_CREATED_DATASET_1_ID) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; - - await sut.getFile(nonExistentFiledId, DatasetNotNumberedVersion.LATEST, false).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.getFile(nonExistentFiledId, DatasetNotNumberedVersion.LATEST, false) + ).rejects.toThrow(expectedError) + }) + }) describe('by persistent id', () => { test('should return file when providing a valid persistent id', async () => { - const actual = (await sut.getFile(testFilePersistentId, DatasetNotNumberedVersion.LATEST, false)) as File; + const actual = (await sut.getFile( + testFilePersistentId, + DatasetNotNumberedVersion.LATEST, + false + )) as File - 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, false)) as File; + const actual = (await sut.getFile( + testFilePersistentId, + DatasetNotNumberedVersion.DRAFT, + false + )) as File - assert.match(actual.name, testTextFile1Name); - }); + expect(actual.name).toBe(testTextFile1Name) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; - - const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId'; - await sut - .getFile(nonExistentFiledPersistentId, DatasetNotNumberedVersion.LATEST, false) - .catch((e) => (error = e)); - - assert.match( - error.message, - `There was an error when reading the resource. Reason was: [404] Datafile with Persistent ID ${nonExistentFiledPersistentId} not found.`, - ); - }); - }); - }); + const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId' + const expectedError = new ReadError( + `[404] Datafile with Persistent ID ${nonExistentFiledPersistentId} not found.` + ) + + await expect( + sut.getFile(nonExistentFiledPersistentId, DatasetNotNumberedVersion.LATEST, false) + ).rejects.toThrow(expectedError) + }) + }) + }) describe('getFileCitation', () => { test('should return citation when file exists', async () => { - const actualFileCitation = await sut.getFileCitation(testFileId, DatasetNotNumberedVersion.LATEST, false); - expect(typeof actualFileCitation).to.be.a('string'); - }); + const actualFileCitation = await sut.getFileCitation( + testFileId, + DatasetNotNumberedVersion.LATEST, + false + ) + + expect(typeof actualFileCitation).toEqual(expect.any(String)) + }) test('should return citation when dataset is deaccessioned', async () => { await publishDatasetViaApi(TestConstants.TEST_CREATED_DATASET_1_ID) .then() .catch(() => { - assert.fail('Error while publishing test Dataset'); - }); + throw new Error('Error while publishing test Dataset') + }) await waitForNoLocks(TestConstants.TEST_CREATED_DATASET_1_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_1_ID, '1.0') .then() .catch(() => { - assert.fail('Error while deaccessioning test Dataset'); - }); + throw new Error('Error while deaccessioning test Dataset') + }) - const actualFileCitation = await sut.getFileCitation(testFileId, DatasetNotNumberedVersion.LATEST, true); - expect(typeof actualFileCitation).to.be.a('string'); - }); + const actualFileCitation = await sut.getFileCitation( + testFileId, + DatasetNotNumberedVersion.LATEST, + true + ) + + expect(typeof actualFileCitation).toEqual(expect.any(String)) + }) test('should return error when file does not exist', async () => { - let error: ReadError = undefined; - await sut.getFileCitation(nonExistentFiledId, DatasetNotNumberedVersion.LATEST, false).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.`, - ); - }); - }); -}); + const errorExpected = new ReadError(`[404] File with ID ${nonExistentFiledId} not found.`) + + await expect( + sut.getFileCitation(nonExistentFiledId, DatasetNotNumberedVersion.LATEST, false) + ).rejects.toThrow(errorExpected) + }) + }) +}) diff --git a/test/integration/info/DataverseInfoRepository.test.ts b/test/integration/info/DataverseInfoRepository.test.ts index a8342df7..ed3e5d98 100644 --- a/test/integration/info/DataverseInfoRepository.test.ts +++ b/test/integration/info/DataverseInfoRepository.test.ts @@ -1,51 +1,52 @@ -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' 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)); - 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; + const testMaxEmbargoDurationInMonths = 12 await setMaxEmbargoDurationInMonthsViaApi(testMaxEmbargoDurationInMonths) - .then() - .catch(() => { - fail('Test getMaxEmbargoDurationInMonths: Error while setting :MaxEmbargoDurationInMonths'); - }); - const actual = await sut.getMaxEmbargoDurationInMonths(); - assert.match(actual, testMaxEmbargoDurationInMonths); - }); - }); -}); + const actual = await sut.getMaxEmbargoDurationInMonths() + + expect(actual).toBe(testMaxEmbargoDurationInMonths) + }) + }) +}) diff --git a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts index b3b1f7dc..ac15c3dd 100644 --- a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts @@ -1,29 +1,35 @@ -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 { + 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)); + const nonExistentMetadataBlockName = 'nonExistentMetadataBlock' + 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 + ) + }) 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); - }); -}); + expect(actual.name).toBe(citationMetadataBlockName) + }) +}) diff --git a/test/integration/users/UsersRepository.test.ts b/test/integration/users/UsersRepository.test.ts index a8e98c16..4592482f 100644 --- a/test/integration/users/UsersRepository.test.ts +++ b/test/integration/users/UsersRepository.test.ts @@ -1,26 +1,29 @@ -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 { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' +import { ReadError } from '../../../src' 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)); - - 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 () => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY); - - const actual = await sut.getCurrentAuthenticatedUser(); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) - assert.match(actual.firstName, 'Dataverse'); - }); -}); + const actual = await sut.getCurrentAuthenticatedUser() + expect(actual.firstName).toBe('Dataverse') + }) +}) diff --git a/test/testHelpers/TestConstants.ts b/test/testHelpers/TestConstants.ts index c637ff3b..9d331efa 100644 --- a/test/testHelpers/TestConstants.ts +++ b/test/testHelpers/TestConstants.ts @@ -1,48 +1,49 @@ 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; - static readonly TEST_CREATED_DATASET_3_ID = 4; + 'Content-Type': 'application/json' + } + } + static readonly TEST_CREATED_DATASET_1_ID = 2 + static readonly TEST_CREATED_DATASET_2_ID = 3 + static readonly TEST_CREATED_DATASET_3_ID = 4 } diff --git a/test/testHelpers/collections/test-collection-1.json b/test/testHelpers/collections/test-collection-1.json index 9391abe0..eaa4bfa8 100644 --- a/test/testHelpers/collections/test-collection-1.json +++ b/test/testHelpers/collections/test-collection-1.json @@ -12,4 +12,4 @@ "affiliation": "Scientific Research University", "description": "We do all the science.", "dataverseType": "LABORATORY" -} \ No newline at end of file +} diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index c8417470..c276d4e5 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -1,25 +1,32 @@ -import { Dataset, DatasetVersionState, DatasetLicense } from '../../../src/datasets/domain/models/Dataset'; -import axios, { AxiosResponse } from 'axios'; -import { TestConstants } from '../TestConstants'; -import { DatasetPayload } from '../../../src/datasets/infra/repositories/transformers/DatasetPayload'; -import { DvObjectType } from '../../../src/core/domain/models/DvObjectOwnerNode'; -import TurndownService from 'turndown'; +import { + Dataset, + DatasetVersionState, + DatasetLicense +} from '../../../src/datasets/domain/models/Dataset' +import axios, { AxiosResponse } from 'axios' +import { TestConstants } from '../TestConstants' +import { DatasetPayload } from '../../../src/datasets/infra/repositories/transformers/DatasetPayload' +import { DvObjectType } from '../../../src/core/domain/models/DvObjectOwnerNode' +import TurndownService from 'turndown' -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 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_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 => { +export const createDatasetModel = ( + license?: DatasetLicense, + addOptionalParameters = false +): Dataset => { const datasetModel: Dataset = { id: 1, persistentId: 'doi:10.5072/FK2/HC6KTB', @@ -30,7 +37,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: [ @@ -41,37 +48,45 @@ 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' + } + ] + } + } ], - isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' }, - }; + isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' } + } if (license !== undefined) { - datasetModel.license = license; + datasetModel.license = license + } + if (addOptionalParameters) { + datasetModel.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB' + datasetModel.publicationDate = '2021-01-01' + datasetModel.citationDate = '2021-01-01' } - return datasetModel; -}; + return datasetModel +} -export const createDatasetVersionPayload = (license?: DatasetLicense): DatasetPayload => { +export const createDatasetVersionPayload = ( + license?: DatasetLicense, + addOptionalProperties = false +): DatasetPayload => { const datasetPayload: DatasetPayload = { id: 19, datasetId: 1, @@ -83,11 +98,6 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): DatasetPa 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', @@ -96,7 +106,7 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): DatasetPa typeName: 'title', multiple: false, typeClass: 'primitive', - value: 'test', + value: 'test' }, { typeName: 'author', @@ -108,36 +118,36 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): DatasetPa 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', @@ -149,10 +159,10 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): DatasetPa typeName: 'dsDescriptionValue', multiple: false, typeClass: 'primitive', - value: DATASET_HTML_DESCRIPTION, - }, - }, - ], + value: DATASET_HTML_DESCRIPTION + } + } + ] }, { typeName: 'datasetContact', @@ -164,88 +174,100 @@ export const createDatasetVersionPayload = (license?: DatasetLicense): DatasetPa 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: [], - isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' }, - }; + isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' } + } if (license !== undefined) { - datasetPayload.license = license; + datasetPayload.license = license + } + if (addOptionalProperties) { + datasetPayload.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB' + datasetPayload.publicationDate = '2021-01-01' + datasetPayload.citationDate = '2021-01-01' } - return datasetPayload; -}; + return datasetPayload +} 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/datasets/newDatasetHelper.ts b/test/testHelpers/datasets/newDatasetHelper.ts index 4ff08439..dd9c8f6f 100644 --- a/test/testHelpers/datasets/newDatasetHelper.ts +++ b/test/testHelpers/datasets/newDatasetHelper.ts @@ -1,6 +1,9 @@ -import { NewDatasetDTO, NewDatasetMetadataFieldValueDTO } from '../../../src/datasets/domain/dtos/NewDatasetDTO'; -import { MetadataBlock } from '../../../src'; -import { NewDatasetRequestPayload } from '../../../src/datasets/infra/repositories/transformers/newDatasetTransformers'; +import { + NewDatasetDTO, + NewDatasetMetadataFieldValueDTO +} from '../../../src/datasets/domain/dtos/NewDatasetDTO' +import { DatasetLicense, MetadataBlock } from '../../../src' +import { NewDatasetRequestPayload } from '../../../src/datasets/infra/repositories/transformers/newDatasetTransformers' export const createNewDatasetDTO = ( titleFieldValue?: NewDatasetMetadataFieldValueDTO, @@ -8,20 +11,22 @@ export const createNewDatasetDTO = ( alternativeRequiredTitleValue?: NewDatasetMetadataFieldValueDTO, timePeriodCoveredStartValue?: NewDatasetMetadataFieldValueDTO, contributorTypeValue?: NewDatasetMetadataFieldValueDTO, + license?: DatasetLicense ): NewDatasetDTO => { - const validTitle = 'test dataset'; + const validTitle = 'test dataset' const validAuthorFieldValue = [ { authorName: 'Admin, Dataverse', - authorAffiliation: 'Dataverse.org', + authorAffiliation: 'Dataverse.org' }, { authorName: 'Owner, Dataverse', - authorAffiliation: 'Dataverse.org', - }, - ]; - const validAlternativeRequiredTitleValue = ['alternative1', 'alternative2']; + authorAffiliation: 'Dataverse.org' + } + ] + const validAlternativeRequiredTitleValue = ['alternative1', 'alternative2'] return { + ...(license && { license }), metadataBlockValues: [ { name: 'citation', @@ -32,20 +37,22 @@ export const createNewDatasetDTO = ( alternativeRequiredTitleValue !== undefined ? alternativeRequiredTitleValue : validAlternativeRequiredTitleValue, - ...(timePeriodCoveredStartValue && { timePeriodCoveredStart: timePeriodCoveredStartValue }), + ...(timePeriodCoveredStartValue && { + timePeriodCoveredStart: timePeriodCoveredStartValue + }), ...(contributorTypeValue && { contributor: [ { contributorName: 'Admin, Dataverse', - contributorType: contributorTypeValue as string, - }, - ], - }), - }, - }, - ], - }; -}; + contributorType: contributorTypeValue as string + } + ] + }) + } + } + ] + } +} export const createNewDatasetDTOWithoutFirstLevelRequiredField = (): NewDatasetDTO => { return { @@ -53,12 +60,12 @@ export const createNewDatasetDTOWithoutFirstLevelRequiredField = (): NewDatasetD { name: 'citation', fields: { - title: 'test dataset', - }, - }, - ], - }; -}; + title: 'test dataset' + } + } + ] + } +} export const createNewDatasetDTOWithoutSecondLevelRequiredField = (): NewDatasetDTO => { return { @@ -70,17 +77,17 @@ export const createNewDatasetDTOWithoutSecondLevelRequiredField = (): NewDataset author: [ { authorName: 'Admin, Dataverse', - authorAffiliation: 'Dataverse.org', + authorAffiliation: 'Dataverse.org' }, { - authorAffiliation: 'Dataverse.org', - }, - ], - }, - }, - ], - }; -}; + authorAffiliation: 'Dataverse.org' + } + ] + } + } + ] + } +} /** * @@ -108,7 +115,7 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', + typeClass: 'primitive' }, author: { name: 'author', @@ -136,7 +143,7 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { displayFormat: '#VALUE', isRequired: true, displayOrder: 2, - typeClass: 'primitive', + typeClass: 'primitive' }, authorAffiliation: { name: 'authorAffiliation', @@ -150,9 +157,9 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { displayFormat: '#VALUE', isRequired: false, displayOrder: 3, - typeClass: 'primitive', - }, - }, + typeClass: 'primitive' + } + } }, alternativeRequiredTitle: { name: 'alternativeRequiredTitle', @@ -160,13 +167,14 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { title: 'Alternative Title', type: 'TEXT', watermark: '', - description: 'Either 1) a title commonly used to refer to the Dataset or 2) an abbreviation of the main title', + description: + 'Either 1) a title commonly used to refer to the Dataset or 2) an abbreviation of the main title', multiple: true, isControlledVocabulary: false, displayFormat: '', isRequired: true, displayOrder: 4, - typeClass: 'primitive', + typeClass: 'primitive' }, timePeriodCoveredStart: { name: 'timePeriodCoveredStart', @@ -180,7 +188,7 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { displayFormat: '#NAME: #VALUE ', isRequired: false, displayOrder: 5, - typeClass: 'primitive', + typeClass: 'primitive' }, contributor: { name: 'contributor', @@ -226,9 +234,9 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { 'Sponsor', 'Supervisor', 'Work Package Leader', - 'Other', + 'Other' ], - typeClass: 'controlledVocabulary', + typeClass: 'controlledVocabulary' }, contributorName: { name: 'contributorName', @@ -236,23 +244,27 @@ export const createNewDatasetMetadataBlockModel = (): MetadataBlock => { title: 'Name', type: 'TEXT', watermark: '1) FamilyName, GivenName or 2) Organization', - description: "The name of the contributor, e.g. the person's name or the name of an organization", + description: + "The name of the contributor, e.g. the person's name or the name of an organization", multiple: false, isControlledVocabulary: false, displayFormat: '#VALUE', isRequired: true, displayOrder: 8, - typeClass: 'primitive', - }, - }, - }, - }, - }; -}; + typeClass: 'primitive' + } + } + } + } + } +} -export const createNewDatasetRequestPayload = (): NewDatasetRequestPayload => { +export const createNewDatasetRequestPayload = ( + license?: DatasetLicense +): NewDatasetRequestPayload => { return { datasetVersion: { + ...(license && { license }), metadataBlocks: { citation: { fields: [ @@ -260,7 +272,7 @@ export const createNewDatasetRequestPayload = (): NewDatasetRequestPayload => { value: 'test dataset', typeClass: 'primitive', multiple: false, - typeName: 'title', + typeName: 'title' }, { value: [ @@ -269,44 +281,44 @@ export const createNewDatasetRequestPayload = (): NewDatasetRequestPayload => { value: 'Admin, Dataverse', typeClass: 'primitive', multiple: false, - typeName: 'authorName', + typeName: 'authorName' }, authorAffiliation: { value: 'Dataverse.org', typeClass: 'primitive', multiple: false, - typeName: 'authorAffiliation', - }, + typeName: 'authorAffiliation' + } }, { authorName: { value: 'Owner, Dataverse', typeClass: 'primitive', multiple: false, - typeName: 'authorName', + typeName: 'authorName' }, authorAffiliation: { value: 'Dataverse.org', typeClass: 'primitive', multiple: false, - typeName: 'authorAffiliation', - }, - }, + typeName: 'authorAffiliation' + } + } ], typeClass: 'compound', multiple: true, - typeName: 'author', + typeName: 'author' }, { value: ['alternative1', 'alternative2'], typeClass: 'primitive', multiple: true, - typeName: 'alternativeRequiredTitle', - }, + typeName: 'alternativeRequiredTitle' + } ], - displayName: 'Citation Metadata', - }, - }, - }, - }; -}; + displayName: 'Citation Metadata' + } + } + } + } +} diff --git a/test/testHelpers/files/fileCountsHelper.ts b/test/testHelpers/files/fileCountsHelper.ts index c863ac2b..7a658aaa 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,41 @@ 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 + } + ] + } +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any 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..330a8e99 100644 --- a/test/testHelpers/files/fileDataTablesHelper.ts +++ b/test/testHelpers/files/fileDataTablesHelper.ts @@ -1,14 +1,15 @@ import { FileDataTable, FileDataVariableIntervalType, - FileDataVariableFormatType, -} from '../../../src/files/domain/models/FileDataTable'; + FileDataVariableFormatType +} from '../../../src/files/domain/models/FileDataTable' export const createFileDataTableModel = (): FileDataTable => { return { varQuantity: 21, caseQuantity: 122, UNF: 'UNF:6:awd/lz8bNdoXn8f1sjAAAQ==', + recordsPerCase: 1, dataVariables: [ { id: 3, @@ -24,8 +25,37 @@ export const createFileDataTableModel = (): FileDataTable => { summaryStatistics: { medn: '28.27591', mode: '.', - min: '27.6741', + 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,17 +67,39 @@ 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 + } + ] + } + ] + } + ] + } +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createFileDataTablePayload = (): any => { return { varQuantity: 21, caseQuantity: 122, UNF: 'UNF:6:awd/lz8bNdoXn8f1sjAAAQ==', + recordsPerCase: 1, dataVariables: [ { id: 3, @@ -63,8 +115,37 @@ export const createFileDataTablePayload = (): any => { summaryStatistics: { medn: '28.27591', mode: '.', - min: '27.6741', + 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, @@ -76,8 +157,28 @@ 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/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 7f9f9542..f8f5e48b 100644 --- a/test/testHelpers/files/filesHelper.ts +++ b/test/testHelpers/files/filesHelper.ts @@ -1,13 +1,13 @@ -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 { DvObjectType } from '../../../src/core/domain/models/DvObjectOwnerNode'; -import { FilePayload } from '../../../src/files/infra/repositories/transformers/FilePayload'; +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 { DvObjectType } from '../../../src/core/domain/models/DvObjectOwnerNode' +import { FilePayload } from '../../../src/files/infra/repositories/transformers/FilePayload' interface FileMetadata { - categories?: string[]; + categories?: string[] } export const createFileModel = (): File => { @@ -29,11 +29,11 @@ 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, @@ -44,21 +44,29 @@ export const createFileModel = (): File => { persistentIdentifier: 'doi:10.5072/FK2/HEGZLV', version: 'DRAFT', displayName: 'First Dataset', - isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' }, + 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') + } +} 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, - }; -}; + totalFilesCount: amount + } +} export const createFilePayload = (): FilePayload => { return { @@ -83,11 +91,11 @@ export const createFilePayload = (): FilePayload => { creationDate: '2023-07-11', embargo: { dateAvailable: '2023-07-11', - reason: 'test', + reason: 'test' }, checksum: { type: 'MD5', - value: '29e413e0c881e17314ce8116fed4d1a7', + value: '29e413e0c881e17314ce8116fed4d1a7' }, deleted: false, tabularData: false, @@ -98,64 +106,76 @@ export const createFilePayload = (): FilePayload => { persistentIdentifier: 'doi:10.5072/FK2/HEGZLV', version: 'DRAFT', displayName: 'First Dataset', - isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' }, + 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' + } + } +} export const createManyFilesPayload = (amount: number): FilePayload[] => { - return Array.from({ length: amount }, () => createFilePayload()); -}; + return Array.from({ length: amount }, () => createFilePayload()) +} export const uploadFileViaApi = async ( datasetId: number, fileName: string, - fileMetadata?: FileMetadata, + fileMetadata?: FileMetadata ): Promise => { - const formData = new FormData(); - const file = await readFile(`${__dirname}/${fileName}`); + 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)); + 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`, { 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, - }, - }) + .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, - }, - }, - ), - ); -}; + '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 28b013be..eec7928b 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 { @@ -18,7 +18,7 @@ export const createMetadataBlockModel = (): MetadataBlock => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', + typeClass: 'primitive' }, testField2: { name: 'testName2', @@ -46,7 +46,7 @@ export const createMetadataBlockModel = (): MetadataBlock => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', + typeClass: 'primitive' }, testField4: { name: 'testName4', @@ -60,14 +60,15 @@ export const createMetadataBlockModel = (): MetadataBlock => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', - }, - }, - }, - }, - }; -}; + typeClass: 'primitive' + } + } + } + } + } +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const createMetadataBlockPayload = (): any => { return { id: 1, @@ -86,7 +87,7 @@ export const createMetadataBlockPayload = (): any => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', + typeClass: 'primitive' }, testField2: { name: 'testName2', @@ -114,7 +115,7 @@ export const createMetadataBlockPayload = (): any => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', + typeClass: 'primitive' }, testField4: { name: 'testName4', @@ -128,10 +129,10 @@ export const createMetadataBlockPayload = (): any => { displayFormat: '#VALUE', isRequired: true, displayOrder: 0, - typeClass: 'primitive', - }, - }, - }, - }, - }; -}; + typeClass: 'primitive' + } + } + } + } + } +} 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/.DS_Store b/test/unit/.DS_Store new file mode 100644 index 00000000..6b5f1ed3 Binary files /dev/null and b/test/unit/.DS_Store differ diff --git a/test/unit/auth/AuthRepository.test.ts b/test/unit/auth/AuthRepository.test.ts index 945f8336..b0261dfa 100644 --- a/test/unit/auth/AuthRepository.test.ts +++ b/test/unit/auth/AuthRepository.test.ts @@ -1,70 +1,67 @@ -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 axios from 'axios' +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 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(); - }); - 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' + } + } + } + jest.spyOn(axios, 'post').mockResolvedValue(testSuccessfulResponse) const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/logout` // API Key auth - await sut.logout(); + await sut.logout() - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( 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, + expect(axios.post).toHaveBeenCalledWith( 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); + jest.spyOn(axios, 'post').mockRejectedValue(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, + 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); - }); -}); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(Error) + }) +}) diff --git a/test/unit/auth/Logout.test.ts b/test/unit/auth/Logout.test.ts index b19a6f6a..e5634e15 100644 --- a/test/unit/auth/Logout.test.ts +++ b/test/unit/auth/Logout.test.ts @@ -1,31 +1,22 @@ -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 { 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 authRepositoryMock = {}; - authRepositoryMock.logout = sandbox.mock(); - const sut = new Logout(authRepositoryMock); - await sut.execute(); - }); + 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 sut = new Logout(authRepositoryStub); - - let actualError: WriteError = undefined; - await sut.execute().catch((e) => (actualError = e)); + const testWriteError = new WriteError() + const authRepositoryStub: IAuthRepository = {} as IAuthRepository + authRepositoryStub.logout = jest.fn().mockRejectedValue(testWriteError) + const sut = new Logout(authRepositoryStub) - assert.match(actualError, testWriteError); - }); -}); + await expect(sut.execute()).rejects.toThrow(testWriteError) + }) +}) diff --git a/test/unit/datasets/CreateDataset.test.ts b/test/unit/datasets/CreateDataset.test.ts index f3f91388..c7996bd9 100644 --- a/test/unit/datasets/CreateDataset.test.ts +++ b/test/unit/datasets/CreateDataset.test.ts @@ -1,125 +1,142 @@ -import { CreateDataset } from '../../../src/datasets/domain/useCases/CreateDataset'; -import { CreatedDatasetIdentifiers } from '../../../src/datasets/domain/models/CreatedDatasetIdentifiers'; -import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'; -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { NewResourceValidator } from '../../../src/core/domain/useCases/validators/NewResourceValidator'; -import { createNewDatasetDTO, createNewDatasetMetadataBlockModel } from '../../testHelpers/datasets/newDatasetHelper'; -import { ResourceValidationError } from '../../../src/core/domain/useCases/validators/errors/ResourceValidationError'; -import { WriteError, ReadError } from '../../../src'; -import { IMetadataBlocksRepository } from '../../../src/metadataBlocks/domain/repositories/IMetadataBlocksRepository'; +import { CreateDataset } from '../../../src/datasets/domain/useCases/CreateDataset' +import { CreatedDatasetIdentifiers } from '../../../src/datasets/domain/models/CreatedDatasetIdentifiers' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { NewResourceValidator } from '../../../src/core/domain/useCases/validators/NewResourceValidator' +import { + createNewDatasetDTO, + createNewDatasetMetadataBlockModel +} from '../../testHelpers/datasets/newDatasetHelper' +import { ResourceValidationError } from '../../../src/core/domain/useCases/validators/errors/ResourceValidationError' +import { WriteError, ReadError } from '../../../src' +import { IMetadataBlocksRepository } from '../../../src/metadataBlocks/domain/repositories/IMetadataBlocksRepository' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testDataset = createNewDatasetDTO(); - const testMetadataBlocks = [createNewDatasetMetadataBlockModel()]; - - afterEach(() => { - sandbox.restore(); - }); + const testDataset = createNewDatasetDTO() + const testMetadataBlocks = [createNewDatasetMetadataBlockModel()] test('should return new dataset identifiers when validation is successful and repository call is successful', async () => { const testCreatedDatasetIdentifiers: CreatedDatasetIdentifiers = { persistentId: 'test', - numericId: 1, - }; - - const datasetsRepositoryStub = {}; - const createDatasetStub = sandbox.stub().returns(testCreatedDatasetIdentifiers); - datasetsRepositoryStub.createDataset = createDatasetStub; - - const newDatasetValidatorStub = {}; - const validateStub = sandbox.stub().resolves(); - newDatasetValidatorStub.validate = validateStub; - - const metadataBlocksRepositoryStub = {}; - const getMetadataBlockByNameStub = sandbox.stub().resolves(testMetadataBlocks[0]); - metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub; - - const sut = new CreateDataset(datasetsRepositoryStub, metadataBlocksRepositoryStub, newDatasetValidatorStub); - - const actual = await sut.execute(testDataset); - - assert.match(actual, testCreatedDatasetIdentifiers); - - assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlocks[0].name); - assert.calledWithExactly(validateStub, testDataset, testMetadataBlocks); - assert.calledWithExactly(createDatasetStub, testDataset, testMetadataBlocks, 'root'); - - assert.callOrder(validateStub, createDatasetStub); - }); + numericId: 1 + } + + const datasetsRepositoryStub = {} + datasetsRepositoryStub.createDataset = jest + .fn() + .mockResolvedValue(testCreatedDatasetIdentifiers) + + const newDatasetValidatorStub = {} + newDatasetValidatorStub.validate = jest.fn().mockResolvedValue(undefined) + + const metadataBlocksRepositoryStub = {} + metadataBlocksRepositoryStub.getMetadataBlockByName = jest + .fn() + .mockResolvedValue(testMetadataBlocks[0]) + + const sut = new CreateDataset( + datasetsRepositoryStub, + metadataBlocksRepositoryStub, + newDatasetValidatorStub + ) + + const actual = await sut.execute(testDataset) + + expect(actual).toEqual(testCreatedDatasetIdentifiers) + + expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith( + testMetadataBlocks[0].name + ) + expect(newDatasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks) + expect(datasetsRepositoryStub.createDataset).toHaveBeenCalledWith( + testDataset, + testMetadataBlocks, + 'root' + ) + }) test('should throw ResourceValidationError and not call repository when validation is unsuccessful', async () => { - const datasetsRepositoryMock = {}; - const createDatasetMock = sandbox.stub(); - datasetsRepositoryMock.createDataset = createDatasetMock; - - const newDatasetValidatorStub = {}; - const testValidationError = new ResourceValidationError('Test error'); - const validateStub = sandbox.stub().throwsException(testValidationError); - newDatasetValidatorStub.validate = validateStub; - - const metadataBlocksRepositoryStub = {}; - const getMetadataBlockByNameStub = sandbox.stub().resolves(testMetadataBlocks[0]); - metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub; - - const sut = new CreateDataset(datasetsRepositoryMock, metadataBlocksRepositoryStub, newDatasetValidatorStub); - let actualError: ResourceValidationError = undefined; - await sut.execute(testDataset).catch((e) => (actualError = e)); - assert.match(actualError, testValidationError); - - assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlocks[0].name); - assert.calledWithExactly(validateStub, testDataset, testMetadataBlocks); - assert.notCalled(createDatasetMock); - }); + const datasetsRepositoryMock = {} + datasetsRepositoryMock.createDataset = jest.fn().mockResolvedValue(undefined) + + const newDatasetValidatorStub = {} + newDatasetValidatorStub.validate = jest.fn().mockImplementation(() => { + throw new ResourceValidationError('Test error') + }) + + const metadataBlocksRepositoryStub = {} + metadataBlocksRepositoryStub.getMetadataBlockByName = jest + .fn() + .mockResolvedValue(testMetadataBlocks[0]) + + const sut = new CreateDataset( + datasetsRepositoryMock, + metadataBlocksRepositoryStub, + newDatasetValidatorStub + ) + + await expect(sut.execute(testDataset)).rejects.toThrow(ResourceValidationError) + + expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith( + testMetadataBlocks[0].name + ) + expect(newDatasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks) + expect(datasetsRepositoryMock.createDataset).not.toHaveBeenCalled() + }) test('should throw WriteError when validation is successful and repository raises an error', async () => { - const datasetsRepositoryStub = {}; - const testWriteError = new WriteError('Test error'); - const createDatasetStub = sandbox.stub().throwsException(testWriteError); - datasetsRepositoryStub.createDataset = createDatasetStub; - - const newDatasetValidatorStub = {}; - const validateMock = sandbox.stub().resolves(); - newDatasetValidatorStub.validate = validateMock; - - const metadataBlocksRepositoryStub = {}; - const getMetadataBlockByNameStub = sandbox.stub().resolves(testMetadataBlocks[0]); - metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub; - - const sut = new CreateDataset(datasetsRepositoryStub, metadataBlocksRepositoryStub, newDatasetValidatorStub); - let actualError: WriteError = undefined; - await sut.execute(testDataset).catch((e) => (actualError = e)); - assert.match(actualError, testWriteError); - - assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlocks[0].name); - assert.calledWithExactly(validateMock, testDataset, testMetadataBlocks); - assert.calledWithExactly(createDatasetStub, testDataset, testMetadataBlocks, 'root'); - - assert.callOrder(validateMock, createDatasetStub); - }); + const datasetsRepositoryStub = {} + const testWriteError = new WriteError('Test error') + datasetsRepositoryStub.createDataset = jest.fn().mockRejectedValue(testWriteError) + + const newDatasetValidatorStub = {} + newDatasetValidatorStub.validate = jest.fn().mockResolvedValue(undefined) + + const metadataBlocksRepositoryStub = {} + metadataBlocksRepositoryStub.getMetadataBlockByName = jest + .fn() + .mockResolvedValue(testMetadataBlocks[0]) + + const sut = new CreateDataset( + datasetsRepositoryStub, + metadataBlocksRepositoryStub, + newDatasetValidatorStub + ) + await expect(sut.execute(testDataset)).rejects.toThrow(testWriteError) + + expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith( + testMetadataBlocks[0].name + ) + expect(newDatasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks) + expect(datasetsRepositoryStub.createDataset).toHaveBeenCalledWith( + testDataset, + testMetadataBlocks, + 'root' + ) + }) test('should throw ReadError when metadata blocks repository raises an error', async () => { - const datasetsRepositoryMock = {}; - const createDatasetMock = sandbox.stub(); - datasetsRepositoryMock.createDataset = createDatasetMock; - - const newDatasetValidatorMock = {}; - const validateMock = sandbox.stub().resolves(); - newDatasetValidatorMock.validate = validateMock; - - const metadataBlocksRepositoryStub = {}; - const testReadError = new ReadError('Test error'); - const getMetadataBlockByNameStub = sandbox.stub().throwsException(testReadError); - metadataBlocksRepositoryStub.getMetadataBlockByName = getMetadataBlockByNameStub; - - const sut = new CreateDataset(datasetsRepositoryMock, metadataBlocksRepositoryStub, newDatasetValidatorMock); - let actualError: ReadError = undefined; - await sut.execute(testDataset).catch((e) => (actualError = e)); - assert.match(actualError, testReadError); - - assert.notCalled(validateMock); - assert.notCalled(createDatasetMock); - - assert.calledWithExactly(getMetadataBlockByNameStub, testMetadataBlocks[0].name); - }); -}); + const datasetsRepositoryMock = {} + datasetsRepositoryMock.createDataset = jest.fn().mockResolvedValue(undefined) + + const newDatasetValidatorMock = {} + newDatasetValidatorMock.validate = jest.fn().mockResolvedValue(undefined) + + const metadataBlocksRepositoryStub = {} + const testReadError = new ReadError('Test error') + metadataBlocksRepositoryStub.getMetadataBlockByName = jest.fn().mockRejectedValue(testReadError) + + const sut = new CreateDataset( + datasetsRepositoryMock, + metadataBlocksRepositoryStub, + newDatasetValidatorMock + ) + await expect(sut.execute(testDataset)).rejects.toThrow(testReadError) + + expect(newDatasetValidatorMock.validate).not.toHaveBeenCalled() + expect(datasetsRepositoryMock.createDataset).not.toHaveBeenCalled() + + expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith( + testMetadataBlocks[0].name + ) + }) +}) diff --git a/test/unit/datasets/DatasetsRepository.test.ts b/test/unit/datasets/DatasetsRepository.test.ts index 539c3cc9..1aee7ed6 100644 --- a/test/unit/datasets/DatasetsRepository.test.ts +++ b/test/unit/datasets/DatasetsRepository.test.ts @@ -1,717 +1,778 @@ -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 axios from 'axios' +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' import { createNewDatasetDTO, createNewDatasetMetadataBlockModel, - createNewDatasetRequestPayload, -} from '../../testHelpers/datasets/newDatasetHelper'; -import { WriteError } from '../../../src'; + createNewDatasetRequestPayload +} from '../../testHelpers/datasets/newDatasetHelper' +import { WriteError } from '../../../src' describe('DatasetsRepository', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: DatasetsRepository = new DatasetsRepository(); + 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); - }); - - afterEach(() => { - sandbox.restore(); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) 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 + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) - const actual = await sut.getDatasetSummaryFieldNames(); + 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); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(Error) + }) + }) describe('getDataset', () => { - const testIncludeDeaccessioned = false; + const testIncludeDeaccessioned = false const expectedRequestConfigApiKey = { - params: { includeDeaccessioned: testIncludeDeaccessioned, excludeFiles: true, returnOwners: true }, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + params: { + includeDeaccessioned: testIncludeDeaccessioned, + excludeFiles: true, + returnOwners: true + }, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } const expectedRequestConfigSessionCookie = { - params: { includeDeaccessioned: testIncludeDeaccessioned, excludeFiles: true, returnOwners: true }, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - }; + params: { + includeDeaccessioned: testIncludeDeaccessioned, + excludeFiles: true, + returnOwners: true + }, + 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}`; + jest.spyOn(axios, 'get').mockResolvedValue(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); + 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, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, testDatasetModel); - }); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + actual = await sut.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned) + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + expect(actual).toStrictEqual(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); - - assert.calledWithExactly( - axiosGetStub, + data: createDatasetVersionPayload(testDatasetLicense) + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionWithLicenseSuccessfulResponse) + + const actual = await sut.getDataset( + testDatasetModel.id, + testVersionId, + testIncludeDeaccessioned + ) + + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`, - expectedRequestConfigApiKey, - ); - assert.match(actual, createDatasetModel(testDatasetLicense)); - }); + expectedRequestConfigApiKey + ) + expect(actual).toStrictEqual(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) + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionWithLicenseSuccessfulResponse) + + 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(testDatasetLicenseWithoutIconUri)) + }) - assert.calledWithExactly( - axiosGetStub, + 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, - ); - assert.match(actual, createDatasetModel(testDatasetLicenseWithoutIconUri)); - }); + expectedRequestConfigApiKey + ) + expect(actual).toStrictEqual(createDatasetModel(undefined, true)) + }) 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)); + 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); - }); - }); + expectedRequestConfigApiKey + ) + 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); - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/:persistentId/versions/${testVersionId}?persistentId=${testDatasetModel.persistentId}`; + jest.spyOn(axios, 'get').mockResolvedValue(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); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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; + let error: ReadError = undefined await sut .getDataset(testDatasetModel.persistentId, testVersionId, testIncludeDeaccessioned) - .catch((e) => (error = e)); + .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); - }); - }); - }); + expectedRequestConfigApiKey + ) + expect(error).toBeInstanceOf(Error) + }) + }) + }) describe('getPrivateUrlDataset', () => { const expectedRequestConfig = { params: { returnOwners: true }, - headers: TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG.headers, - }; + headers: TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG.headers + } 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); + const actual = await sut.getPrivateUrlDataset(testPrivateUrlToken) - assert.calledWithExactly( - axiosGetStub, + expect(axios.get).toHaveBeenCalledWith( `${TestConstants.TEST_API_URL}/datasets/privateUrlDatasetVersion/${testPrivateUrlToken}`, - expectedRequestConfig, - ); - assert.match(actual, testDatasetModel); - }); + expectedRequestConfig + ) + 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)); + 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}`, - expectedRequestConfig, - ); - expect(error).to.be.instanceOf(Error); - }); - }); + expectedRequestConfig + ) + expect(error).toBeInstanceOf(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`; + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( 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 + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( 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 + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED + ) + 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); + 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); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetUserPermissionsResponse) // API Key auth - let actual = await sut.getDatasetUserPermissions(testDatasetModel.id); + 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); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetUserPermissions); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetLocksResponse) // API Key auth - let actual = await sut.getDatasetLocks(testDatasetModel.id); + 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); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetLocks); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testDatasetLocks); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetLocks); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetPreviewsResponse) // API Key auth - let actual = await sut.getAllDatasetPreviews(); + 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); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testDatasetPreviewSubset); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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; + 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); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigApiKeyWithPagination + ) + expect(actual).toStrictEqual(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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookieWithPagination + ) + expect(actual).toStrictEqual(testDatasetPreviewSubset) + }) it('should return dataset previews when providing collection id and response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testDatasetPreviewsResponse); + jest.spyOn(axios, 'get').mockResolvedValue(testDatasetPreviewsResponse) - const testCollectionId = 'testCollectionId'; + const testCollectionId = 'testCollectionId' - // API Key auth - let actual = await sut.getAllDatasetPreviews(undefined, undefined, testCollectionId); + // API Key auth + let actual = await sut.getAllDatasetPreviews(undefined, undefined, testCollectionId) - const expectedRequestParamsWithCollectionId = { - subtree: testCollectionId, - }; + const expectedRequestParamsWithCollectionId = { + subtree: testCollectionId + } - const expectedRequestConfigApiKeyWithCollectionId = { - params: expectedRequestParamsWithCollectionId, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + const expectedRequestConfigApiKeyWithCollectionId = { + params: expectedRequestParamsWithCollectionId, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithCollectionId); - assert.match(actual, testDatasetPreviewSubset); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigApiKeyWithCollectionId + ) + expect(actual).toStrictEqual(testDatasetPreviewSubset) - // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + // Session cookie auth + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.getAllDatasetPreviews(undefined, undefined, testCollectionId); + actual = await sut.getAllDatasetPreviews(undefined, undefined, testCollectionId) - const expectedRequestConfigSessionCookieWithCollectionId = { - params: expectedRequestParamsWithCollectionId, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, - withCredentials: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials, - }; + const expectedRequestConfigSessionCookieWithCollectionId = { + params: expectedRequestParamsWithCollectionId, + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials + } - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookieWithCollectionId); - assert.match(actual, testDatasetPreviewSubset); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookieWithCollectionId + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(Error) + }) + }) describe('createDataset', () => { - const testNewDataset = createNewDatasetDTO(); - const testMetadataBlocks = [createNewDatasetMetadataBlockModel()]; - const testCollectionName = 'test'; - const expectedNewDatasetRequestPayloadJson = JSON.stringify(createNewDatasetRequestPayload()); + const testNewDataset = createNewDatasetDTO() + const testMetadataBlocks = [createNewDatasetMetadataBlockModel()] + const testCollectionName = 'test' + const expectedNewDatasetRequestPayloadJson = JSON.stringify(createNewDatasetRequestPayload()) const testCreatedDatasetIdentifiers = { persistentId: 'test', - numericId: 1, - }; + numericId: 1 + } const testCreateDatasetResponse = { data: { status: 'OK', data: { id: testCreatedDatasetIdentifiers.numericId, - persistentId: testCreatedDatasetIdentifiers.persistentId, - }, - }, - }; + persistentId: testCreatedDatasetIdentifiers.persistentId + } + } + } - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/dataverses/${testCollectionName}/datasets`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/dataverses/${testCollectionName}/datasets` test('should call the API with a correct request payload', async () => { - const axiosPostStub = sandbox.stub(axios, 'post').resolves(testCreateDatasetResponse); + jest.spyOn(axios, 'post').mockResolvedValue(testCreateDatasetResponse) // API Key auth - let actual = await sut.createDataset(testNewDataset, testMetadataBlocks, testCollectionName); + let actual = await sut.createDataset(testNewDataset, testMetadataBlocks, testCollectionName) - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( expectedApiEndpoint, expectedNewDatasetRequestPayloadJson, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - - assert.match(actual, testCreatedDatasetIdentifiers); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(testCreatedDatasetIdentifiers) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) - actual = await sut.createDataset(testNewDataset, testMetadataBlocks, testCollectionName); + actual = await sut.createDataset(testNewDataset, testMetadataBlocks, testCollectionName) - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( expectedApiEndpoint, expectedNewDatasetRequestPayloadJson, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - - assert.match(actual, testCreatedDatasetIdentifiers); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + expect(actual).toStrictEqual(testCreatedDatasetIdentifiers) + }) 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.createDataset(testNewDataset, testMetadataBlocks, testCollectionName).catch((e) => (error = e)); + let error: WriteError = undefined + await sut + .createDataset(testNewDataset, testMetadataBlocks, testCollectionName) + .catch((e) => (error = e)) - assert.calledWithExactly( - axiosPostStub, + expect(axios.post).toHaveBeenCalledWith( expectedApiEndpoint, expectedNewDatasetRequestPayloadJson, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - expect(error).to.be.instanceOf(Error); - }); - }); -}); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(Error) + }) + }) +}) diff --git a/test/unit/datasets/GetAllDatasetPreviews.test.ts b/test/unit/datasets/GetAllDatasetPreviews.test.ts index 332fb933..6455d466 100644 --- a/test/unit/datasets/GetAllDatasetPreviews.test.ts +++ b/test/unit/datasets/GetAllDatasetPreviews.test.ts @@ -1,65 +1,59 @@ -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 { 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 sut = new GetAllDatasetPreviews(datasetsRepositoryStub); + const testDatasetPreviews: DatasetPreview[] = [createDatasetPreviewModel()] + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getAllDatasetPreviews = jest.fn().mockResolvedValue(testDatasetPreviews) + const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - const actual = await sut.execute(); + const actual = await sut.execute() - assert.match(actual, testDatasetPreviews); - assert.calledWithExactly(getAllDatasetPreviewsStub, undefined, undefined, undefined); - }); + expect(actual).toEqual(testDatasetPreviews) + expect(datasetsRepositoryStub.getAllDatasetPreviews).toHaveBeenCalledWith( + undefined, + undefined, + undefined + ) + }) test('should return dataset previews with limit and offset 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: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getAllDatasetPreviews = jest.fn().mockResolvedValue(testDatasetPreviews) + const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - const actual = await sut.execute(10, 20); + const actual = await sut.execute(10, 20) - assert.match(actual, testDatasetPreviews); - assert.calledWithExactly(getAllDatasetPreviewsStub, 10, 20, undefined); - }); + expect(actual).toEqual(testDatasetPreviews) + expect(datasetsRepositoryStub.getAllDatasetPreviews).toHaveBeenCalledWith(10, 20, undefined) + }) test('should return dataset previews with limit, offset, and collectionId 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: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getAllDatasetPreviews = jest.fn().mockResolvedValue(testDatasetPreviews) + const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - const actual = await sut.execute(10, 20, 'collectionId'); + const actual = await sut.execute(10, 20, 'collectionId') - assert.match(actual, testDatasetPreviews); - assert.calledWithExactly(getAllDatasetPreviewsStub, 10, 20, 'collectionId'); - }); + expect(actual).toEqual(testDatasetPreviews) + expect(datasetsRepositoryStub.getAllDatasetPreviews).toHaveBeenCalledWith( + 10, + 20, + 'collectionId' + ) + }) 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); - - let actualError: ReadError = undefined; - await sut.execute().catch((e: ReadError) => (actualError = e)); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getAllDatasetPreviews = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetAllDatasetPreviews(datasetsRepositoryStub) - 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 672feaf2..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'; +import { GetDataset } from '../../../src/datasets/domain/useCases/GetDataset' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' 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 sut = new GetDataset(datasetsRepositoryStub); + const testDataset = createDatasetModel() + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDataset = jest.fn().mockResolvedValue(testDataset) + 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); - }); + 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 sut = new GetDataset(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(1).catch((e) => (actualError = e)); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDataset = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetDataset(datasetsRepositoryStub) - 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 580d96b1..e8cd9653 100644 --- a/test/unit/datasets/GetDatasetCitation.test.ts +++ b/test/unit/datasets/GetDatasetCitation.test.ts @@ -1,40 +1,26 @@ -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' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testId = 1; - - afterEach(() => { - sandbox.restore(); - }); + const testId = 1 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 sut = new GetDatasetCitation(datasetsRepositoryStub); + const testCitation = 'test citation' + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetCitation = jest.fn().mockResolvedValue(testCitation) + 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); - }); + 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 sut = new GetDatasetCitation(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testId).catch((e) => (actualError = e)); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetCitation = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetDatasetCitation(datasetsRepositoryStub) - 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 51736543..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'; +import { GetDatasetLocks } from '../../../src/datasets/domain/useCases/GetDatasetLocks' +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(); - }); + const testDatasetId = 1 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: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetLocks = jest.fn().mockResolvedValue(testDatasetLocks) + 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); - }); + 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 sut = new GetDatasetLocks(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetLocks = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetDatasetLocks(datasetsRepositoryStub) - 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 c661cc29..2d0a10b5 100644 --- a/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts +++ b/test/unit/datasets/GetDatasetSummaryFieldNames.test.ts @@ -1,35 +1,26 @@ -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' 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 = {}; - datasetsRepositoryStub.getDatasetSummaryFieldNames = sandbox.stub().returns(testFieldNames); - const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub); + const testFieldNames = ['test1', 'test2'] + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetSummaryFieldNames = jest.fn().mockResolvedValue(testFieldNames) + const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub) - const actual = await sut.execute(); + 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 sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetSummaryFieldNames = jest + .fn() + .mockRejectedValue(new ReadError()) + const sut = new GetDatasetSummaryFieldNames(datasetsRepositoryStub) + + await expect(sut.execute()).rejects.toThrow(ReadError) + }) +}) diff --git a/test/unit/datasets/GetDatasetUserPermissions.test.ts b/test/unit/datasets/GetDatasetUserPermissions.test.ts index 6a72f889..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'; +import { GetDatasetUserPermissions } from '../../../src/datasets/domain/useCases/GetDatasetUserPermissions' +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 sut = new GetDatasetUserPermissions(datasetsRepositoryStub); + const testDatasetUserPermissions = createDatasetUserPermissionsModel() + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetUserPermissions = jest + .fn() + .mockResolvedValue(testDatasetUserPermissions) + 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); - }); + 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 sut = new GetDatasetUserPermissions(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testDatasetId).catch((e: ReadError) => (actualError = e)); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getDatasetUserPermissions = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetDatasetUserPermissions(datasetsRepositoryStub) - 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 7f34232f..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'; +import { GetPrivateUrlDataset } from '../../../src/datasets/domain/useCases/GetPrivateUrlDataset' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +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(); - }); + const testPrivateUrlToken = 'token' 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: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDataset = jest.fn().mockResolvedValue(testDataset) + 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); - }); + 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 sut = new GetPrivateUrlDataset(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const testReadError = new ReadError() + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDataset = jest.fn().mockRejectedValue(testReadError) + const sut = new GetPrivateUrlDataset(datasetsRepositoryStub) + + 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 8aaac6a2..f27365ac 100644 --- a/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts +++ b/test/unit/datasets/GetPrivateUrlDatasetCitation.test.ts @@ -1,39 +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'; +import { GetPrivateUrlDatasetCitation } from '../../../src/datasets/domain/useCases/GetPrivateUrlDatasetCitation' +import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testPrivateUrlToken = 'token'; - - afterEach(() => { - sandbox.restore(); - }); - + const testPrivateUrlToken = 'token' 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 sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub); + const testCitation = 'test citation' + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDatasetCitation = jest.fn().mockResolvedValue(testCitation) + 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); - }); + 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 sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testPrivateUrlToken).catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository + datasetsRepositoryStub.getPrivateUrlDatasetCitation = jest + .fn() + .mockRejectedValue(new ReadError()) + const sut = new GetPrivateUrlDatasetCitation(datasetsRepositoryStub) + + await expect(sut.execute(testPrivateUrlToken)).rejects.toThrow(ReadError) + }) +}) diff --git a/test/unit/datasets/NewDatasetResourceValidator.test.ts b/test/unit/datasets/NewDatasetResourceValidator.test.ts index 3c0e1c59..200263c7 100644 --- a/test/unit/datasets/NewDatasetResourceValidator.test.ts +++ b/test/unit/datasets/NewDatasetResourceValidator.test.ts @@ -1,196 +1,201 @@ -import { NewDatasetResourceValidator } from '../../../src/datasets/domain/useCases/validators/NewDatasetResourceValidator'; -import { assert } from 'sinon'; +import { NewDatasetResourceValidator } from '../../../src/datasets/domain/useCases/validators/NewDatasetResourceValidator' import { createNewDatasetDTO, createNewDatasetMetadataBlockModel, - createNewDatasetDTOWithoutFirstLevelRequiredField, -} from '../../testHelpers/datasets/newDatasetHelper'; -import { fail } from 'assert'; -import { EmptyFieldError } from '../../../src/datasets/domain/useCases/validators/errors/EmptyFieldError'; -import { FieldValidationError } from '../../../src/datasets/domain/useCases/validators/errors/FieldValidationError'; -import { NewDatasetDTO, NewDatasetMetadataFieldValueDTO } from '../../../src/datasets/domain/dtos/NewDatasetDTO'; -import { SingleMetadataFieldValidator } from '../../../src/datasets/domain/useCases/validators/SingleMetadataFieldValidator'; -import { MetadataFieldValidator } from '../../../src/datasets/domain/useCases/validators/MetadataFieldValidator'; -import { MultipleMetadataFieldValidator } from '../../../src/datasets/domain/useCases/validators/MultipleMetadataFieldValidator'; + createNewDatasetDTOWithoutFirstLevelRequiredField +} from '../../testHelpers/datasets/newDatasetHelper' +import { FieldValidationError } from '../../../src/datasets/domain/useCases/validators/errors/FieldValidationError' +import { NewDatasetDTO } from '../../../src/datasets/domain/dtos/NewDatasetDTO' +import { SingleMetadataFieldValidator } from '../../../src/datasets/domain/useCases/validators/SingleMetadataFieldValidator' +import { MetadataFieldValidator } from '../../../src/datasets/domain/useCases/validators/MetadataFieldValidator' +import { MultipleMetadataFieldValidator } from '../../../src/datasets/domain/useCases/validators/MultipleMetadataFieldValidator' describe('validate', () => { - const testMetadataBlocks = [createNewDatasetMetadataBlockModel()]; + const testMetadataBlocks = [createNewDatasetMetadataBlockModel()] - const singleMetadataFieldValidator = new SingleMetadataFieldValidator(); + const singleMetadataFieldValidator = new SingleMetadataFieldValidator() const metadataFieldValidator = new MetadataFieldValidator( new SingleMetadataFieldValidator(), - new MultipleMetadataFieldValidator(singleMetadataFieldValidator), - ); - const sut = new NewDatasetResourceValidator(metadataFieldValidator); + new MultipleMetadataFieldValidator(singleMetadataFieldValidator) + ) + const sut = new NewDatasetResourceValidator(metadataFieldValidator) - async function runValidateExpectingFieldValidationError( + const runValidateExpectingFieldValidationError = ( newDataset: NewDatasetDTO, expectedMetadataFieldName: string, expectedErrorMessage: string, expectedParentMetadataFieldName?: string, - expectedPosition?: number, - ): Promise { - await sut - .validate(newDataset, testMetadataBlocks) - .then(() => { - fail('Validation should fail'); - }) - .catch((error) => { - const fieldValidationError = error as T; - assert.match(fieldValidationError.citationBlockName, 'citation'); - assert.match(fieldValidationError.metadataFieldName, expectedMetadataFieldName); - assert.match(fieldValidationError.parentMetadataFieldName, expectedParentMetadataFieldName); - assert.match(fieldValidationError.fieldPosition, expectedPosition); - assert.match(fieldValidationError.message, expectedErrorMessage); - }); + expectedPosition?: number + ) => { + try { + sut.validate(newDataset, testMetadataBlocks) + throw new Error('Validation should fail') + } catch (error) { + expect(error).toBeInstanceOf(FieldValidationError) + expect(error.citationBlockName).toEqual('citation') + expect(error.metadataFieldName).toEqual(expectedMetadataFieldName) + expect(error.parentMetadataFieldName).toEqual(expectedParentMetadataFieldName) + expect(error.fieldPosition).toEqual(expectedPosition) + expect(error.message).toEqual(expectedErrorMessage) + } } - test('should not raise a validation error when a new dataset with only the required fields is valid', async () => { - const testNewDataset = createNewDatasetDTO(); - await sut.validate(testNewDataset, testMetadataBlocks).catch((e) => fail(e)); - }); + test('should not raise a validation error when a new dataset with only the required fields is valid', () => { + const testNewDataset = createNewDatasetDTO() + expect(() => sut.validate(testNewDataset, testMetadataBlocks)).not.toThrow() + }) - test('should raise an empty field error when a first level required string field is missing', async () => { - await runValidateExpectingFieldValidationError( + test('should raise an empty field error when a first level required string field is missing', () => { + expect.assertions(6) + runValidateExpectingFieldValidationError( createNewDatasetDTOWithoutFirstLevelRequiredField(), 'author', - 'There was an error when validating the field author from metadata block citation. Reason was: The field should not be empty.', - ); - }); - - test('should raise an empty field error when a first level required array field is empty', async () => { - const invalidAuthorFieldValue: NewDatasetMetadataFieldValueDTO = []; - const testNewDataset = createNewDatasetDTO(undefined, invalidAuthorFieldValue, undefined); - await runValidateExpectingFieldValidationError( + 'There was an error when validating the field author from metadata block citation. Reason was: The field should not be empty.' + ) + }) + + test('should raise an empty field error when a first level required array field is empty', () => { + expect.assertions(6) + const testNewDataset = createNewDatasetDTO(undefined, [], undefined) + runValidateExpectingFieldValidationError( testNewDataset, 'author', - 'There was an error when validating the field author from metadata block citation. Reason was: The field should not be empty.', - ); - }); - - test('should raise an error when the provided field value for an unique field is an array', async () => { - const invalidTitleFieldValue = ['title1', 'title2']; - const testNewDataset = createNewDatasetDTO(invalidTitleFieldValue, undefined, undefined); - await runValidateExpectingFieldValidationError( + 'There was an error when validating the field author from metadata block citation. Reason was: The field should not be empty.' + ) + }) + + test('should raise an error when the provided field value for a unique field is an array', () => { + expect.assertions(6) + const testNewDataset = createNewDatasetDTO(['title1', 'title2'], undefined, undefined) + runValidateExpectingFieldValidationError( testNewDataset, 'title', - 'There was an error when validating the field title from metadata block citation. Reason was: Expecting a single field, not an array.', - ); - }); - - test('should raise an error when the provided field value is an object and the field expects a string', async () => { - const invalidTitleFieldValue = { - invalidChildField1: 'invalid value 1', - invalidChildField2: 'invalid value 2', - }; - const testNewDataset = createNewDatasetDTO(invalidTitleFieldValue, undefined, undefined); - await runValidateExpectingFieldValidationError( + 'There was an error when validating the field title from metadata block citation. Reason was: Expecting a single field, not an array.' + ) + }) + + test('should raise an error when the provided field value is an object and the field expects a string', () => { + const testNewDataset = createNewDatasetDTO( + { invalidChildField1: 'invalid value 1', invalidChildField2: 'invalid value 2' }, + undefined, + undefined + ) + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'title', - 'There was an error when validating the field title from metadata block citation. Reason was: Expecting a string, not child fields.', - ); - }); - - test('should raise an error when the provided field value for a multiple field is a string', async () => { - const invalidAuthorFieldValue = 'invalidValue'; - const testNewDataset = createNewDatasetDTO(undefined, invalidAuthorFieldValue, undefined); - await runValidateExpectingFieldValidationError( + 'There was an error when validating the field title from metadata block citation. Reason was: Expecting a string, not child fields.' + ) + }) + + test('should raise an error when the provided field value for a multiple field is a string', () => { + const testNewDataset = createNewDatasetDTO(undefined, 'invalidValue', undefined) + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'author', - 'There was an error when validating the field author from metadata block citation. Reason was: Expecting an array of values.', - ); - }); - - test('should raise an error when the provided field value is an array of strings and the field expects an array of objects', async () => { - const invalidAuthorFieldValue = ['invalidValue1', 'invalidValue2']; - const testNewDataset = createNewDatasetDTO(undefined, invalidAuthorFieldValue, undefined); - await runValidateExpectingFieldValidationError( + 'There was an error when validating the field author from metadata block citation. Reason was: Expecting an array of values.' + ) + }) + + test('should raise an error when the provided field value is an array of strings and the field expects an array of objects', () => { + const invalidAuthorFieldValue = ['invalidValue1', 'invalidValue2'] + const testNewDataset = createNewDatasetDTO(undefined, invalidAuthorFieldValue, undefined) + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'author', - 'There was an error when validating the field author from metadata block citation. Reason was: Expecting an array of child fields, not strings', - ); - }); + 'There was an error when validating the field author from metadata block citation. Reason was: Expecting an array of child fields, not strings.' + ) + }) - test('should raise an error when the provided field value is an array of objects and the field expects an array of strings', async () => { + test('should raise an error when the provided field value is an array of objects and the field expects an array of strings', () => { const invalidAlternativeTitleFieldValue = [ - { - invalidChildField1: 'invalid value 1', - invalidChildField2: 'invalid value 2', - }, - { - invalidChildField1: 'invalid value 1', - invalidChildField2: 'invalid value 2', - }, - ]; - const testNewDataset = createNewDatasetDTO(undefined, undefined, invalidAlternativeTitleFieldValue); - await runValidateExpectingFieldValidationError( + { invalidChildField1: 'invalid value 1', invalidChildField2: 'invalid value 2' }, + { invalidChildField1: 'invalid value 1', invalidChildField2: 'invalid value 2' } + ] + const testNewDataset = createNewDatasetDTO( + undefined, + undefined, + invalidAlternativeTitleFieldValue + ) + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'alternativeRequiredTitle', - 'There was an error when validating the field alternativeRequiredTitle from metadata block citation. Reason was: Expecting an array of strings, not child fields', - ); - }); + 'There was an error when validating the field alternativeRequiredTitle from metadata block citation. Reason was: Expecting an array of strings, not child fields.' + ) + }) - test('should raise an empty field error when a required child field is missing', async () => { + test('should raise an empty field error when a required child field is missing', () => { const invalidAuthorFieldValue = [ - { - authorName: 'Admin, Dataverse', - authorAffiliation: 'Dataverse.org', - }, - { - authorAffiliation: 'Dataverse.org', - }, - ]; - const testNewDataset = createNewDatasetDTO(undefined, invalidAuthorFieldValue, undefined); - await runValidateExpectingFieldValidationError( + { authorName: 'Admin, Dataverse', authorAffiliation: 'Dataverse.org' }, + { authorAffiliation: 'Dataverse.org' } + ] + const testNewDataset = createNewDatasetDTO(undefined, invalidAuthorFieldValue, undefined) + + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'authorName', 'There was an error when validating the field authorName from metadata block citation with parent field author in position 1. Reason was: The field should not be empty.', 'author', - 1, - ); - }); + 1 + ) + }) - test('should not raise an empty field error when a not required child field is missing', async () => { + test('should not raise an empty field error when a not required child field is missing', () => { const authorFieldValue = [ - { - authorName: 'Admin, Dataverse', - authorAffiliation: 'Dataverse.org', - }, - { - authorName: 'John, Doe', - }, - ]; - const testNewDataset = createNewDatasetDTO(undefined, authorFieldValue, undefined); - await sut.validate(testNewDataset, testMetadataBlocks).catch((e) => fail(e)); - }); - - test('should raise a date format validation error when a date field has an invalid format', async () => { - const testNewDataset = createNewDatasetDTO(undefined, undefined, undefined, '1-1-2020'); - await runValidateExpectingFieldValidationError( + { authorName: 'Admin, Dataverse', authorAffiliation: 'Dataverse.org' }, + { authorName: 'John, Doe' } + ] + const testNewDataset = createNewDatasetDTO(undefined, authorFieldValue, undefined) + expect(() => sut.validate(testNewDataset, testMetadataBlocks)).not.toThrow() + }) + + test('should raise a date format validation error when a date field has an invalid format', () => { + const testNewDataset = createNewDatasetDTO(undefined, undefined, undefined, '1-1-2020') + + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'timePeriodCoveredStart', - 'There was an error when validating the field timePeriodCoveredStart from metadata block citation. Reason was: The field requires a valid date format (YYYY-MM-DD).', - ); - }); - - test('should not raise a date format validation error when a date field has a valid format', async () => { - const testNewDataset = createNewDatasetDTO(undefined, undefined, undefined, '2020-01-01'); - await sut.validate(testNewDataset, testMetadataBlocks).catch((e) => fail(e)); - }); - - test('should raise a controlled vocabulary error when a controlled vocabulary field has an invalid format', async () => { - const testNewDataset = createNewDatasetDTO(undefined, undefined, undefined, undefined, 'Wrong Value'); - await runValidateExpectingFieldValidationError( + 'There was an error when validating the field timePeriodCoveredStart from metadata block citation. Reason was: The field requires a valid date format (YYYY-MM-DD).' + ) + }) + + test('should not raise a date format validation error when a date field has a valid format', () => { + const testNewDataset = createNewDatasetDTO(undefined, undefined, undefined, '2020-01-01') + expect(() => sut.validate(testNewDataset, testMetadataBlocks)).not.toThrow() + }) + + test('should raise a controlled vocabulary error when a controlled vocabulary field has an invalid format', () => { + const testNewDataset = createNewDatasetDTO( + undefined, + undefined, + undefined, + undefined, + 'Wrong Value' + ) + + expect.assertions(6) + runValidateExpectingFieldValidationError( testNewDataset, 'contributorType', 'There was an error when validating the field contributorType from metadata block citation with parent field contributor. Reason was: The field does not have a valid controlled vocabulary value.', 'contributor', - 0, - ); - }); - - test('should not raise a controlled vocabulary error when the value for a controlled vocabulary field is correct', async () => { - const testNewDataset = createNewDatasetDTO(undefined, undefined, undefined, undefined, 'Project Member'); - await sut.validate(testNewDataset, testMetadataBlocks).catch((e) => fail(e)); - }); -}); + 0 + ) + }) + + test('should not raise a controlled vocabulary error when the value for a controlled vocabulary field is correct', () => { + const testNewDataset = createNewDatasetDTO( + undefined, + undefined, + undefined, + undefined, + 'Project Member' + ) + expect(() => sut.validate(testNewDataset, testMetadataBlocks)).not.toThrow() + }) +}) diff --git a/test/unit/datasets/newDatasetTransformers.test.ts b/test/unit/datasets/newDatasetTransformers.test.ts index 93e19d9b..0ad1525f 100644 --- a/test/unit/datasets/newDatasetTransformers.test.ts +++ b/test/unit/datasets/newDatasetTransformers.test.ts @@ -1,17 +1,36 @@ -import { assert } from 'sinon'; import { createNewDatasetMetadataBlockModel, createNewDatasetDTO, - createNewDatasetRequestPayload, -} from '../../testHelpers/datasets/newDatasetHelper'; -import { transformNewDatasetModelToRequestPayload } from '../../../src/datasets/infra/repositories/transformers/newDatasetTransformers'; + 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 () => { - const testNewDataset = createNewDatasetDTO(); - const testMetadataBlocks = [createNewDatasetMetadataBlockModel()]; - const expectedNewDatasetRequestPayload = createNewDatasetRequestPayload(); - const actual = transformNewDatasetModelToRequestPayload(testNewDataset, testMetadataBlocks); - assert.match(actual, expectedNewDatasetRequestPayload); - }); -}); + const testNewDataset = createNewDatasetDTO() + const testMetadataBlocks = [createNewDatasetMetadataBlockModel()] + const expectedNewDatasetRequestPayload = createNewDatasetRequestPayload() + const actual = transformNewDatasetModelToRequestPayload(testNewDataset, testMetadataBlocks) + + 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) + }) +}) diff --git a/test/unit/files/FilesRepository.test.ts b/test/unit/files/FilesRepository.test.ts index 8cc97a5e..373979fd 100644 --- a/test/unit/files/FilesRepository.test.ts +++ b/test/unit/files/FilesRepository.test.ts @@ -1,72 +1,89 @@ -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 axios from 'axios' +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'; + 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' 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 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); - }); - - afterEach(() => { - sandbox.restore(); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) 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 +93,52 @@ 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); + jest.spyOn(axios, 'get').mockResolvedValue(testFilesSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFiles( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileOrderCriteria, - ); + 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); + 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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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, @@ -127,59 +147,70 @@ describe('FilesRepository', () => { testFileOrderCriteria, testLimit, testOffset, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedFiles); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + 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; + 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); - }); - }); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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, @@ -188,175 +219,207 @@ describe('FilesRepository', () => { testFileOrderCriteria, testLimit, testOffset, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedFiles); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + 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; + 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); - }); - }); - }); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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, testDatasetVersionId, testIncludeDeaccessioned, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedCount); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + 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; + 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); - }); - }); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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; + 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); - }); - }); - }); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(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,557 +427,565 @@ 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); + jest.spyOn(axios, 'get').mockResolvedValue(testFilesTotalDownloadSizeSuccessfulResponse) // API Key auth let actual = await sut.getDatasetFilesTotalDownloadSize( testDatasetId, testDatasetVersionId, testIncludeDeaccessioned, - testFileDownloadSizeMode, - ); + 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); + 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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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, testDatasetVersionId, testIncludeDeaccessioned, testFileDownloadSizeMode, - testFileCriteria, - ); + testFileCriteria + ) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKeyWithOptional); - assert.match(actual, expectedSize); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigApiKeyWithOptional + ) + 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; + 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); - }); - }); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toStrictEqual(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); - }); + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + 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; + 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); - }); - }); - }); + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(testFileDownloadCountResponse) // API Key auth - let actual = await sut.getFileDownloadCount(testFile.id); + 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); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testCount); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testCount); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testCount); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(testFileUserPermissionsResponse) // API Key auth - let actual = await sut.getFileUserPermissions(testFile.id); + 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); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testFileUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, testFileUserPermissions); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, testFileUserPermissions); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(testGetFileDataTablesResponse) // API Key auth - let actual = await sut.getFileDataTables(testFile.id); + 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); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, expectedDataTables); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(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); + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - assert.match(actual, expectedDataTables); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toStrictEqual(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - assert.match(actual, expectedDataTables); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); - }); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(Error) + }) + }) + }) + describe('getFile', () => { + const testGetFileResponse = { + data: { + status: 'OK', + data: createFilePayload() + } + } + const expectedRequestParams = { returnDatasetVersion: false, returnOwners: true - }; + } const expectedRequestConfigApiKey = { params: expectedRequestParams, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers + } const expectedRequestConfigSessionCookie = { params: expectedRequestParams, - headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY.headers, - }; - - const testGetFileResponse = { - data: { - status: 'OK', - data: createFilePayload(), - }, - }; + headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers, + withCredentials: + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials + } describe('by numeric id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/versions/${DatasetNotNumberedVersion.LATEST}`; + beforeEach(() => { + jest.clearAllMocks() + }) + + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/versions/${DatasetNotNumberedVersion.LATEST}` + 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, false); - - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, createFileModel()); + let actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST, false) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toEqual(createFileModel()) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - - actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST, false); - - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, createFileModel()); - }); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + actual = await sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST, false) + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + expect(actual).toEqual(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, false).catch((e) => (error = e)); + await expect( + sut.getFile(testFile.id, DatasetNotNumberedVersion.LATEST, false) + ).rejects.toThrow(ReadError) + }) + }) - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); describe('by persistent id', () => { - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/versions/${DatasetNotNumberedVersion.LATEST}?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}`; + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/:persistentId/versions/${DatasetNotNumberedVersion.LATEST}?persistentId=${TestConstants.TEST_DUMMY_PERSISTENT_ID}` + 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(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST, false); - - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - assert.match(actual, createFileModel()); + let actual = await sut.getFile( + TestConstants.TEST_DUMMY_PERSISTENT_ID, + DatasetNotNumberedVersion.LATEST, + false + ) + expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey) + expect(actual).toEqual(createFileModel()) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - - actual = await sut.getFile(TestConstants.TEST_DUMMY_PERSISTENT_ID, DatasetNotNumberedVersion.LATEST, false); - - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigSessionCookie); - assert.match(actual, createFileModel()); - }); + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + actual = await sut.getFile( + TestConstants.TEST_DUMMY_PERSISTENT_ID, + DatasetNotNumberedVersion.LATEST, + false + ) + expect(axios.get).toHaveBeenCalledWith( + expectedApiEndpoint, + expectedRequestConfigSessionCookie + ) + expect(actual).toEqual(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, false) - .catch((e) => (error = e)); - - assert.calledWithExactly(axiosGetStub, expectedApiEndpoint, expectedRequestConfigApiKey); - expect(error).to.be.instanceOf(Error); - }); - }); - }); + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) + await expect( + sut.getFile( + TestConstants.TEST_DUMMY_PERSISTENT_ID, + DatasetNotNumberedVersion.LATEST, + false + ) + ).rejects.toThrow(ReadError) + }) + }) + }) describe('getFileCitation', () => { - const testIncludeDeaccessioned = true; - const testCitation = 'test citation'; + const testIncludeDeaccessioned = true + const testCitation = 'test citation' const testCitationSuccessfulResponse = { data: { status: 'OK', data: { - message: testCitation, - }, - }, - }; + message: testCitation + } + } + } + test('should return citation when response is successful', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').resolves(testCitationSuccessfulResponse); - const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/versions/${DatasetNotNumberedVersion.LATEST}/citation`; + jest.spyOn(axios, 'get').mockResolvedValue(testCitationSuccessfulResponse) + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/files/${testFile.id}/versions/${DatasetNotNumberedVersion.LATEST}/citation` // API Key auth - let actual = await sut.getFileCitation(testFile.id, DatasetNotNumberedVersion.LATEST, testIncludeDeaccessioned); - - assert.calledWithExactly( - axiosGetStub, + let actual = await sut.getFileCitation( + testFile.id, + DatasetNotNumberedVersion.LATEST, + testIncludeDeaccessioned + ) + expect(axios.get).toHaveBeenCalledWith( 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 + ) + expect(actual).toEqual(testCitation) // Session cookie auth - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE); - - actual = await sut.getFileCitation(testFile.id, DatasetNotNumberedVersion.LATEST, testIncludeDeaccessioned); - - assert.calledWithExactly( - axiosGetStub, + ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE) + actual = await sut.getFileCitation( + testFile.id, + DatasetNotNumberedVersion.LATEST, + testIncludeDeaccessioned + ) + expect(axios.get).toHaveBeenCalledWith( 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 + ) + expect(actual).toEqual(testCitation) + }) test('should return error on repository read error', async () => { - const axiosGetStub = sandbox.stub(axios, 'get').rejects(TestConstants.TEST_ERROR_RESPONSE); - - let error: ReadError = undefined; - await sut - .getFileCitation(1, DatasetNotNumberedVersion.LATEST, testIncludeDeaccessioned) - .catch((e) => (error = e)); - - assert.calledWithExactly( - axiosGetStub, - `${TestConstants.TEST_API_URL}/files/${testFile.id}/versions/${DatasetNotNumberedVersion.LATEST}/citation`, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY_INCLUDE_DEACCESSIONED, - ); - expect(error).to.be.instanceOf(Error); - }); - }); -}); + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) + + await expect( + sut.getFileCitation(testFile.id, DatasetNotNumberedVersion.LATEST, testIncludeDeaccessioned) + ).rejects.toThrow(ReadError) + }) + }) +}) diff --git a/test/unit/files/GetDatasetFileCounts.test.ts b/test/unit/files/GetDatasetFileCounts.test.ts index 4576290e..56308301 100644 --- a/test/unit/files/GetDatasetFileCounts.test.ts +++ b/test/unit/files/GetDatasetFileCounts.test.ts @@ -1,40 +1,35 @@ -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 { 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 sut = new GetDatasetFileCounts(filesRepositoryStub); + const testFileCounts: FileCounts = createFileCountsModel() + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFileCounts = jest.fn().mockResolvedValue(testFileCounts) + + const sut = new GetDatasetFileCounts(filesRepositoryStub) - const actual = await sut.execute(1); + const actual = await sut.execute(1) - assert.match(actual, testFileCounts); - assert.calledWithExactly(getDatasetFileCountsStub, 1, DatasetNotNumberedVersion.LATEST, false, undefined); - }); + expect(actual).toEqual(testFileCounts) + expect(filesRepositoryStub.getDatasetFileCounts).toHaveBeenCalledWith( + 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: 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 fb850a57..dd4712ae 100644 --- a/test/unit/files/GetDatasetFiles.test.ts +++ b/test/unit/files/GetDatasetFiles.test.ts @@ -1,41 +1,39 @@ -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 { 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(); - - 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 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: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFiles = jest.fn().mockResolvedValue(testFiles) + + const sut = new GetDatasetFiles(filesRepositoryStub) + + const actual = await sut.execute(1) + + expect(actual).toEqual(testFiles) + expect(filesRepositoryStub.getDatasetFiles).toHaveBeenCalledWith( + 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: 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 b3a4a208..f057cff8 100644 --- a/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts +++ b/test/unit/files/GetDatasetFilesTotalDownloadSize.test.ts @@ -1,77 +1,74 @@ -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; +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 testDatasetTotalDownloadSize = 123456789; - - afterEach(() => { - sandbox.restore(); - }); + const testDatasetTotalDownloadSize = 123456789 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: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFilesTotalDownloadSize = jest + .fn() + .mockResolvedValue(testDatasetTotalDownloadSize) - const actual = await sut.execute(1); + const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) - assert.match(actual, testDatasetTotalDownloadSize); - assert.calledWithExactly( - getDatasetTotalDownloadSizeStub, + const actual = await sut.execute(1) + + expect(actual).toEqual(testDatasetTotalDownloadSize) + expect(filesRepositoryStub.getDatasetFilesTotalDownloadSize).toHaveBeenCalledWith( 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: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFilesTotalDownloadSize = jest + .fn() + .mockResolvedValue(testDatasetTotalDownloadSize) + 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.calledWithExactly( - getDatasetTotalDownloadSizeStub, + expect(actual).toEqual(testDatasetTotalDownloadSize) + expect(filesRepositoryStub.getDatasetFilesTotalDownloadSize).toHaveBeenCalledWith( 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); - - let actualError: ReadError = undefined; - await sut.execute(1).catch((e: ReadError) => (actualError = e)); + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getDatasetFilesTotalDownloadSize = jest + .fn() + .mockRejectedValue(new ReadError()) + const sut = new GetDatasetFilesTotalDownloadSize(filesRepositoryStub) - 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 92d67777..96f4aa02 100644 --- a/test/unit/files/GetFile.test.ts +++ b/test/unit/files/GetFile.test.ts @@ -1,63 +1,60 @@ -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 { 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 testFile = createFileModel(); - - afterEach(() => { - sandbox.restore(); - }); - test('should return file on repository success when passing numeric id', async () => { - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testFile); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFile(filesRepositoryStub); + const testFile = createFileModel() + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testFile) + 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, false); - }); + expect(actual).toEqual(testFile) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith( + 1, + DatasetNotNumberedVersion.LATEST, + false + ) + }) test('should return file on repository success when passing string id', async () => { - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testFile); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFile(filesRepositoryStub); + const testFile = createFileModel() + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testFile) - const actual = await sut.execute('doi:10.5072/FK2/J8SJZB'); + const sut = new GetFile(filesRepositoryStub) - assert.match(actual, testFile); - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', DatasetNotNumberedVersion.LATEST, false); - }); + const actual = await sut.execute('doi:10.5072/FK2/J8SJZB') + + expect(actual).toEqual(testFile) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith( + 'doi:10.5072/FK2/J8SJZB', + DatasetNotNumberedVersion.LATEST, + false + ) + }) test('should return file on repository success when passing string id and version id', async () => { - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testFile); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFile(filesRepositoryStub); + const testFile = createFileModel() + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testFile) - const actual = await sut.execute('doi:10.5072/FK2/J8SJZB', '2.0'); + const sut = new GetFile(filesRepositoryStub) - assert.match(actual, testFile); - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', '2.0', false); - }); + const actual = await sut.execute('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); + expect(actual).toEqual(testFile) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith('doi:10.5072/FK2/J8SJZB', '2.0', false) + }) - let actualError: ReadError = undefined; - await sut.execute(1).catch((e) => (actualError = e)); + test('should return error result on repository error', async () => { + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFile = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetFile(filesRepositoryStub) - assert.match(actualError, testReadError); - }); -}); + await expect(sut.execute(1)).rejects.toThrow(ReadError) + }) +}) diff --git a/test/unit/files/GetFileAndDataset.test.ts b/test/unit/files/GetFileAndDataset.test.ts index 640ecc3b..98b65e51 100644 --- a/test/unit/files/GetFileAndDataset.test.ts +++ b/test/unit/files/GetFileAndDataset.test.ts @@ -1,69 +1,63 @@ -import { assert, createSandbox, SinonSandbox } from 'sinon'; -import { createFileModel } from '../../testHelpers/files/filesHelper'; -import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository'; -import { DatasetNotNumberedVersion, ReadError } from '../../../src'; -import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper'; -import { GetFileAndDataset } from '../../../src/files/domain/useCases/GetFileAndDataset'; +import { createFileModel } from '../../testHelpers/files/filesHelper' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { DatasetNotNumberedVersion, ReadError } from '../../../src' +import { createDatasetModel } from '../../testHelpers/datasets/datasetHelper' +import { GetFileAndDataset } from '../../../src/files/domain/useCases/GetFileAndDataset' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - - const testFile = createFileModel(); - const testDataset = createDatasetModel(); - const testTuple = [testFile, testDataset]; - - afterEach(() => { - sandbox.restore(); - }); + const testFile = createFileModel() + const testDataset = createDatasetModel() + const testTuple = [testFile, testDataset] test('should return file and dataset on repository success when passing numeric id', async () => { - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testTuple); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFileAndDataset(filesRepositoryStub); + const filesRepositoryStub = {} + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testTuple) + const sut = new GetFileAndDataset(filesRepositoryStub) - const actual = await sut.execute(1); + const actual = await sut.execute(1) - assert.match(actual[0], testFile); - assert.match(actual[1], testDataset); - assert.calledWithExactly(getFileStub, 1, DatasetNotNumberedVersion.LATEST, true); - }); + expect(actual[0]).toEqual(testFile) + expect(actual[1]).toEqual(testDataset) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith( + 1, + DatasetNotNumberedVersion.LATEST, + true + ) + }) test('should return file and dataset on repository success when passing string id', async () => { - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testTuple); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFileAndDataset(filesRepositoryStub); + const filesRepositoryStub = {} + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testTuple) + const sut = new GetFileAndDataset(filesRepositoryStub) - const actual = await sut.execute('doi:10.5072/FK2/J8SJZB'); + const actual = await sut.execute('doi:10.5072/FK2/J8SJZB') - assert.match(actual[0], testFile); - assert.match(actual[1], testDataset); - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', DatasetNotNumberedVersion.LATEST, true); - }); + expect(actual[0]).toEqual(testFile) + expect(actual[1]).toEqual(testDataset) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith( + 'doi:10.5072/FK2/J8SJZB', + DatasetNotNumberedVersion.LATEST, + true + ) + }) test('should return file and dataset on repository success when passing string id and version id', async () => { - const filesRepositoryStub = {}; - const getFileStub = sandbox.stub().returns(testTuple); - filesRepositoryStub.getFile = getFileStub; - const sut = new GetFileAndDataset(filesRepositoryStub); + const filesRepositoryStub = {} + filesRepositoryStub.getFile = jest.fn().mockResolvedValue(testTuple) + const sut = new GetFileAndDataset(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[0], testFile); - assert.match(actual[1], testDataset); - assert.calledWithExactly(getFileStub, 'doi:10.5072/FK2/J8SJZB', '2.0', true); - }); + expect(actual[0]).toEqual(testFile) + expect(actual[1]).toEqual(testDataset) + expect(filesRepositoryStub.getFile).toHaveBeenCalledWith('doi:10.5072/FK2/J8SJZB', '2.0', true) + }) test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getFile = sandbox.stub().throwsException(testReadError); - const sut = new GetFileAndDataset(filesRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(1).catch((e) => (actualError = e)); + const filesRepositoryStub = {} + filesRepositoryStub.getFile = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetFileAndDataset(filesRepositoryStub) - assert.match(actualError, testReadError); - }); -}); + await expect(sut.execute(1)).rejects.toThrow(ReadError) + }) +}) diff --git a/test/unit/files/GetFileCitation.test.ts b/test/unit/files/GetFileCitation.test.ts index ac40b547..cd4bc2bf 100644 --- a/test/unit/files/GetFileCitation.test.ts +++ b/test/unit/files/GetFileCitation.test.ts @@ -1,39 +1,33 @@ -import {assert, createSandbox, SinonSandbox} from "sinon"; -import {DatasetNotNumberedVersion, ReadError} from "../../../src"; -import {IFilesRepository} from "../../../src/files/domain/repositories/IFilesRepository"; -import {GetFileCitation} from "../../../src/files/domain/useCases/GetFileCitation"; +import { DatasetNotNumberedVersion, ReadError } from '../../../src' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +import { GetFileCitation } from '../../../src/files/domain/useCases/GetFileCitation' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testId = 1; + const testId = 1 - afterEach(() => { - sandbox.restore(); - }); + test('should return successful result with file citation on repository success', async () => { + const testCitation = 'test citation' + const filesRepositoryStub = {} + filesRepositoryStub.getFileCitation = jest.fn().mockResolvedValue(testCitation) - test('should return successful result with file citation on repository success', async () => { - const testCitation = 'test citation'; - const filesRepositoryStub = {}; - const getFileCitation = sandbox.stub().returns(testCitation); - filesRepositoryStub.getFileCitation = getFileCitation; + const sut = new GetFileCitation(filesRepositoryStub) - const sut = new GetFileCitation(filesRepositoryStub); + const actual = await sut.execute(testId) - const actual = await sut.execute(testId); + expect(actual).toEqual(testCitation) + expect(filesRepositoryStub.getFileCitation).toHaveBeenCalledWith( + testId, + DatasetNotNumberedVersion.LATEST, + false + ) + }) - assert.match(actual, testCitation); - assert.calledWithExactly(getFileCitation, testId, DatasetNotNumberedVersion.LATEST, false); - }); + test('should return error result on repository error', async () => { + const filesRepositoryStub = {} + filesRepositoryStub.getFileCitation = jest.fn().mockRejectedValue(new ReadError()) - test('should return error result on repository error', async () => { - const filesRepositoryStub = {}; - const testReadError = new ReadError(); - filesRepositoryStub.getFileCitation = sandbox.stub().throwsException(testReadError); - const sut = new GetFileCitation(filesRepositoryStub); + const sut = new GetFileCitation(filesRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testId).catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}) \ No newline at end of file + await expect(sut.execute(testId)).rejects.toThrow(ReadError) + }) +}) diff --git a/test/unit/files/GetFileDataTables.test.ts b/test/unit/files/GetFileDataTables.test.ts index 34104e2a..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'; +import { GetFileDataTables } from '../../../src/files/domain/useCases/GetFileDataTables' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +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(); - }); + const testFileId = 1 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: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDataTables = jest.fn().mockResolvedValue(testDataTables) + 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); - }); + 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 sut = new GetFileDataTables(filesRepositoryStub); + const testReadError = new ReadError() + 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)); + 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 694959b3..fd54d383 100644 --- a/test/unit/files/GetFileDownloadCount.test.ts +++ b/test/unit/files/GetFileDownloadCount.test.ts @@ -1,51 +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'; +import { GetFileDownloadCount } from '../../../src/files/domain/useCases/GetFileDownloadCount' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +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(); - }); + const testFileId = 1 + const testCount = 10 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: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDownloadCount = jest.fn().mockResolvedValue(testCount) + 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); - }); + 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 sut = new GetFileDownloadCount(filesRepositoryStub); + 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); + const actual = await sut.execute(TestConstants.TEST_DUMMY_PERSISTENT_ID) - assert.match(actual, testCount); - assert.calledWithExactly(getFileGuestbookResponsesCountStub, TestConstants.TEST_DUMMY_PERSISTENT_ID); - }); + 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 sut = new GetFileDownloadCount(filesRepositoryStub); - - let actualError: ReadError = undefined; - await sut.execute(testFileId).catch((e) => (actualError = e)); + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileDownloadCount = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetFileDownloadCount(filesRepositoryStub) - 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 d113e730..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'; +import { GetFileUserPermissions } from '../../../src/files/domain/useCases/GetFileUserPermissions' +import { IFilesRepository } from '../../../src/files/domain/repositories/IFilesRepository' +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(); - }); + const testFileId = 1 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: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileUserPermissions = jest + .fn() + .mockResolvedValue(testFileUserPermissions) - const actual = await sut.execute(testFileId); + const sut = new GetFileUserPermissions(filesRepositoryStub) - assert.match(actual, testFileUserPermissions); - assert.calledWithExactly(getFileUserPermissionsStub, testFileId); - }); + const actual = await sut.execute(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); + expect(actual).toEqual(testFileUserPermissions) + expect(filesRepositoryStub.getFileUserPermissions).toHaveBeenCalledWith(testFileId) + }) - let actualError: ReadError = undefined; - await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)); + test('should return error result on repository error', async () => { + const filesRepositoryStub: IFilesRepository = {} as IFilesRepository + filesRepositoryStub.getFileUserPermissions = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetFileUserPermissions(filesRepositoryStub) - 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 52c9ce73..3ab062f5 100644 --- a/test/unit/info/DataverseInfoRepository.test.ts +++ b/test/unit/info/DataverseInfoRepository.test.ts @@ -1,135 +1,126 @@ -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 axios from 'axios' +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(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); - - afterEach(() => { - sandbox.restore(); - }); + sut = new DataverseInfoRepository() + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) 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 + } + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) - const actual = await sut.getDataverseVersion(); + 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); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + 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; - await sut.getDataverseVersion().catch((e) => (error = e)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(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() + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) - const actual = await sut.getZipDownloadLimit(); + 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); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + 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; - await sut.getZipDownloadLimit().catch((e) => (error = e)); + 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); - }); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(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() + } + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) - const actual = await sut.getMaxEmbargoDurationInMonths(); + 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); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + 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; - await sut.getMaxEmbargoDurationInMonths().catch((e) => (error = e)); + 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); - }); - }); -}); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(Error) + }) + }) +}) diff --git a/test/unit/info/GetDataverseVersion.test.ts b/test/unit/info/GetDataverseVersion.test.ts index 1db3a222..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'; +import { GetDataverseVersion } from '../../../src/info/domain/useCases/GetDataverseVersion' +import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' 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 sut = new GetDataverseVersion(dataverseInfoRepositoryStub); + const testDataverseVersion = '5.13' + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getDataverseVersion = jest + .fn() + .mockResolvedValue(testDataverseVersion) + const sut = new GetDataverseVersion(dataverseInfoRepositoryStub) - const actual = await sut.execute(); + 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 testReadError = new ReadError(); - dataverseInfoRepositoryStub.getDataverseVersion = sandbox.stub().throwsException(testReadError); - const sut = new GetDataverseVersion(dataverseInfoRepositoryStub); + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + const testReadError = new ReadError() + dataverseInfoRepositoryStub.getDataverseVersion = jest.fn().mockRejectedValue(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); - }); -}); + expect(actualError).toBe(testReadError) + }) +}) diff --git a/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts b/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts index 57953254..fa710982 100644 --- a/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts +++ b/test/unit/info/GetMaxEmbargoDurationInMonths.test.ts @@ -1,35 +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'; +import { GetMaxEmbargoDurationInMonths } from '../../../src/info/domain/useCases/GetMaxEmbargoDurationInMonths' +import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' 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 sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub); + const testDuration = 12 + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = jest + .fn() + .mockResolvedValue(testDuration) - const actual = await sut.execute(); + const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub) - assert.match(actual, testDuration); - }); + const actual = await sut.execute() - 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); + expect(actual).toBe(testDuration) + }) - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); - - assert.match(actualError, testReadError); - }); -}); + test('should return error result on repository error', async () => { + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getMaxEmbargoDurationInMonths = jest + .fn() + .mockRejectedValue(new ReadError()) + const sut = new GetMaxEmbargoDurationInMonths(dataverseInfoRepositoryStub) + + await expect(sut.execute()).rejects.toBeInstanceOf(ReadError) + }) +}) diff --git a/test/unit/info/GetZipDownloadLimit.test.ts b/test/unit/info/GetZipDownloadLimit.test.ts index 94e1953a..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'; +import { GetZipDownloadLimit } from '../../../src/info/domain/useCases/GetZipDownloadLimit' +import { IDataverseInfoRepository } from '../../../src/info/domain/repositories/IDataverseInfoRepository' +import { ReadError } from '../../../src/core/domain/repositories/ReadError' 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 sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub); + const testZipDownloadLimit = 100 + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getZipDownloadLimit = jest + .fn() + .mockResolvedValue(testZipDownloadLimit) + + const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) - const actual = await sut.execute(); + 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 sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub); + const dataverseInfoRepositoryStub: IDataverseInfoRepository = {} as IDataverseInfoRepository + dataverseInfoRepositoryStub.getZipDownloadLimit = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute().catch((e) => (actualError = e)); + 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 df922ac6..76ec3711 100644 --- a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts +++ b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts @@ -1,39 +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'; +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 { createMetadataBlockModel } from '../../testHelpers/metadataBlocks/metadataBlockHelper' describe('execute', () => { - const sandbox: SinonSandbox = createSandbox(); - const testMetadataBlockName = 'test'; - - afterEach(() => { - sandbox.restore(); - }); + const testMetadataBlockName = 'test' 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: IMetadataBlocksRepository = { + getMetadataBlockByName: jest.fn().mockReturnValue(testMetadataBlock) + } + 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); - }); + 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 sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub); + const metadataBlocksRepositoryStub: IMetadataBlocksRepository = { + getMetadataBlockByName: jest.fn().mockRejectedValue(new ReadError()) + } + const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub) - let actualError: ReadError = undefined; - await sut.execute(testMetadataBlockName).catch((e) => (actualError = e)); + 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 ffd82243..339c34d1 100644 --- a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts @@ -1,64 +1,62 @@ -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 { 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' +import axios from 'axios' describe('getMetadataBlockByName', () => { - const sandbox: SinonSandbox = createSandbox(); - const sut: MetadataBlocksRepository = new MetadataBlocksRepository(); - const testMetadataBlockName = 'test'; + const sut: MetadataBlocksRepository = new MetadataBlocksRepository() + const testMetadataBlockName = 'test' beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); - - afterEach(() => { - sandbox.restore(); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) 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() + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) - const actual = await sut.getMetadataBlockByName(testMetadataBlockName); + 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()); - }); + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(actual).toMatchObject(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' + } + } + jest.spyOn(axios, 'get').mockRejectedValue(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, + expect(axios.get).toHaveBeenCalledWith( `${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).toBeInstanceOf(Error) + }) +}) diff --git a/test/unit/users/GetCurrentAuthenticatedUser.test.ts b/test/unit/users/GetCurrentAuthenticatedUser.test.ts index 622e1de9..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'; +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 { 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 sut = new GetCurrentAuthenticatedUser(usersRepositoryStub); + const testAuthenticatedUser = createAuthenticatedUser() + const usersRepositoryStub: IUsersRepository = { + getCurrentAuthenticatedUser: jest.fn().mockReturnValue(testAuthenticatedUser) + } + const sut = new GetCurrentAuthenticatedUser(usersRepositoryStub) - const actual = await sut.execute(); + 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 sut = new GetCurrentAuthenticatedUser(usersRepositoryStub); + 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)); + 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 6bc7fbc8..7cabe4ff 100644 --- a/test/unit/users/UsersRepository.test.ts +++ b/test/unit/users/UsersRepository.test.ts @@ -1,26 +1,26 @@ -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 axios from 'axios' +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(); + const sut: UsersRepository = new UsersRepository() beforeEach(() => { - ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, TestConstants.TEST_DUMMY_API_KEY); - }); - - afterEach(() => { - sandbox.restore(); - }); + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + TestConstants.TEST_DUMMY_API_KEY + ) + }) test('should return authenticated user on successful response', async () => { - const testAuthenticatedUser = createAuthenticatedUser(); + const testAuthenticatedUser = createAuthenticatedUser() const testSuccessfulResponse = { data: { status: 'OK', @@ -37,48 +37,43 @@ 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 + } + } + } + jest.spyOn(axios, 'get').mockResolvedValue(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY, - ); - - assert.match(actual, testAuthenticatedUser); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(actual).toMatchObject(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, + expect(axios.get).toHaveBeenCalledWith( expectedApiEndpoint, - TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE, - ); - - assert.match(actual, testAuthenticatedUser); - }); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE + ) + 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)); + 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); - }); -}); + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + expect(error).toBeInstanceOf(Error) + }) +}) diff --git a/tsconfig.json b/tsconfig.json index 2a49ab9b..e77ed292 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": "es2015", + "outDir": "./dist", + "esModuleInterop": true, + "resolveJsonModule": true + }, + "include": [ + "src/**/*", + "test", + "jest.config.integration.ts", + "jest.config.js", + "jest.config.unit.ts" + ], + "exclude": ["node_modules", "dist"] }