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: '',
+ },
+ });
+ });
+});