From 2112b0d99b21af6da879190541a1a21586bd33bb Mon Sep 17 00:00:00 2001 From: Pierre Vasseur <132562606+PierreVasseur@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:51:37 +0100 Subject: [PATCH] Feat/extend Zod on datasets and distributions (#605) * add tests and zod template * fix tests * fix tests * fix tests * fix tests * fix tests * replace conditions with zod * minor change * minor change * minor change * reshape --- .../datasets/datasets/validation.js | 53 +++------ .../datasets/datasets/validation.spec.js | 101 ++++++++++++++++++ .../datasets/distributions/edit.js | 22 +--- .../datasets/distributions/validation.js | 11 ++ .../datasets/distributions/validation.spec.js | 71 ++++++++++++ 5 files changed, 196 insertions(+), 62 deletions(-) create mode 100644 app/src/js/applications/datasets/datasets/validation.spec.js create mode 100644 app/src/js/applications/datasets/distributions/validation.js create mode 100644 app/src/js/applications/datasets/distributions/validation.spec.js diff --git a/app/src/js/applications/datasets/datasets/validation.js b/app/src/js/applications/datasets/datasets/validation.js index 3590218bf..633d05fbd 100644 --- a/app/src/js/applications/datasets/datasets/validation.js +++ b/app/src/js/applications/datasets/datasets/validation.js @@ -1,43 +1,14 @@ import D, { D1, D2 } from '../../../i18n/build-dictionary'; +import { formatValidation } from 'js/utils/validation'; +import { z } from 'zod'; -export function validate({ - catalogRecord, - disseminationStatus, - labelLg1, - labelLg2, - idSerie, -}) { - const errorMessages = []; - const { creator, contributor } = catalogRecord ?? {}; - if (!labelLg1) { - errorMessages.push(D.mandatoryProperty(D1.title)); - } - if (!labelLg2) { - errorMessages.push(D.mandatoryProperty(D2.title)); - } - if (!creator) { - errorMessages.push(D.mandatoryProperty(D1.creatorTitle)); - } - if (!contributor) { - errorMessages.push(D.mandatoryProperty(D1.contributorTitle)); - } - if (!disseminationStatus) { - errorMessages.push(D.mandatoryProperty(D1.disseminationStatusTitle)); - } - if (!idSerie) { - errorMessages.push(D.mandatoryProperty(D1.generatedBy)); - } - return { - fields: { - labelLg1: !labelLg1 ? D.mandatoryProperty(D1.title) : '', - labelLg2: !labelLg2 ? D.mandatoryProperty(D2.title) : '', - creator: !creator ? D.mandatoryProperty(D1.creatorTitle) : '', - contributor: !contributor ? D.mandatoryProperty(D1.contributorTitle) : '', - disseminationStatus: !disseminationStatus - ? D.mandatoryProperty(D1.disseminationStatusTitle) - : '', - idSerie: !idSerie ? D.mandatoryProperty(D1.generatedBy) : '', - }, - errorMessage: errorMessages, - }; -} +const Dataset = z.object({ + labelLg1: z.string({ required_error: D.mandatoryProperty(D1.title) }).min(1, { message: D.mandatoryProperty(D1.title) }), + labelLg2: z.string({ required_error: D.mandatoryProperty(D2.title) }).min(1, { message: D.mandatoryProperty(D2.title) }), + creator: z.string({ required_error: D.mandatoryProperty(D1.creatorTitle) }), + contributor: z.string({ required_error: D.mandatoryProperty(D1.contributorTitle) }), + disseminationStatus: z.string({ required_error: D.mandatoryProperty(D1.disseminationStatusTitle) }), + idSerie: z.string({ required_error: D.mandatoryProperty(D1.generatedBy) }), +}); + +export const validate = ({catalogRecord, ...otherFields}) => formatValidation(Dataset)({creator: catalogRecord?.creator, contributor: catalogRecord?.contributor, ...otherFields}); diff --git a/app/src/js/applications/datasets/datasets/validation.spec.js b/app/src/js/applications/datasets/datasets/validation.spec.js new file mode 100644 index 000000000..bcdd2fc00 --- /dev/null +++ b/app/src/js/applications/datasets/datasets/validation.spec.js @@ -0,0 +1,101 @@ +import { validate } from './validation'; + +describe('validation', function() { + it('should return an error for labelLg1', function() { + expect( + validate({ + labelLg2: 'labelLg2', + catalogRecord: { + creator: 'creator', + contributor: 'contributor', + }, + disseminationStatus: 'status', + idSerie: 'id', + }) + ).toEqual({ + errorMessage: [ + 'The property Intitulé is required.', + ], + fields: { + labelLg1: 'The property Intitulé is required.', + labelLg2: '', + creator: '', + contributor: '', + disseminationStatus: '', + idSerie: '', + }, + }); + }); + it('should return an error for labelLg2', function() { + expect( + validate({ + labelLg1: 'labelLg1', + catalogRecord: { + creator: 'creator', + contributor: 'contributor', + }, + disseminationStatus: 'status', + idSerie: 'id', + }) + ).toEqual({ + errorMessage: [ + 'The property Title is required.', + ], + fields: { + labelLg1: '', + labelLg2: 'The property Title is required.', + creator: '', + contributor: '', + disseminationStatus: '', + idSerie: '', + }, + }); + }); + it('should return an error for creator, contributor, disseminationStatus and idSerie', function() { + expect( + validate({ + labelLg1: 'labelLg2', + labelLg2: 'labelLg2', + }) + ).toEqual({ + errorMessage: [ + 'The property Propriétaire is required.', + 'The property Gestionnaire is required.', + 'The property Statut de diffusion is required.', + 'The property Produit de is required.', + ], + fields: { + labelLg1: '', + labelLg2: '', + creator: 'The property Propriétaire is required.', + contributor: 'The property Gestionnaire is required.', + disseminationStatus: 'The property Statut de diffusion is required.', + idSerie: 'The property Produit de is required.', + }, + }); + }); + it('should return no error', function() { + expect( + validate({ + labelLg1: 'labelLg2', + labelLg2: 'labelLg2', + catalogRecord: { + creator: 'creator', + contributor: 'contributor', + }, + disseminationStatus: 'status', + idSerie: 'id', + }) + ).toEqual({ + errorMessage: [], + fields: { + labelLg1: '', + labelLg2: '', + creator: '', + contributor: '', + disseminationStatus: '', + idSerie: '', + }, + }); + }); +}); diff --git a/app/src/js/applications/datasets/distributions/edit.js b/app/src/js/applications/datasets/distributions/edit.js index 09a2fc633..75fdc3f18 100644 --- a/app/src/js/applications/datasets/distributions/edit.js +++ b/app/src/js/applications/datasets/distributions/edit.js @@ -22,27 +22,7 @@ import datasetApi from '../../../remote-api/datasets/datasets-api'; import { D1, D2 } from '../../../i18n'; import { default as ReactSelect } from 'react-select'; import D from '../../../i18n/build-dictionary'; - -export function validate({ idDataset, labelLg1, labelLg2 }) { - const errorMessages = []; - if (!idDataset) { - errorMessages.push(D.mandatoryProperty(D1.datasetsTitle)); - } - if (!labelLg1) { - errorMessages.push(D.mandatoryProperty(D1.title)); - } - if (!labelLg2) { - errorMessages.push(D.mandatoryProperty(D2.title)); - } - return { - fields: { - labelLg1: !labelLg1 ? D.mandatoryProperty(D1.title) : '', - labelLg2: !labelLg2 ? D.mandatoryProperty(D2.title) : '', - idDataset: !idDataset ? D.mandatoryProperty(D1.datasetsTitle) : '', - }, - errorMessage: errorMessages, - }; -} +import { validate } from './validation'; export const DistributionEdit = (props) => { const { id } = useParams(); diff --git a/app/src/js/applications/datasets/distributions/validation.js b/app/src/js/applications/datasets/distributions/validation.js new file mode 100644 index 000000000..046fe50b2 --- /dev/null +++ b/app/src/js/applications/datasets/distributions/validation.js @@ -0,0 +1,11 @@ +import D, { D1, D2 } from '../../../i18n/build-dictionary'; +import { formatValidation } from 'js/utils/validation'; +import { z } from 'zod'; + +const Distribution = z.object({ + labelLg1: z.string({ required_error: D.mandatoryProperty(D1.title) }).min(1, { message: D.mandatoryProperty(D1.title) }), + labelLg2: z.string({ required_error: D.mandatoryProperty(D2.title) }).min(1, { message: D.mandatoryProperty(D2.title) }), + idDataset: z.string({ required_error: D.mandatoryProperty(D1.datasetsTitle) }), +}); + +export const validate = formatValidation(Distribution); diff --git a/app/src/js/applications/datasets/distributions/validation.spec.js b/app/src/js/applications/datasets/distributions/validation.spec.js new file mode 100644 index 000000000..635437692 --- /dev/null +++ b/app/src/js/applications/datasets/distributions/validation.spec.js @@ -0,0 +1,71 @@ +import { validate } from './validation'; + +describe('validation', function() { + it('should return an error for labelLg1', function() { + expect( + validate({ + labelLg2: 'labelLg2', + idDataset: 'id', + }) + ).toEqual({ + errorMessage: [ + 'The property Intitulé is required.', + ], + fields: { + labelLg1: 'The property Intitulé is required.', + labelLg2: '', + idDataset: '', + }, + }); + }); + it('should return an error for labelLg2', function() { + expect( + validate({ + labelLg1: 'labelLg1', + idDataset: 'id', + }) + ).toEqual({ + errorMessage: [ + 'The property Title is required.', + ], + fields: { + labelLg1: '', + labelLg2: 'The property Title is required.', + idDataset: '', + }, + }); + }); + it('should return an error for idDataset', function() { + expect( + validate({ + labelLg1: 'labelLg1', + labelLg2: 'labelLg2', + }) + ).toEqual({ + errorMessage: [ + 'The property Jeu de Données is required.', + ], + fields: { + labelLg1: '', + labelLg2: '', + idDataset: 'The property Jeu de Données is required.', + }, + }); + }); + it('should return no error', function() { + expect( + validate({ + labelLg1: 'labelLg2', + labelLg2: 'labelLg2', + idDataset: 'id', + }) + ).toEqual({ + errorMessage: [], + fields: { + labelLg1: '', + labelLg2: '', + idDataset: '', + }, + }); + }); +});