From 686ff792931f704adf99fc8863ca47680b913ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Saracca?= Date: Thu, 2 Oct 2025 16:09:27 -0300 Subject: [PATCH 1/3] refactor: remove date format validation logic and associated error handling --- .../SingleMetadataFieldValidator.ts | 49 +--------------- .../validators/errors/DateFormatFieldError.ts | 19 ------ .../datasets/DatasetResourceValidator.test.ts | 58 ------------------- 3 files changed, 1 insertion(+), 125 deletions(-) delete mode 100644 src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts diff --git a/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts b/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts index f39f0ed4..f233e450 100644 --- a/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts +++ b/src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts @@ -3,14 +3,12 @@ import { DatasetMetadataFieldAndValueInfo } from './BaseMetadataFieldValidator' import { ControlledVocabularyFieldError } from './errors/ControlledVocabularyFieldError' -import { DateFormatFieldError } from './errors/DateFormatFieldError' import { MetadataFieldValidator } from './MetadataFieldValidator' import { DatasetMetadataChildFieldValueDTO } from '../../dtos/DatasetDTO' import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator' import { MetadataFieldInfo, - MetadataFieldType, - MetadataFieldWatermark + MetadataFieldType } from '../../../../metadataBlocks/domain/models/MetadataBlock' export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { @@ -50,10 +48,6 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { this.validateControlledVocabularyFieldValue(datasetMetadataFieldAndValueInfo) } - if (metadataFieldInfo.type == MetadataFieldType.Date) { - this.validateDateFieldValue(datasetMetadataFieldAndValueInfo) - } - if (metadataFieldInfo.childMetadataFields != undefined) { this.validateChildMetadataFieldValues(datasetMetadataFieldAndValueInfo) } @@ -76,47 +70,6 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator { } } - private validateDateFieldValue( - datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo - ) { - const { - metadataFieldInfo: { watermark }, - metadataFieldValue - } = datasetMetadataFieldAndValueInfo - - const acceptsAllDateFormats = watermark === MetadataFieldWatermark.YYYYOrYYYYMMOrYYYYMMDD - - const YYYY_MM_DD_DATE_FORMAT_REGEX = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/ - - const YYYY_MM_FORMAT_REGEX = /^\d{4}-(0[1-9]|1[0-2])$/ - - const YYYY_FORMAT_REGEX = /^\d{4}$/ - - const isValidDateFormat = (value: string): boolean => { - if (acceptsAllDateFormats) { - // Check if it matches any of the formats - return ( - YYYY_MM_DD_DATE_FORMAT_REGEX.test(value) || - YYYY_MM_FORMAT_REGEX.test(value) || - YYYY_FORMAT_REGEX.test(value) - ) - } else { - // Only accepts YYYY-MM-DD format - return YYYY_MM_DD_DATE_FORMAT_REGEX.test(value) - } - } - - if (!isValidDateFormat(metadataFieldValue as string)) { - throw new DateFormatFieldError( - datasetMetadataFieldAndValueInfo.metadataFieldKey, - datasetMetadataFieldAndValueInfo.metadataBlockName, - watermark, - datasetMetadataFieldAndValueInfo.metadataParentFieldKey, - datasetMetadataFieldAndValueInfo.metadataFieldPosition - ) - } - } - private validateChildMetadataFieldValues( datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo ) { diff --git a/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts b/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts deleted file mode 100644 index 6a174837..00000000 --- a/src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { FieldValidationError } from './FieldValidationError' - -export class DateFormatFieldError extends FieldValidationError { - constructor( - metadataFieldName: string, - citationBlockName: string, - validDateFormat: string, - parentMetadataFieldName?: string, - fieldPosition?: number - ) { - super( - metadataFieldName, - citationBlockName, - parentMetadataFieldName, - fieldPosition, - `The field requires a valid date format (${validDateFormat}).` - ) - } -} diff --git a/test/unit/datasets/DatasetResourceValidator.test.ts b/test/unit/datasets/DatasetResourceValidator.test.ts index 91d5f10e..c83bb241 100644 --- a/test/unit/datasets/DatasetResourceValidator.test.ts +++ b/test/unit/datasets/DatasetResourceValidator.test.ts @@ -154,64 +154,6 @@ describe('validate', () => { expect(() => sut.validate(testDataset, testMetadataBlocks)).not.toThrow() }) - test('should raise a date format validation error when a date field has an invalid format', () => { - const testDataset = createDatasetDTO(undefined, undefined, undefined, '1-1-2020') - - expect.assertions(6) - runValidateExpectingFieldValidationError( - testDataset, - 'timePeriodCoveredStart', - 'There was an error when validating the field timePeriodCoveredStart from metadata block citation. Reason was: The field requires a valid date format (YYYY or YYYY-MM or YYYY-MM-DD).' - ) - }) - - test('should not raise a date format validation error when a date field has a valid YYYY-MM-DD format', () => { - const testDataset = createDatasetDTO(undefined, undefined, undefined, '2020-01-01') - expect(() => sut.validate(testDataset, testMetadataBlocks)).not.toThrow() - }) - - test('should not raise a date format validation error when a date field has a valid YYYY-MM format', () => { - const testDataset = createDatasetDTO(undefined, undefined, undefined, '2020-01') - expect(() => sut.validate(testDataset, testMetadataBlocks)).not.toThrow() - }) - - test('should not raise a date format validation error when a date field has a valid YYYY format', () => { - const testDataset = createDatasetDTO(undefined, undefined, undefined, '2020') - expect(() => sut.validate(testDataset, testMetadataBlocks)).not.toThrow() - }) - - test('should raise a date format validation error when a date field has a wrong date format according to the field watermark', () => { - const testDataset = createDatasetDTO( - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - '01-03' - ) - - expect.assertions(6) - runValidateExpectingFieldValidationError( - testDataset, - 'dateOfCreation', - 'There was an error when validating the field dateOfCreation 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 according to the field watermark', () => { - const testDataset = createDatasetDTO( - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - '2024-01-03' - ) - expect(() => sut.validate(testDataset, testMetadataBlocks)).not.toThrow() - }) - test('should raise a controlled vocabulary error when a controlled vocabulary field has an invalid format', () => { const testDataset = createDatasetDTO( undefined, From 565bcd5d3c21cf86631fe54c828d6eecaface351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Saracca?= Date: Thu, 2 Oct 2025 16:22:24 -0300 Subject: [PATCH 2/3] docs: add to changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ea3e0f7..cb116c44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Removed +- Removed date fields validations in create and update dataset use cases, since validation is already handled in the backend and SPA frontend (other clients should perform client side validation also). This avoids duplicated logic and keeps the package focused on its core responsibility. + [Unreleased]: https://github.com/IQSS/dataverse-client-javascript/compare/v2.1.0...develop --- From bb9affc552876ca5d64ea583f63d2d461b4a290c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Saracca?= Date: Thu, 2 Oct 2025 16:50:59 -0300 Subject: [PATCH 3/3] test: fix test after change in the backend --- test/integration/collections/CollectionsRepository.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index d1afd76d..2974e482 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -996,8 +996,8 @@ describe('CollectionsRepository', () => { expect(updatedCollection.alias).toBe(testUpdatedCollectionAlias) expect(updatedCollection.name).toBe(updatedCollectionName) expect(updatedCollection.affiliation).toBe(updatedCollectionAffiliation) - expect(updatedCollection.inputLevels?.length).toBe(1) - const updatedInputLevel = updatedCollection.inputLevels?.[0] + expect(updatedCollection.inputLevels?.length).toBe(2) + const updatedInputLevel = updatedCollection.inputLevels?.[1] expect(updatedInputLevel?.datasetFieldName).toBe('country') expect(updatedInputLevel?.include).toBe(true) expect(updatedInputLevel?.required).toBe(false)