diff --git a/src/collections/infra/repositories/CollectionsRepository.ts b/src/collections/infra/repositories/CollectionsRepository.ts index bee82863..98a335b9 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -33,9 +33,9 @@ export interface NewCollectionContactRequestPayload { } export interface NewCollectionMetadataBlocksRequestPayload { - metadataBlockNames: string[] - facetIds: string[] - inputLevels: NewCollectionInputLevelRequestPayload[] + metadataBlockNames?: string[] + facetIds?: string[] + inputLevels?: NewCollectionInputLevelRequestPayload[] } export interface NewCollectionInputLevelRequestPayload { @@ -179,7 +179,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections }) ) - const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] = + const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] | undefined = collectionDTO.inputLevels?.map((inputLevel) => ({ datasetFieldTypeName: inputLevel.datasetFieldName, include: inputLevel.include, diff --git a/src/core/infra/repositories/ApiRepository.ts b/src/core/infra/repositories/ApiRepository.ts index fb0726ac..66dac213 100644 --- a/src/core/infra/repositories/ApiRepository.ts +++ b/src/core/infra/repositories/ApiRepository.ts @@ -47,7 +47,7 @@ export abstract class ApiRepository { protected buildApiEndpoint( resourceName: string, operation: string, - resourceId: number | string = undefined + resourceId: number | string | undefined = undefined ) { return typeof resourceId === 'number' ? `/${resourceName}/${resourceId}/${operation}` diff --git a/src/core/infra/repositories/apiConfigBuilders.ts b/src/core/infra/repositories/apiConfigBuilders.ts index 16f68d7d..6c7ed764 100644 --- a/src/core/infra/repositories/apiConfigBuilders.ts +++ b/src/core/infra/repositories/apiConfigBuilders.ts @@ -8,7 +8,7 @@ export const buildRequestConfig = ( contentType: string = ApiConstants.CONTENT_TYPE_APPLICATION_JSON, abortSignal?: AbortSignal ): AxiosRequestConfig => { - const requestConfig: AxiosRequestConfig = { + const requestConfig: AxiosRequestConfig & { headers: Record } = { params: queryParams, headers: { 'Content-Type': contentType diff --git a/src/datasets/domain/models/Dataset.ts b/src/datasets/domain/models/Dataset.ts index 9bf4d2a0..f879eb22 100644 --- a/src/datasets/domain/models/Dataset.ts +++ b/src/datasets/domain/models/Dataset.ts @@ -65,7 +65,7 @@ export type DatasetMetadataFieldValue = | DatasetMetadataSubField[] | AnonymizedField -export type DatasetMetadataSubField = Record +export type DatasetMetadataSubField = Record export interface CitationMetadataBlock extends DatasetMetadataBlock { name: 'citation' diff --git a/src/datasets/domain/useCases/validators/DatasetResourceValidator.ts b/src/datasets/domain/useCases/validators/DatasetResourceValidator.ts index e55b6cb6..77282da7 100644 --- a/src/datasets/domain/useCases/validators/DatasetResourceValidator.ts +++ b/src/datasets/domain/useCases/validators/DatasetResourceValidator.ts @@ -17,9 +17,10 @@ export class DatasetResourceValidator implements ResourceValidator { metadataBlocks: MetadataBlock[] ) { const metadataBlockName = metadataBlockValues.name - const metadataBlock: MetadataBlock = metadataBlocks.find( + const metadataBlock = metadataBlocks.find( (metadataBlock) => metadataBlock.name === metadataBlockName - ) + ) as MetadataBlock + for (const metadataFieldKey of Object.keys(metadataBlock.metadataFields)) { this.metadataFieldValidator.validate({ metadataFieldInfo: metadataBlock.metadataFields[metadataFieldKey], diff --git a/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts b/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts index 82e550b8..4dc63888 100644 --- a/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts +++ b/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts @@ -8,6 +8,7 @@ import { MetadataFieldValidator } from './MetadataFieldValidator' import { DatasetMetadataChildFieldValueDTO } from '../../dtos/DatasetDTO' import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator' import { + MetadataFieldInfo, MetadataFieldType, MetadataFieldWatermark } from '../../../../metadataBlocks/domain/models/MetadataBlock' @@ -62,7 +63,7 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo ) { if ( - !datasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues.includes( + !datasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues?.includes( datasetMetadataFieldAndValueInfo.metadataFieldValue as string ) ) { @@ -120,13 +121,21 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo ) { const metadataFieldInfo = datasetMetadataFieldAndValueInfo.metadataFieldInfo - const childMetadataFieldKeys = Object.keys(metadataFieldInfo.childMetadataFields) + + const childMetadataFieldKeys = Object.keys( + metadataFieldInfo.childMetadataFields as Record + ) + const metadataFieldValidator = new MetadataFieldValidator( this, new MultipleMetadataFieldValidator(this) ) + for (const childMetadataFieldKey of childMetadataFieldKeys) { - const childMetadataFieldInfo = metadataFieldInfo.childMetadataFields[childMetadataFieldKey] + const childMetadataFieldInfo = ( + metadataFieldInfo.childMetadataFields as Record + )[childMetadataFieldKey] + metadataFieldValidator.validate({ metadataFieldInfo: childMetadataFieldInfo, metadataFieldKey: childMetadataFieldKey, diff --git a/src/datasets/infra/repositories/transformers/datasetTransformers.ts b/src/datasets/infra/repositories/transformers/datasetTransformers.ts index 5cee3a86..6968e779 100644 --- a/src/datasets/infra/repositories/transformers/datasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetTransformers.ts @@ -68,9 +68,9 @@ export const transformDatasetModelToUpdateDatasetRequestPayload = ( datasetMetadataBlocksValues.forEach(function ( newDatasetMetadataBlockValues: DatasetMetadataBlockValuesDTO ) { - const metadataBlock: MetadataBlock = metadataBlocks.find( + const metadataBlock = metadataBlocks.find( (metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name - ) + ) as MetadataBlock const metadataBlockFieldsPayload: MetadataFieldRequestPayload[] = [] const metadataBlockFields = metadataBlock.metadataFields const datasetMetadataFields = newDatasetMetadataBlockValues.fields @@ -119,7 +119,7 @@ export const transformMetadataBlockModelsToRequestPayload = ( ) { const metadataBlock: MetadataBlock = metadataBlocks.find( (metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name - ) + ) as MetadataBlock metadataBlocksRequestPayload[newDatasetMetadataBlockValues.name] = { fields: transformMetadataFieldModelsToRequestPayload( newDatasetMetadataBlockValues.fields, @@ -195,8 +195,9 @@ export const transformMetadataChildFieldValueToRequestPayload = ( ): Record => { const metadataChildFieldRequestPayload: Record = {} for (const metadataChildFieldKey of Object.keys(datasetMetadataChildFieldValue)) { - const childMetadataFieldInfo: MetadataFieldInfo = - metadataBlockFieldInfo.childMetadataFields[metadataChildFieldKey] + const childMetadataFieldInfo: MetadataFieldInfo = ( + metadataBlockFieldInfo.childMetadataFields as Record + )[metadataChildFieldKey] const value: string = datasetMetadataChildFieldValue[metadataChildFieldKey] as unknown as string metadataChildFieldRequestPayload[metadataChildFieldKey] = { value: value, @@ -252,7 +253,9 @@ export const transformVersionPayloadToDataset = ( }) } if ('license' in versionPayload) { - datasetModel.license = transformPayloadToDatasetLicense(versionPayload.license) + datasetModel.license = transformPayloadToDatasetLicense( + versionPayload.license as LicensePayload + ) } if ('alternativePersistentId' in versionPayload) { datasetModel.alternativePersistentId = versionPayload.alternativePersistentId diff --git a/src/files/infra/clients/DirectUploadClient.ts b/src/files/infra/clients/DirectUploadClient.ts index b5655c8d..8dfd1a9b 100644 --- a/src/files/infra/clients/DirectUploadClient.ts +++ b/src/files/infra/clients/DirectUploadClient.ts @@ -73,7 +73,8 @@ export class DirectUploadClient implements IDirectUploadClient { if (axios.isCancel(error)) { throw new FileUploadCancelError(file.name, datasetId) } - throw new FileUploadError(file.name, datasetId, error.message) + const errorMessage = error instanceof Error ? error.message : 'Upload singlepart file failed' + throw new FileUploadError(file.name, datasetId, errorMessage) } } @@ -114,7 +115,7 @@ export class DirectUploadClient implements IDirectUploadClient { eTags[`${index + 1}`] = eTag } catch (error) { if (axios.isCancel(error)) { - await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint) + await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint as string) throw new FileUploadCancelError(file.name, datasetId) } if (retries < maxRetries) { @@ -122,8 +123,12 @@ export class DirectUploadClient implements IDirectUploadClient { await new Promise((resolve) => setTimeout(resolve, backoffDelay)) await uploadPart(destinationUrl, index, retries + 1) } else { - await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint) - throw new FilePartUploadError(file.name, datasetId, error.message, index + 1) + await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint as string) + + const errorMessage = + error instanceof Error ? error.message : 'Upload part of multipart file failed' + + throw new FilePartUploadError(file.name, datasetId, errorMessage, index + 1) } } } @@ -165,7 +170,7 @@ export class DirectUploadClient implements IDirectUploadClient { ): Promise { return await axios .put( - buildRequestUrl(destination.completeEndpoint), + buildRequestUrl(destination.completeEndpoint as string), eTags, buildRequestConfig( true, @@ -177,7 +182,7 @@ export class DirectUploadClient implements IDirectUploadClient { .then(() => undefined) .catch(async (error) => { if (axios.isCancel(error)) { - await this.abortMultipartUpload(fileName, datasetId, destination.abortEndpoint) + await this.abortMultipartUpload(fileName, datasetId, destination.abortEndpoint as string) throw new FileUploadCancelError(fileName, datasetId) } throw new MultipartCompletionError(fileName, datasetId, error.message) diff --git a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts index b6036bfd..aae50c18 100644 --- a/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts +++ b/src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts @@ -64,15 +64,19 @@ const transformMetadataBlockPayloadToMetadataBlock = ( const getChildFieldKeys = (metadataBlockFieldsPayload: Record): Set => { const childFieldKeys = new Set() - Object.values(metadataBlockFieldsPayload).forEach( - (fieldInfo: { childFields?: Record }) => { - if (fieldInfo.childFields) { - Object.keys(fieldInfo.childFields).forEach((childKey) => { - childFieldKeys.add(childKey) - }) - } + Object.values(metadataBlockFieldsPayload).forEach((fieldInfo) => { + if ( + fieldInfo && + typeof fieldInfo === 'object' && + 'childFields' in fieldInfo && + typeof fieldInfo.childFields === 'object' && + (fieldInfo?.childFields as Record) + ) { + Object.keys(fieldInfo.childFields as Record).forEach((childKey) => { + childFieldKeys.add(childKey) + }) } - ) + }) return childFieldKeys } diff --git a/test/functional/collections/CreateCollection.test.ts b/test/functional/collections/CreateCollection.test.ts index 2c1fa506..bd15dd3d 100644 --- a/test/functional/collections/CreateCollection.test.ts +++ b/test/functional/collections/CreateCollection.test.ts @@ -29,15 +29,15 @@ describe('execute', () => { test('should throw an error when the parent collection does not exist', async () => { const testNewCollection = createCollectionDTO() expect.assertions(2) - let writeError: WriteError + let writeError: WriteError | undefined = undefined try { await createCollection.execute(testNewCollection, TestConstants.TEST_DUMMY_COLLECTION_ID) throw new Error('Use case should throw an error') } catch (error) { - writeError = error + writeError = error as WriteError } finally { expect(writeError).toBeInstanceOf(WriteError) - expect(writeError.message).toEqual( + expect(writeError?.message).toEqual( `There was an error when writing the resource. Reason was: [404] Can't find dataverse with identifier='${TestConstants.TEST_DUMMY_COLLECTION_ID}'` ) } diff --git a/test/functional/collections/GetCollectionFacets.test.ts b/test/functional/collections/GetCollectionFacets.test.ts index e2a88ffe..a4b2a970 100644 --- a/test/functional/collections/GetCollectionFacets.test.ts +++ b/test/functional/collections/GetCollectionFacets.test.ts @@ -27,15 +27,15 @@ describe('execute', () => { test('should throw an error when collection does not exist', async () => { expect.assertions(2) - let readError: ReadError + let readError: ReadError | undefined = undefined try { await getCollectionFacets.execute(TestConstants.TEST_DUMMY_COLLECTION_ID) throw new Error('Use case should throw an error') } catch (error) { - readError = error + readError = error as ReadError } finally { expect(readError).toBeInstanceOf(ReadError) - expect(readError.message).toEqual( + expect(readError?.message).toEqual( `There was an error when reading the resource. Reason was: [404] Can't find dataverse with identifier='${TestConstants.TEST_DUMMY_COLLECTION_ID}'` ) } diff --git a/test/functional/collections/GetCollectionItems.test.ts b/test/functional/collections/GetCollectionItems.test.ts index 4f3de628..15e2814f 100644 --- a/test/functional/collections/GetCollectionItems.test.ts +++ b/test/functional/collections/GetCollectionItems.test.ts @@ -15,7 +15,6 @@ import { } from '../../testHelpers/collections/collectionHelper' import { uploadFileViaApi } from '../../testHelpers/files/filesHelper' import { deleteUnpublishedDatasetViaApi } from '../../testHelpers/datasets/datasetHelper' -import { CollectionItemSubset } from '../../../src/collections/domain/models/CollectionItemSubset' describe('execute', () => { const testCollectionAlias = 'collectionsRepositoryFunctionalTestCollection' @@ -59,12 +58,9 @@ describe('execute', () => { // Give enough time to Solr for indexing await new Promise((resolve) => setTimeout(resolve, 5000)) - let actual: CollectionItemSubset try { - actual = await getCollectionItems.execute(testCollectionAlias) - } catch (error) { - throw new Error('Item subset should be retrieved') - } finally { + const actual = await getCollectionItems.execute(testCollectionAlias) + const actualFilePreview = actual.items[0] as FilePreview const actualDatasetPreview = actual.items[1] as DatasetPreview @@ -72,20 +68,22 @@ describe('execute', () => { expect(actualDatasetPreview.title).toBe('Dataset created using the createDataset use case') expect(actual.totalItemCount).toBe(2) + } catch (error) { + throw new Error('Item subset should be retrieved') } }) test('should throw an error when collection does not exist', async () => { expect.assertions(2) - let readError: ReadError + let readError: ReadError | undefined = undefined try { await getCollectionItems.execute(TestConstants.TEST_DUMMY_COLLECTION_ALIAS) throw new Error('Use case should throw an error') } catch (error) { - readError = error + readError = error as ReadError } finally { expect(readError).toBeInstanceOf(ReadError) - expect(readError.message).toEqual( + expect(readError?.message).toEqual( `There was an error when reading the resource. Reason was: [400] Could not find dataverse with alias ${TestConstants.TEST_DUMMY_COLLECTION_ALIAS}` ) } diff --git a/test/functional/collections/GetCollectionUserPermissions.test.ts b/test/functional/collections/GetCollectionUserPermissions.test.ts index fbac8b12..17493856 100644 --- a/test/functional/collections/GetCollectionUserPermissions.test.ts +++ b/test/functional/collections/GetCollectionUserPermissions.test.ts @@ -1,9 +1,4 @@ -import { - ApiConfig, - CollectionUserPermissions, - ReadError, - getCollectionUserPermissions -} from '../../../src' +import { ApiConfig, ReadError, getCollectionUserPermissions } from '../../../src' import { TestConstants } from '../../testHelpers/TestConstants' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' @@ -19,49 +14,47 @@ describe('execute', () => { }) test('should return user permissions for the default collection', async () => { - let actual: CollectionUserPermissions try { - actual = await getCollectionUserPermissions.execute() + const permissions = await getCollectionUserPermissions.execute() + + expect(permissions.canAddDataset).toBe(true) + expect(permissions.canAddCollection).toBe(true) + expect(permissions.canDeleteCollection).toBe(true) + expect(permissions.canEditCollection).toBe(true) + expect(permissions.canManageCollectionPermissions).toBe(true) + expect(permissions.canPublishCollection).toBe(true) + expect(permissions.canViewUnpublishedCollection).toBe(true) } catch (error) { throw new Error('Permissions should be retrieved') - } finally { - expect(actual.canAddDataset).toBe(true) - expect(actual.canAddCollection).toBe(true) - expect(actual.canDeleteCollection).toBe(true) - expect(actual.canEditCollection).toBe(true) - expect(actual.canManageCollectionPermissions).toBe(true) - expect(actual.canPublishCollection).toBe(true) - expect(actual.canViewUnpublishedCollection).toBe(true) } }) test('should return user permissions when a valid collection alias is provided', async () => { - let actual: CollectionUserPermissions try { - actual = await getCollectionUserPermissions.execute(ROOT_COLLECTION_ALIAS) + const permissions = await getCollectionUserPermissions.execute(ROOT_COLLECTION_ALIAS) + + expect(permissions.canAddDataset).toBe(true) + expect(permissions.canAddCollection).toBe(true) + expect(permissions.canDeleteCollection).toBe(true) + expect(permissions.canEditCollection).toBe(true) + expect(permissions.canManageCollectionPermissions).toBe(true) + expect(permissions.canPublishCollection).toBe(true) + expect(permissions.canViewUnpublishedCollection).toBe(true) } catch (error) { throw new Error('Permissions should be retrieved') - } finally { - expect(actual.canAddDataset).toBe(true) - expect(actual.canAddCollection).toBe(true) - expect(actual.canDeleteCollection).toBe(true) - expect(actual.canEditCollection).toBe(true) - expect(actual.canManageCollectionPermissions).toBe(true) - expect(actual.canPublishCollection).toBe(true) - expect(actual.canViewUnpublishedCollection).toBe(true) } }) test('should throw an error when collection does not exist', async () => { expect.assertions(2) - let readError: ReadError + let readError: ReadError | undefined = undefined try { await getCollectionUserPermissions.execute(TestConstants.TEST_DUMMY_COLLECTION_ID) throw new Error('Use case should throw an error') } catch (error) { - readError = error + readError = error as ReadError } finally { expect(readError).toBeInstanceOf(ReadError) - expect(readError.message).toEqual( + expect(readError?.message).toEqual( `There was an error when reading the resource. Reason was: [404] Can't find dataverse with identifier='${TestConstants.TEST_DUMMY_COLLECTION_ID}'` ) } diff --git a/test/functional/collections/UpdateCollection.test.ts b/test/functional/collections/UpdateCollection.test.ts index 4fbde611..ac5f47e9 100644 --- a/test/functional/collections/UpdateCollection.test.ts +++ b/test/functional/collections/UpdateCollection.test.ts @@ -38,15 +38,15 @@ describe('execute', () => { test('should throw an error when the parent collection does not exist', async () => { const testNewCollection = createCollectionDTO() expect.assertions(2) - let writeError: WriteError + let writeError: WriteError | undefined = undefined try { await updateCollection.execute(TestConstants.TEST_DUMMY_COLLECTION_ID, testNewCollection) throw new Error('Use case should throw an error') } catch (error) { - writeError = error + writeError = error as WriteError } finally { expect(writeError).toBeInstanceOf(WriteError) - expect(writeError.message).toEqual( + expect(writeError?.message).toEqual( `There was an error when writing the resource. Reason was: [404] Can't find dataverse with identifier='${TestConstants.TEST_DUMMY_COLLECTION_ID}'` ) } diff --git a/test/functional/datasets/CreateDataset.test.ts b/test/functional/datasets/CreateDataset.test.ts index d1bf729f..f90eff00 100644 --- a/test/functional/datasets/CreateDataset.test.ts +++ b/test/functional/datasets/CreateDataset.test.ts @@ -1,4 +1,4 @@ -import { createDataset, CreatedDatasetIdentifiers } from '../../../src/datasets' +import { createDataset, DatasetDTO } from '../../../src/datasets' import { ApiConfig } from '../../../src' import { TestConstants } from '../../testHelpers/TestConstants' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' @@ -48,16 +48,16 @@ describe('execute', () => { ] } expect.assertions(3) - let createdDatasetIdentifiers: CreatedDatasetIdentifiers + try { - createdDatasetIdentifiers = await createDataset.execute(testNewDataset) - } catch (error) { - throw new Error('Dataset should be created') - } finally { + const createdDatasetIdentifiers = await createDataset.execute(testNewDataset) + expect(createdDatasetIdentifiers).not.toBeNull() expect(createdDatasetIdentifiers.numericId).not.toBeNull() expect(createdDatasetIdentifiers.persistentId).not.toBeNull() await deleteUnpublishedDatasetViaApi(createdDatasetIdentifiers.numericId) + } catch (error) { + throw new Error('Dataset should be created') } }) @@ -94,25 +94,25 @@ describe('execute', () => { ] } expect.assertions(5) - let fieldValidationError: FieldValidationError + let fieldValidationError: FieldValidationError | undefined = undefined try { await createDataset.execute(testNewDataset) throw new Error('Use case should throw an error') } catch (error) { - fieldValidationError = error + fieldValidationError = error as FieldValidationError } finally { expect(fieldValidationError).toBeInstanceOf(FieldValidationError) - expect(fieldValidationError.citationBlockName).toEqual('citation') - expect(fieldValidationError.metadataFieldName).toEqual('title') - expect(fieldValidationError.parentMetadataFieldName).toEqual(undefined) - expect(fieldValidationError.message).toEqual( + expect(fieldValidationError?.citationBlockName).toEqual('citation') + expect(fieldValidationError?.metadataFieldName).toEqual('title') + expect(fieldValidationError?.parentMetadataFieldName).toEqual(undefined) + expect(fieldValidationError?.message).toEqual( 'There was an error when validating the field title from metadata block citation. Reason was: The field should not be empty.' ) } }) test('should throw an error when a second level required field is missing', async () => { - const testNewDataset = { + const testNewDataset: DatasetDTO = { metadataBlockValues: [ { name: 'citation', @@ -144,19 +144,19 @@ describe('execute', () => { ] } expect.assertions(6) - let fieldValidationError: FieldValidationError + let fieldValidationError: FieldValidationError | undefined = undefined try { await createDataset.execute(testNewDataset) throw new Error('Use case should throw an error') } catch (error) { - fieldValidationError = error + fieldValidationError = error as FieldValidationError } finally { expect(fieldValidationError).toBeInstanceOf(FieldValidationError) - expect(fieldValidationError.citationBlockName).toEqual('citation') - expect(fieldValidationError.metadataFieldName).toEqual('authorName') - expect(fieldValidationError.parentMetadataFieldName).toEqual('author') - expect(fieldValidationError.fieldPosition).toEqual(0) - expect(fieldValidationError.message).toEqual( + expect(fieldValidationError?.citationBlockName).toEqual('citation') + expect(fieldValidationError?.metadataFieldName).toEqual('authorName') + expect(fieldValidationError?.parentMetadataFieldName).toEqual('author') + expect(fieldValidationError?.fieldPosition).toEqual(0) + expect(fieldValidationError?.message).toEqual( 'There was an error when validating the field authorName from metadata block citation with parent field author in position 0. Reason was: The field should not be empty.' ) } @@ -196,19 +196,19 @@ describe('execute', () => { ] } expect.assertions(6) - let fieldValidationError: FieldValidationError + let fieldValidationError: FieldValidationError | undefined = undefined try { await createDataset.execute(testNewDataset) throw new Error('Use case should throw an error') } catch (error) { - fieldValidationError = error + fieldValidationError = error as FieldValidationError } finally { expect(fieldValidationError).toBeInstanceOf(FieldValidationError) - expect(fieldValidationError.citationBlockName).toEqual('citation') - expect(fieldValidationError.metadataFieldName).toEqual('subject') - expect(fieldValidationError.parentMetadataFieldName).toEqual(undefined) - expect(fieldValidationError.fieldPosition).toEqual(1) - expect(fieldValidationError.message).toEqual( + expect(fieldValidationError?.citationBlockName).toEqual('citation') + expect(fieldValidationError?.metadataFieldName).toEqual('subject') + expect(fieldValidationError?.parentMetadataFieldName).toEqual(undefined) + expect(fieldValidationError?.fieldPosition).toEqual(1) + expect(fieldValidationError?.message).toEqual( 'There was an error when validating the field subject from metadata block citation in position 1. Reason was: The field does not have a valid controlled vocabulary value.' ) } diff --git a/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts b/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts index 7b290672..3678cee7 100644 --- a/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts +++ b/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts @@ -12,15 +12,15 @@ describe('execute', () => { }) test('should return all facetable metadata fields', async () => { - let metadataFieldInfos: MetadataFieldInfo[] = null + let metadataFieldInfos: MetadataFieldInfo[] | null = null try { metadataFieldInfos = await getAllFacetableMetadataFields.execute() } catch (error) { throw new Error('Should not raise an error') } finally { - expect(metadataFieldInfos.length).toBe(59) - expect(metadataFieldInfos[0].name).toBe('authorName') - expect(metadataFieldInfos[0].displayName).toBe('Author Name') + expect(metadataFieldInfos?.length).toBe(59) + expect(metadataFieldInfos?.[0].name).toBe('authorName') + expect(metadataFieldInfos?.[0].displayName).toBe('Author Name') } }) }) diff --git a/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts b/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts index 27c4ce7f..a8bfab2c 100644 --- a/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts +++ b/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts @@ -12,15 +12,15 @@ describe('execute', () => { }) test('should successfully return metadatablocks', async () => { - let metadataBlocks: MetadataBlock[] = null + let metadataBlocks: MetadataBlock[] | null = null try { metadataBlocks = await getAllMetadataBlocks.execute() } catch (error) { throw new Error('Should not raise an error') } finally { expect(metadataBlocks).not.toBeNull() - expect(metadataBlocks.length).toBe(6) - expect(metadataBlocks[0].metadataFields.title.name).toBe('title') + expect(metadataBlocks?.length).toBe(6) + expect(metadataBlocks?.[0].metadataFields.title.name).toBe('title') } }) }) diff --git a/test/functional/metadataBlocks/GetCollectionMetadataBlocks.test.ts b/test/functional/metadataBlocks/GetCollectionMetadataBlocks.test.ts index 63819c82..32ed08e4 100644 --- a/test/functional/metadataBlocks/GetCollectionMetadataBlocks.test.ts +++ b/test/functional/metadataBlocks/GetCollectionMetadataBlocks.test.ts @@ -12,29 +12,29 @@ describe('execute', () => { }) test('should successfully return collection metadatablocks when collection exists', async () => { - let collectionMetadataBlocks: MetadataBlock[] = null + let collectionMetadataBlocks: MetadataBlock[] | null = null try { collectionMetadataBlocks = await getCollectionMetadataBlocks.execute('root') } catch (error) { throw new Error('Should not raise an error') } finally { expect(collectionMetadataBlocks).not.toBeNull() - expect(collectionMetadataBlocks.length).toBe(1) - expect(collectionMetadataBlocks[0].metadataFields.title.name).toBe('title') + expect(collectionMetadataBlocks?.length).toBe(1) + expect(collectionMetadataBlocks?.[0].metadataFields.title.name).toBe('title') } }) test('should throw an error when a collection is not found', async () => { expect.assertions(2) - let readError: ReadError + let readError: ReadError | undefined = undefined try { await getCollectionMetadataBlocks.execute('notFoundCollectionAlias') throw new Error('Use case should throw an error') } catch (error) { - readError = error + readError = error as ReadError } finally { expect(readError).toBeInstanceOf(ReadError) - expect(readError.message).toEqual( + expect(readError?.message).toEqual( `There was an error when reading the resource. Reason was: [404] Can't find dataverse with identifier='notFoundCollectionAlias'` ) } diff --git a/test/integration/datasets/DatasetsRepository.test.ts b/test/integration/datasets/DatasetsRepository.test.ts index f946812f..c1d6aa85 100644 --- a/test/integration/datasets/DatasetsRepository.test.ts +++ b/test/integration/datasets/DatasetsRepository.test.ts @@ -494,8 +494,8 @@ describe('DatasetsRepository', () => { '1.0', DatasetNotNumberedVersion.DRAFT ) - expect(actual.metadataChanges[0]).not.toBeUndefined() - expect(actual.metadataChanges[0].blockName).toEqual('Citation Metadata') + expect(actual.metadataChanges?.[0]).not.toBeUndefined() + expect(actual.metadataChanges?.[0].blockName).toEqual('Citation Metadata') }) test('should return added file diff between two dataset versions', async () => { diff --git a/test/unit/auth/AuthRepository.test.ts b/test/unit/auth/AuthRepository.test.ts index b0261dfa..e78aa9fc 100644 --- a/test/unit/auth/AuthRepository.test.ts +++ b/test/unit/auth/AuthRepository.test.ts @@ -54,7 +54,7 @@ describe('logout', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'post').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: WriteError = undefined + let error: WriteError | undefined = undefined await sut.logout().catch((e) => (error = e)) expect(axios.post).toHaveBeenCalledWith( diff --git a/test/unit/datasets/DatasetResourceValidator.test.ts b/test/unit/datasets/DatasetResourceValidator.test.ts index 7dbd78b5..72113a69 100644 --- a/test/unit/datasets/DatasetResourceValidator.test.ts +++ b/test/unit/datasets/DatasetResourceValidator.test.ts @@ -35,11 +35,13 @@ describe('validate', () => { 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) + expect((error as FieldValidationError)?.citationBlockName).toEqual('citation') + expect((error as FieldValidationError)?.metadataFieldName).toEqual(expectedMetadataFieldName) + expect((error as FieldValidationError)?.parentMetadataFieldName).toEqual( + expectedParentMetadataFieldName + ) + expect((error as FieldValidationError)?.fieldPosition).toEqual(expectedPosition) + expect((error as FieldValidationError)?.message).toEqual(expectedErrorMessage) } } diff --git a/test/unit/files/FilesRepository.test.ts b/test/unit/files/FilesRepository.test.ts index bd46d166..741e9500 100644 --- a/test/unit/files/FilesRepository.test.ts +++ b/test/unit/files/FilesRepository.test.ts @@ -261,7 +261,7 @@ describe('FilesRepository', () => { offset: testOffset, orderCriteria: testFileOrderCriteria, contentType: testFileCriteria.contentType, - accessStatus: testFileCriteria.accessStatus.toString(), + accessStatus: testFileCriteria.accessStatus?.toString(), categoryName: testFileCriteria.categoryName, tabularTagName: testFileCriteria.tabularTagName } @@ -330,7 +330,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getDatasetFiles( testDatasetId, @@ -402,7 +402,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getDatasetFiles( TestConstants.TEST_DUMMY_PERSISTENT_ID, @@ -440,7 +440,7 @@ describe('FilesRepository', () => { const expectedRequestParamsWithOptional = { includeDeaccessioned: testIncludeDeaccessioned, contentType: testFileCriteria.contentType, - accessStatus: testFileCriteria.accessStatus.toString(), + accessStatus: testFileCriteria.accessStatus?.toString(), categoryName: testFileCriteria.categoryName, tabularTagName: testFileCriteria.tabularTagName } @@ -504,7 +504,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getDatasetFileCounts(testDatasetId, testDatasetVersionId, testIncludeDeaccessioned) .catch((e) => (error = e)) @@ -549,7 +549,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getDatasetFileCounts( TestConstants.TEST_DUMMY_PERSISTENT_ID, @@ -595,7 +595,7 @@ describe('FilesRepository', () => { mode: FileDownloadSizeMode.ARCHIVAL.toString(), includeDeaccessioned: testIncludeDeaccessioned, contentType: testFileCriteria.contentType, - accessStatus: testFileCriteria.accessStatus.toString(), + accessStatus: testFileCriteria.accessStatus?.toString(), categoryName: testFileCriteria.categoryName, tabularTagName: testFileCriteria.tabularTagName }, @@ -656,7 +656,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getDatasetFilesTotalDownloadSize( testDatasetId, @@ -708,7 +708,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getDatasetFilesTotalDownloadSize( TestConstants.TEST_DUMMY_PERSISTENT_ID, @@ -765,7 +765,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut.getFileDownloadCount(testFile.id).catch((e) => (error = e)) expect(axios.get).toHaveBeenCalledWith( @@ -806,7 +806,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getFileDownloadCount(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) @@ -859,7 +859,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut.getFileUserPermissions(testFile.id).catch((e) => (error = e)) expect(axios.get).toHaveBeenCalledWith( @@ -899,7 +899,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getFileUserPermissions(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) @@ -952,7 +952,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut.getFileDataTables(testFile.id).catch((e) => (error = e)) expect(axios.get).toHaveBeenCalledWith( @@ -993,7 +993,7 @@ describe('FilesRepository', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getFileDataTables(TestConstants.TEST_DUMMY_PERSISTENT_ID) .catch((e) => (error = e)) diff --git a/test/unit/files/GetFileDataTables.test.ts b/test/unit/files/GetFileDataTables.test.ts index 206817e9..7c30f082 100644 --- a/test/unit/files/GetFileDataTables.test.ts +++ b/test/unit/files/GetFileDataTables.test.ts @@ -25,7 +25,7 @@ describe('execute', () => { filesRepositoryStub.getFileDataTables = jest.fn().mockRejectedValue(testReadError) const sut = new GetFileDataTables(filesRepositoryStub) - let actualError: ReadError = undefined + let actualError: ReadError | undefined = undefined await sut.execute(testFileId).catch((e: ReadError) => (actualError = e)) expect(actualError).toBe(testReadError) diff --git a/test/unit/info/GetDataverseVersion.test.ts b/test/unit/info/GetDataverseVersion.test.ts index 929752df..4e943a45 100644 --- a/test/unit/info/GetDataverseVersion.test.ts +++ b/test/unit/info/GetDataverseVersion.test.ts @@ -22,7 +22,7 @@ describe('execute', () => { dataverseInfoRepositoryStub.getDataverseVersion = jest.fn().mockRejectedValue(testReadError) const sut = new GetDataverseVersion(dataverseInfoRepositoryStub) - let actualError: ReadError = undefined + let actualError: ReadError | undefined = undefined await sut.execute().catch((e) => (actualError = e)) expect(actualError).toBe(testReadError) diff --git a/test/unit/info/GetZipDownloadLimit.test.ts b/test/unit/info/GetZipDownloadLimit.test.ts index 4e475367..038c39c1 100644 --- a/test/unit/info/GetZipDownloadLimit.test.ts +++ b/test/unit/info/GetZipDownloadLimit.test.ts @@ -22,7 +22,7 @@ describe('execute', () => { dataverseInfoRepositoryStub.getZipDownloadLimit = jest.fn().mockRejectedValue(new ReadError()) const sut = new GetZipDownloadLimit(dataverseInfoRepositoryStub) - let actualError: ReadError + let actualError: ReadError | undefined = undefined await sut.execute().catch((e) => (actualError = e)) expect(actualError).toBeInstanceOf(ReadError) diff --git a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts index 8fbc9515..eb54546c 100644 --- a/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts +++ b/test/unit/metadataBlocks/GetMetadataBlockByName.test.ts @@ -29,7 +29,7 @@ describe('execute', () => { .mockRejectedValue(new ReadError()) const sut = new GetMetadataBlockByName(metadataBlocksRepositoryStub) - let actualError: ReadError + let actualError: ReadError | undefined = undefined await sut.execute(testMetadataBlockName).catch((e) => (actualError = e)) expect(actualError).toBeInstanceOf(ReadError) diff --git a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts index c59e01f0..916f098c 100644 --- a/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/unit/metadataBlocks/MetadataBlocksRepository.test.ts @@ -63,7 +63,7 @@ describe('MetadataBlocksRepository', () => { } jest.spyOn(axios, 'get').mockRejectedValue(testErrorResponse) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut .getCollectionMetadataBlocks(TestConstants.TEST_DUMMY_COLLECTION_ID, true) .catch((e) => (error = e)) @@ -104,7 +104,7 @@ describe('MetadataBlocksRepository', () => { } jest.spyOn(axios, 'get').mockRejectedValue(testErrorResponse) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut.getMetadataBlockByName(testMetadataBlockName).catch((e) => (error = e)) expect(axios.get).toHaveBeenCalledWith( diff --git a/test/unit/users/UsersRepository.test.ts b/test/unit/users/UsersRepository.test.ts index 7cabe4ff..f7117a5c 100644 --- a/test/unit/users/UsersRepository.test.ts +++ b/test/unit/users/UsersRepository.test.ts @@ -67,7 +67,7 @@ describe('getCurrentAuthenticatedUser', () => { test('should return error result on error response', async () => { jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) - let error: ReadError = undefined + let error: ReadError | undefined = undefined await sut.getCurrentAuthenticatedUser().catch((e) => (error = e)) expect(axios.get).toHaveBeenCalledWith( diff --git a/tsconfig.json b/tsconfig.json index 01309975..d6f82134 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,8 @@ "target": "es2015", "outDir": "./dist", "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "strict": true }, "include": ["src/**/*"], "exclude": [