From 2d7ed527f3c6321398dfdb430cda5d5b0ae17d7b Mon Sep 17 00:00:00 2001 From: lucile varloteaux <lucile.varloteaux@inrae.fr> Date: Thu, 16 Jun 2022 16:15:25 +0200 Subject: [PATCH 1/4] =?UTF-8?q?r=C3=A9paration=20affichage=20erreur=20page?= =?UTF-8?q?=20repository=20(retr=C3=A9=20des=20erreur=20dupliqu=C3=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/locales/fr.json | 2 +- ui/src/services/AlertService.js | 116 +++++++++--------- ui/src/services/ErrorsService.js | 15 ++- .../datatype/DataTypesRepositoryView.vue | 74 +++++++++-- 4 files changed, 136 insertions(+), 71 deletions(-) diff --git a/ui/src/locales/fr.json b/ui/src/locales/fr.json index 57ffd4f27..f0a356018 100644 --- a/ui/src/locales/fr.json +++ b/ui/src/locales/fr.json @@ -117,7 +117,7 @@ "authorizationScopeVariableComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>", "authorizationVariableComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille les informations spatiales à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code> pour l'autorisation <code>{authorizationName}</code>. Valeurs possibles <code>{knownComponents}</code>", "authorizationVariableComponentKeyUnknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>", - "badauthorizationscopeforrepository": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>", + "badauthorizationscopeforrepository": "L'autorisation (<code>{authorization}</code>) doit être <code>{expectedValue}</code> et non <code>{givenValue}</code>", "checkerExpressionReturnedFalse": "La contrainte suivante n'est pas respectée : <code>{expression}</code>", "csvBoundToUnknownVariable": "Dans le format CSV, l’entête <code>{header}</code> est lié à la variable <code>{variable}</code> qui n’est pas connue. Variables connues <code>{variables}</code>", "csvBoundToUnknownVariableComponent": "Dans le format CSV, l’entête <code>{header}</code> est lié à la variable <code>{variable}</code> mais elle n’a pas de composant <code>{component}</code>. Composants connus <code>{components}</code>", diff --git a/ui/src/services/AlertService.js b/ui/src/services/AlertService.js index 3b4aada75..e21c81b55 100644 --- a/ui/src/services/AlertService.js +++ b/ui/src/services/AlertService.js @@ -1,6 +1,6 @@ -import {i18n} from "@/main"; -import {BuefyTypes} from "@/utils/BuefyUtils"; -import {ToastProgrammatic, DialogProgrammatic} from "buefy"; +import { i18n } from "@/main"; +import { BuefyTypes } from "@/utils/BuefyUtils"; +import { ToastProgrammatic, DialogProgrammatic } from "buefy"; const TOAST_INFO_DURATION = 3000; const TOAST_ERROR_DURATION = 8000; @@ -10,66 +10,66 @@ const TOAST_POSITION = "is-top"; * Un service pour gérer les différents messages d'alerte et popup d'info s'affichant sur l'application */ export class AlertService { - static INSTANCE = new AlertService(); + static INSTANCE = new AlertService(); - toastSuccess(message) { - ToastProgrammatic.open({ - message: message, - type: BuefyTypes.SUCCESS, - duration: TOAST_INFO_DURATION, - position: TOAST_POSITION, - }); - } + toastSuccess(message) { + ToastProgrammatic.open({ + message: message, + type: BuefyTypes.SUCCESS, + duration: TOAST_INFO_DURATION, + position: TOAST_POSITION, + }); + } + + toastWarn(message, error) { + console.warn("[WARNING] " + message, error); + ToastProgrammatic.open({ + message: message, + type: BuefyTypes.WARNING, + duration: TOAST_ERROR_DURATION, + position: TOAST_POSITION, + }); + } - toastWarn(message, error) { - console.warn("[WARNING] " + message, error); + toastError(message, error) { + if (error.content) { + error.content.then((t) => { ToastProgrammatic.open({ - message: message, - type: BuefyTypes.WARNING, - duration: TOAST_ERROR_DURATION, - position: TOAST_POSITION, + message: i18n.t("exceptionMessage." + t.message, t.params), + type: BuefyTypes.DANGER, + duration: TOAST_ERROR_DURATION, + position: TOAST_POSITION, }); + }); + } else { + ToastProgrammatic.open({ + message: message, + type: BuefyTypes.DANGER, + duration: TOAST_ERROR_DURATION, + position: TOAST_POSITION, + }); } + } - toastError(message, error) { - if (error.content) { - error.content.then((t) => { - ToastProgrammatic.open({ - message: i18n.t('exceptionMessage.' + t.message, t.params), - type: BuefyTypes.DANGER, - duration: TOAST_ERROR_DURATION, - position: TOAST_POSITION, - }); - }) - } else { - ToastProgrammatic.open({ - message: message, - type: BuefyTypes.DANGER, - duration: TOAST_ERROR_DURATION, - position: TOAST_POSITION, - }); - } + toastServerError(error) { + if (error.content != null) { + error.content.then((value) => this.toastError(value.message, error)); + } else { + this.toastError(i18n.t("alert.server-error"), error); } + } - toastServerError(error) { - if (error.content != null) { - error.content.then((value) => this.toastError(value.message, error)); - } else { - this.toastError(i18n.t("alert.server-error"), error); - } - } - - dialog(title, message, confirmText, type, onConfirmCb) { - DialogProgrammatic.confirm({ - title: title, - message: message, - confirmText: confirmText, - type: type, - hasIcon: true, - cancelText: this.cancelMsg, - onConfirm: () => { - onConfirmCb(); - }, - }); - } -} \ No newline at end of file + dialog(title, message, confirmText, type, onConfirmCb) { + DialogProgrammatic.confirm({ + title: title, + message: message, + confirmText: confirmText, + type: type, + hasIcon: true, + cancelText: this.cancelMsg, + onConfirm: () => { + onConfirmCb(); + }, + }); + } +} diff --git a/ui/src/services/ErrorsService.js b/ui/src/services/ErrorsService.js index 2497aefdd..5ce861953 100644 --- a/ui/src/services/ErrorsService.js +++ b/ui/src/services/ErrorsService.js @@ -139,7 +139,18 @@ export class ErrorsService { const func = ERRORS[csvError.validationCheckResult.message]; if (csvError.validationCheckResult.messageParams.target != null) { if (csvError.validationCheckResult.messageParams.target.column != null) { - csvError.validationCheckResult.messageParams.target = csvError.validationCheckResult.messageParams.target.column; + csvError.validationCheckResult.messageParams.target = + csvError.validationCheckResult.messageParams.target.column; + } + } + if(csvError.validationCheckResult.messageParams.expectedValue != null || csvError.validationCheckResult.messageParams.givenValue != null) { + if (csvError.validationCheckResult.messageParams.expectedValue.sql != null) { + csvError.validationCheckResult.messageParams.expectedValue = + csvError.validationCheckResult.messageParams.expectedValue.sql; + } + if(csvError.validationCheckResult.messageParams.givenValue.sql != null) { + csvError.validationCheckResult.messageParams.givenValue = + csvError.validationCheckResult.messageParams.givenValue.sql; } } if (!func) { @@ -153,4 +164,4 @@ export class ErrorsService { return func(params); }); } -} \ No newline at end of file +} diff --git a/ui/src/views/datatype/DataTypesRepositoryView.vue b/ui/src/views/datatype/DataTypesRepositoryView.vue index 1af62cef7..816e9c71b 100644 --- a/ui/src/views/datatype/DataTypesRepositoryView.vue +++ b/ui/src/views/datatype/DataTypesRepositoryView.vue @@ -191,7 +191,21 @@ {{ currentDataset[0].periode }} + <div v-if="errorsMessages.length" style="margin: 10px"> + <div v-for="msg in errorsMessages" v-bind:key="msg"> + <b-message + :title="$t('message.data-type-config-error')" + type="is-danger" + has-icon + :aria-close-label="$t('message.close')" + class="mt-4 DataTypesManagementView-message" + > + <span v-html="msg" /> + </b-message> + </div> + </div> </caption> + <tr> <th align>{{ $t("dataTypesRepository.table-file-data-id") }}</th> <th align>{{ $t("dataTypesRepository.table-file-data-size") }}</th> @@ -272,6 +286,7 @@ import { Dataset } from "@/model/file/Dataset"; import { InternationalisationService } from "@/services/InternationalisationService"; import { LOCAL_STORAGE_LANG } from "@/services/Fetcher"; import DropDownMenu from "@/components/common/DropDownMenu"; +import {HttpStatusCodes} from "@/utils/HttpUtils"; @Component({ components: { DropDownMenu, CollapsibleTree, PageView, SubMenu }, @@ -305,6 +320,7 @@ export default class DataTypesRepositoryView extends Vue { endDate = null; comment = ""; currentDataset = null; + errorsMessages = []; mounted() { this.$on("authorizationChanged", this.updateDatasets); @@ -471,29 +487,67 @@ export default class DataTypesRepositoryView extends Vue { this.file, fileOrId ); - console.log(fileOrId); this.$emit("uploaded", uuid); } } async publish(dataset, pusblished) { + this.errorsMessages = []; dataset.params.published = pusblished; let requiredauthorizations = dataset.params.binaryFiledataset.requiredauthorizations; requiredauthorizations = Object.keys(requiredauthorizations).reduce(function (acc, key) { acc[key] = acc[key] ? acc[key].sql : ""; return acc; }, requiredauthorizations); - console.log("requiredauthorizations", requiredauthorizations); dataset.params.binaryFiledataset.requiredauthorizations = requiredauthorizations; - console.log("binaryFiledataset", dataset.params.binaryFiledataset); var fileOrId = new FileOrUUID(dataset.id, dataset.params.binaryFiledataset, pusblished); - var uuid = await this.dataService.addData( - this.applicationName, - this.dataTypeId, - null, - fileOrId - ); - this.$emit("published", uuid.fileId); + try { + var uuid = await this.dataService.addData( + this.applicationName, + this.dataTypeId, + null, + fileOrId + ); + this.$emit("published", uuid.fileId); + this.alertService.toastSuccess(this.$t("alert.data-updated")); + } catch (error) { + this.checkMessageErrors(error); + } + } + + checkMessageErrors(error) { + let message = []; + if (error.httpResponseCode === HttpStatusCodes.BAD_REQUEST) { + if (error.content != null) { + this.errorsList = []; + error.content.then((value) => { + for (let i = 0; i < value.length; i++) { + if (message.length > 0) { + if (JSON.stringify(value[i]) !== JSON.stringify(value[i-message.length])) { + console.log(message) + this.errorsList.push(value[i]); + } + for(let j = 0; j < message.length; j++) { + if (!message.includes(value[i].validationCheckResult.message)) { + message.push(value[i].validationCheckResult.message); + } + } + } else { + message.push(value[i].validationCheckResult.message); + this.errorsList.push(value[i]); + } + } + console.log(this.errorsList) + if (this.errorsList.length !== 0) { + this.errorsMessages = this.errorsService.getCsvErrorsMessages(this.errorsList); + } else { + this.errorsMessages = this.errorsService.getErrorsMessages(error); + } + }); + } + } else { + this.alertService.toastServerError(error); + } } selectAuthorization(key, event) { -- GitLab From cffe6c6f8589666ca57884c0e35d91b7e3526405 Mon Sep 17 00:00:00 2001 From: lucile varloteaux <lucile.varloteaux@inrae.fr> Date: Wed, 22 Jun 2022 15:24:58 +0200 Subject: [PATCH 2/4] =?UTF-8?q?r=C3=A9alisation=20test=20back=20manquant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApplicationConfigurationServiceTest.java | 90 ++++++++- .../java/fr/inra/oresing/rest/Fixtures.java | 50 ++++- .../oresing/rest/TestReferencesErrors.java | 45 ++++- .../data/recursivite/recusivite.yaml | 187 +++++++++++++----- src/test/resources/data/recursivite/sites.csv | 44 +++++ ...ons_prelevements_01-01-2020_31-12-2020.csv | 17 ++ .../applications/errors/ref_ola_errors.json | 2 +- 7 files changed, 383 insertions(+), 52 deletions(-) create mode 100644 src/test/resources/data/recursivite/sites.csv create mode 100644 src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv diff --git a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java index f3043cedf..a9ecaad23 100644 --- a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java +++ b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java @@ -1111,6 +1111,72 @@ public class ApplicationConfigurationServiceTest { Assert.assertEquals("timeScopeVariableComponentPatternUnknown", onlyError.getMessage()); } + // ne renvois pas d'erreur + @Test + @Ignore + public void testMissingBoundToForConstantDescription() { + ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingBoundToForConstantDescription", "format:", "format:\n" + + " constants:\n" + + " - rowNumber: 1\n" + + " columnNumber: 2\n" + + " exportHeader: nom du projet"); + Assert.assertFalse(configurationParsingResult.isValid()); + ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults()); + log.debug(onlyError.getMessage()); + Assert.assertEquals("missingBoundToForConstantDescription", onlyError.getMessage()); + } + + // ne renvois pas d'erreur + @Test + @Ignore + public void testMissingColumnNumberOrHeaderNameForConstantDescription() { + ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingColumnNumberOrHeaderNameForConstantDescription", "format:", "format:\n" + + " constants:\n" + + " - rowNumber: 1\n" + + " boundTo:\n" + + " variable: localization\n" + + " component: site\n" + + " exportHeader: \"Site\""); + Assert.assertFalse(configurationParsingResult.isValid()); + ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults()); + log.debug(onlyError.getMessage()); + Assert.assertEquals("missingColumnNumberOrHeaderNameForConstantDescription", onlyError.getMessage()); + } + + // ne renvois pas d'erreur + @Test + @Ignore + public void testMissingExportHeaderNameForConstantDescription() { + ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingExportHeaderNameForConstantDescription", "format:", "format:\n" + + " constants:\n" + + " - rowNumber: 1\n" + + " columnNumber: 2\n" + + " boundTo:\n" + + " variable: localization\n" + + " component: site\n"); + Assert.assertFalse(configurationParsingResult.isValid()); + ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults()); + log.debug(onlyError.getMessage()); + Assert.assertEquals("missingExportHeaderNameForConstantDescription", onlyError.getMessage()); + } + + // ne renvois pas d'erreur + @Test + @Ignore + public void testMissingRowLineForConstantDescription() { + ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingRowLineForConstantDescription", "format:", "format:\n" + + " constants:\n" + + " - columnNumber: 2\n" + + " boundTo:\n" + + " variable: localization\n" + + " component: site\n" + + " exportHeader: \"Site\""); + Assert.assertFalse(configurationParsingResult.isValid()); + ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults()); + log.debug(onlyError.getMessage()); + Assert.assertEquals("missingRowLineForConstantDescription", onlyError.getMessage()); + } + @Test public void testUnknownReferenceForCheckerInReferenceColumn() { ConfigurationParsingResult configurationParsingResult = parseYaml("testUnknownReferenceForCheckerInReferenceColumn", "nom du type de plateforme:\n" + @@ -1129,6 +1195,28 @@ public class ApplicationConfigurationServiceTest { Assert.assertEquals("unrecognizedProperty", onlyError.getMessage()); } + // je n'arrive pas à fiare remonter cette erreur mais je ne suis pas sûr d'être sur pour cette erreur + @Test + @Ignore + public void testTimerangeoutofinterval() { + ConfigurationParsingResult configurationParsingResult = parseYaml("testTimerangeoutofinterval", "variables:\n" + + " components:\n" + + " biovolume_algal:", "variables:\n" + + " components:\n" + + " biovolume_algal:\n" + + " chartDescription:\n" + + " value: value\n" + + " aggregation:\n" + + " variable: variables\n" + + " component: biovolume_algal\n" + + " unit: \"unit\"\n" + + " gap: '1 MONTH'"); + Assert.assertFalse(configurationParsingResult.isValid()); + ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults()); + log.debug(onlyError.getMessage()); + Assert.assertEquals("timerangeoutofinterval", onlyError.getMessage()); + } + @Test public void testNoCapturingGroupForDatatypeRepository() { ConfigurationParsingResult configurationParsingResult = parseYaml("testNoCapturingGroupForDatatypeRepository", @@ -1205,4 +1293,4 @@ public class ApplicationConfigurationServiceTest { log.debug(onlyError.getMessage()); Assert.assertEquals("invalidCapturingGroupForEndDateDatatypeRepositoryDate", onlyError.getMessage()); } -} \ No newline at end of file +} diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java index b552d269a..6628fe11e 100644 --- a/src/test/java/fr/inra/oresing/rest/Fixtures.java +++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java @@ -153,6 +153,23 @@ public class Fixtures { " }", plateforme, projet, site); } + + public String getConditionsPrelevementRepositoryId(String site) { + return String.format("{\n" + + " \"requiredAuthorizations\":{\n" + + " \"localization_site\":\"leman\"\n" + + " },\n" + + " \"from\":\"2020-01-01 00:00:00\",\n" + + " \"to\":\"2020-31-12 00:00:00\"\n" + + " }", site); + } + public String getConditionsPrelevementDataResourceName() { + return "/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv"; + } + public String getConditionsPrelevementRepositoryResourceName(String site) { + return String.format("/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv", site); + } + public Map<String, String> getProgressiveYaml() { Map<String, String> yamls = new LinkedHashMap<>(); yamls.put("testAuthorizationScopeWithoutReference", "/data/progressiveyaml/testAuthorizationScopeWithoutReference.yaml"); @@ -186,6 +203,7 @@ public class Fixtures { Map<String, String> referentielFiles = new LinkedHashMap<>(); referentielFiles.put("proprietes_taxon", "/data/recursivite/proprietes_des_taxons.csv"); referentielFiles.put("taxon", "/data/recursivite/taxons_du_phytoplancton-reduit.csv"); + referentielFiles.put("site", "/data/recursivite/sites.csv"); return referentielFiles; } @@ -254,9 +272,35 @@ public class Fixtures { public Map<String, List<String>> getRecursiviteDataErrorsStringReplace() { Map<String, List<String>> DataTypeErrors = new LinkedHashMap<>(); DataTypeErrors.put("duplicatedLineInDatatype", List.of( - "suivi_des_lacs;grand_lac.leman;leman.shl2__station_de_prelevement_lac;17/03/2010;Bouteille Pelletier;microscope inverse zeiss axiovert 135;878170.9", - "suivi_des_lacs;grand_lac.leman;leman.shl2__station_de_prelevement_lac;24/02/2010;Bouteille Pelletier;microscope inverse zeiss axiovert 135;223408.73", - "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"phytoplancton_aggregated\",\"duplicatedRows\":[3,4],\"uniquenessKey\":{\"outils_prélèvement\":\"Bouteille Pelletier\",\"outils_mesure\":\"microscope inverse zeiss axiovert 135\",\"dates_day\":\"24/02/2010\",\"projets_nom du projet\":\"suivi_des_lacs\",\"plateformes_nom de la plateforme\":\"leman.shl2__station_de_prelevement_lac\",\"site_nom du site\":\"grand_lac.leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]" + "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]" + )); + // problème liste de site non fixe donc le test ne passe pas mais le message d'erreur est bon + /*DataTypeErrors.put("invalidReference", List.of( + "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "suivi des lacs;Lemann;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "[{\"validationCheckResult\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"level\":\"ERROR\",\"rawValue\":\"lemann\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReference\",\"messageParams\":{\"target\":\"site/nom du site\",\"referenceValues\":[\"izourt\",\"cos\",\"anterne\",\"bresses_superieur\",\"jovet\",\"lauzanier\",\"blanc_du_carro\",\"pormenaz\",\"barroude\",\"pave\",\"petarel\",\"dranse\",\"port___bielh\",\"bresses_inferieur\",\"estany_gros\",\"merlet_superieur\",\"rabuons\",\"corne\",\"blanc_du_bramant\",\"mercube\",\"pisses\",\"oncet\",\"annecy\",\"bourget\",\"gentau\",\"bramant\",\"aiguebelette\",\"leman\",\"mont_coua\",\"espingo\",\"port_bielh\",\"muzelle\",\"aumar\",\"arbu\",\"cornu\",\"aratilles\",\"gourg_gaudet\",\"isaby\",\"arpont\",\"plan_vianney\",\"brevent\",\"malrif\",\"noir_du_carro\"],\"refType\":\"site\",\"value\":\"lemann\"},\"error\":true,\"success\":false},\"lineNumber\":3}]" + ));*/ + DataTypeErrors.put("invalidDate", List.of( + "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "suivi des lacs;leman;SHL2;20/07/20;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]" + )); + DataTypeErrors.put("invalidInt", List.of( + "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;0.2;973;friselis;amas d'algues;;7.8;vert-gris", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]" + )); + DataTypeErrors.put("invalidFloat", List.of( + "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8x;vert-gris", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]" + )); + DataTypeErrors.put("requiredValue", List.of( + "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", + "suivi des lacs;;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]" )); return DataTypeErrors; } diff --git a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java index 1de60e895..12c0b127c 100644 --- a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java +++ b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java @@ -166,9 +166,23 @@ public class TestReferencesErrors { responses.put(e.getKey(), response); } } + for (Map.Entry<String, String> e : fixtures.getRecursiviteReferentielOrderFiles().entrySet()) { + try (InputStream refStream = getClass().getResourceAsStream(e.getValue())) { + MockMultipartFile refFile = new MockMultipartFile("file", e.getValue(), "text/plain", refStream); + + response = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/recursivite/references/{refType}", e.getKey()) + .file(refFile) + .cookie(authCookie)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", IsNull.notNullValue())) + .andReturn().getResponse().getContentAsString(); + + JsonPath.parse(response).read("$.id"); + } + } // ajout de data - String phytoAggregatedData_path = fixtures.getPhytoAggregatedDataResourceName(); + /*String phytoAggregatedData_path = fixtures.getConditionsPrelevementDataResourceName(); StringBuilder textBuilders = new StringBuilder(); try (InputStream refStream = fixtures.getClass().getResourceAsStream(phytoAggregatedData_path)) { try (Reader reader = new BufferedReader(new InputStreamReader @@ -191,6 +205,35 @@ public class TestReferencesErrors { .andExpect(MockMvcResultMatchers.status().is4xxClientError()) .andReturn().getResponse().getContentAsString(); + Assert.assertEquals(e.getValue().get(2), response); + responses.put(e.getKey(), response); + } + }*/ + // test repository + String site = "leman"; + URL resources = getClass().getResource(fixtures.getConditionsPrelevementRepositoryResourceName(site)); + StringBuilder textBuild = new StringBuilder(); + try (InputStream refStream = Objects.requireNonNull(resources).openStream()) { + try (Reader reader = new BufferedReader(new InputStreamReader + (refStream, Charset.forName(StandardCharsets.UTF_8.name())))) { + int c = 0; + while ((c = reader.read()) != -1) { + textBuild.append((char) c); + } + } + } + String monRepositoryCSV = textBuild.toString(); + for (Map.Entry<String, List<String>> e : fixtures.getRecursiviteDataErrorsStringReplace().entrySet()) { + String textCsvModify = monRepositoryCSV.replace(e.getValue().get(0), e.getValue().get(1)); + try (InputStream refStream = new ByteArrayInputStream(textCsvModify.getBytes(StandardCharsets.UTF_8))) { + MockMultipartFile refFile = new MockMultipartFile("file", "suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv", "text/plain", refStream); + log.info(e.getKey()); + response = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/recursivite/data/condition_prelevements") + .file(refFile) + .cookie(authCookie)) + .andExpect(MockMvcResultMatchers.status().is4xxClientError()) + .andReturn().getResponse().getContentAsString(); + Assert.assertEquals(e.getValue().get(2), response); responses.put(e.getKey(), response); } diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml index d8be72bfe..ee9101cfe 100644 --- a/src/test/resources/data/recursivite/recusivite.yaml +++ b/src/test/resources/data/recursivite/recusivite.yaml @@ -147,45 +147,75 @@ references: reference: proprietes_taxon referenceColumnToLookForHeader: nom de la propriété_key dataTypes: - phytoplancton_aggregated: + # début de la description du fichier des données de condition de prélèvement + condition_prelevements: uniqueness: - variable: dates component: day - - variable: projets - component: nom du projet - - variable: site - component: nom du site - - variable: plateformes - component: nom de la plateforme - - variable: outils - component: prélèvement - - variable: outils - component: mesure + # ajout d'un nom internationnalisé + internationalizationName: + fr: Condition de prélèvement + en: Collection condition + repository: + filePattern: + # mise en place des liens entre les references et les colonnes du fichier data: - dates: + date: components: day: checker: name: Date params: pattern: dd/MM/yyyy - projets: + time: + checker: + name: Date + params: + pattern: HH:mm:ss + projet: components: - nom du projet: + value: site: components: nom du site: - plateformes: - components: + checker: + name: Reference + params: + transformation: + codify: true + required: true + refType: site nom de la plateforme: - outils: + valeurs qualitatives: components: - prélèvement: - mesure: - variables: + couleur de l'eau: + direction du vent: + ensoleillement: + temps: + aspect de l'eau: + etat de surface: + nebulosite: + vitesse du vent: + checker: + name: Integer + valeurs quantitatives: + components: + pression atmospherique: + temperature de l'air: + transparence par disque inra: + transparence par secchi: + checker: + name: Float + params: + required: false + # defaultValue: + # expression : return "cm" + commentaire: components: - biovolume_algal: + value: + # création des authorisations authorization: + # par groupe de données dataGroups: referentiel: internationalizationName: @@ -193,47 +223,112 @@ dataTypes: en: Referential label: "Référentiel" data: - - dates - - projets + - date + - projet - site - - plateformes - condition: + - commentaire + qualitatif: + internationalizationName: + fr: Données qualitatives + en: Qualitative data + label: "Données qualitatives" + data: + - valeurs qualitatives + quantitatif: internationalizationName: - fr: Contexte - en: Context - label: "Contexte" + fr: Données quantitatives + en: Quantitative data + label: "Données quantitatives" data: - - outils - - variables + - valeurs quantitatives + # par types de données (ex: ici on fait par localisation) + authorizationScopes: + localization_site: + variable: site + component: nom du site + # par date + timeScope: + variable: date + component: day + # description de la mise en page du fichier de données colonne par colonne format: + # on localise la ligne où il y a les noms des colonnes (dans ce fichier c'est la ligne 1) headerLine: 1 + # on localise la première ligne avec des données (ici on commence à la ligne 2) firstRowLine: 2 + # puis on liste les colonnes columns: - - header: "nom du projet" + # dans header on met le nom de la colonne (attention il faut que le nom de la colonne soit IDENTIQUE à celui du fichier. /!\ Espace compris) + - header: "Nom du projet" boundTo: - variable: projets - component: nom du projet + variable: projet + component: value - header: "nom du site" boundTo: variable: site component: nom du site - - header: "nom de la plateforme" + - header: "Nom de la plateforme" boundTo: - variable: plateformes + variable: site component: nom de la plateforme - - header: "date de prélèvement" + - header: "date de prelevement" boundTo: - variable: dates + variable: date component: day - - header: "outil de prélèvement" + - header: "heure de prelevement" + boundTo: + variable: date + component: time + - header: "commentaire" + boundTo: + variable: commentaire + component: value + - header: "Température de l'air" + boundTo: + variable: valeurs quantitatives + component: temperature de l'air + - header: "nebulosite" + boundTo: + variable: valeurs qualitatives + component: nebulosite + + - header: "ensoleillement" + boundTo: + variable: valeurs qualitatives + component: ensoleillement + - header: "temps" + boundTo: + variable: valeurs qualitatives + component: temps + - header: "direction du vent" + boundTo: + variable: valeurs qualitatives + component: direction du vent + - header: "vitesse du vent" + boundTo: + variable: valeurs qualitatives + component: vitesse du vent + - header: "pression atmosphérique" + boundTo: + variable: valeurs quantitatives + component: pression atmospherique + - header: "aspect de l'eau" + boundTo: + variable: valeurs qualitatives + component: aspect de l'eau + - header: "etat de surface" + boundTo: + variable: valeurs qualitatives + component: etat de surface + - header: "transparence par disque inra" boundTo: - variable: outils - component: prélèvement - - header: "outil de mesure" + variable: valeurs quantitatives + component: transparence par disque inra + - header: "transparence par secchi 20 cm" boundTo: - variable: outils - component: mesure - - header: "biovolume algal total de l'échantillon" + variable: valeurs quantitatives + component: transparence par secchi + - header: "couleur de l'eau" boundTo: - variable: variables - component: biovolume_algal \ No newline at end of file + variable: valeurs qualitatives + component: couleur de l'eau \ No newline at end of file diff --git a/src/test/resources/data/recursivite/sites.csv b/src/test/resources/data/recursivite/sites.csv new file mode 100644 index 000000000..0cb29aecf --- /dev/null +++ b/src/test/resources/data/recursivite/sites.csv @@ -0,0 +1,44 @@ +nom du type de site;nom du site_key;nom du site_fr;nom du site_en;description du site_fr;description du site_en;code sandre du Plan d'eau;code sandre de la Masse d'eau plan d'eau +grand_lac;aiguebelette;Aiguebelette;Aiguebelette;;;DL61;V1535003 +grand_lac;annecy;Annecy;Annecy;lac d' Annecy;lake of Annecy;DL66;V1235003 +grand_lac;bourget;Bourget;Bourget;lac du Bourget;lake of Bourget;DL60;V1335003 +grand_lac;leman;Léman;Leman(Geneva Lake);lac Léman;Geneva lake (Leman);DL65;V03-4003 +lac_d_altitude;anterne;Anterne;Anterne;Lac d'Anterne;Anterne lake;DL62;V0115023 +lac_d_altitude;aratilles;Aratilles;Aratilles;lac des pyrénées française;french pyrenes lake;; +lac_d_altitude;arbu;Arbu;Arbu;lac des pyrénées française;french pyrenes lake;;O1135003 +lac_d_altitude;arpont;Arpont;Arpont;Lac de l'Arpont;Arpont Lake;;W1015003 +lac_d_altitude;aumar;Aumar;Aumar;Ce lac est situé pyrénées française à une altitude de 2192 m au cœur de la réserve naturelle de Néouvielle. Il fait partie de l'aménagement hydroélectrique de Pragnères (EDF) où ses eaux sont turbinées;This lake is located in the French pyrénées at 2192 m in the Néouvielle Reserve. This lake belongs to the EDF hydropower scheme of Pragnères;;O0115123 +lac_d_altitude;barroude;Barroude;Barroude;lac des pyrénées française;french pyrenes lake;;O0105023 (grand) et O0105013 (petit) +lac_d_altitude;blanc_du_bramant;Blanc du Bramant;Blanc du Bramant;lac Blanc du Bramant;Blanc du Bramant Lake;; +lac_d_altitude;blanc_du_carro;Blanc du Carro;Blanc du Carro;Lac Blanc du Caro;Carro Blanc lake;;W1005043 +lac_d_altitude;bramant;Bramant;Bramant;Lac Bramant;Bramant Lake;; +lac_d_altitude;bresses_inferieur;Bresses inférieur;Bresses inférieur;lac de Bresses inférieur;Lower Bresse lake;;Y6225043 bis +lac_d_altitude;bresses_superieur;Bresses supérieur;Bresses supérieur;lac de Bresses supérieur;Upper Bresse lake;;Y6225043 +lac_d_altitude;brevent;Brévent;Brevent;Lac du Brévent;Brevent lake;;V0015023 +lac_d_altitude;corne;Corne;Corne;Lac de Corne;Corne lake;;W2755063 +lac_d_altitude;cornu;Cornu;Cornu;Lac Cornu;Cornu lake;;V0015043 +lac_d_altitude;cos;Cos;Cos;lac de Cos;Cos lake;;W1205063 +lac_d_altitude;espingo;Espingo;Espingo;lac des pyrénées française;french pyrenes lake;; +lac_d_altitude;estany_gros;Estany Gros;Estany Gros;lac des pyrénées française;french pyrenes lake;; +lac_d_altitude;gentau;Gentau;Gentau;lac des pyrénées française;french pyrenes lake;; +lac_d_altitude;gourg_gaudet;Gourg Gaudet;Gourg Gaudet;lac des pyrénées française;french pyrenes lake;; +lac_d_altitude;isaby;Isaby;Isaby;lac d'Isaby;Isaby lake;;Q4425003 +lac_d_altitude;izourt;Izourt;Izourt;lac d'Izourt;Lake Izourt;;O1125103 +lac_d_altitude;jovet;Jovet;Jovet;Lac Jovet;Jovet lake;;V0025023 et V0025003 (lacs) +lac_d_altitude;lauzanier;Lauzanier;Lauzanier;lac du Lauzanier;Lauzanier lake;;X0415043 +lac_d_altitude;malrif;Malrif;Malrif;lac de Malrif;Malrif lake;;X0215003 (petit laus), X0215023 (grand laus), Mezan ? +lac_d_altitude;merlet_superieur;Merlet supérieur;Merlet supérieur;Lac du Merlet supérieur;Upper Merlet lake;;W0225003 +lac_d_altitude;mont_coua;Mont Coua;Mont Coua;lac du Mont Coua;Coua mont lake;;W0235063 +lac_d_altitude;muzelle;Muzelle;Muzelle;lac de la Muzelle;Muzelle lake;;W2735043 +lac_d_altitude;noir_du_carro;Noir du Carro;Noir du Carro;lac Noir du Caro;Carro Noir lake;;W1005023 +lac_d_altitude;oncet;Oncet;Oncet;lac d'Oncet;Oncet lake;;Q4305003 +lac_d_altitude;pave;Pavé;Pavé;lac du Pavé;Pave lake;;W2705003 +lac_d_altitude;petarel;Pétarel;Pétarel;Lac Pétarel;Petarel lake;;W2115023 +lac_d_altitude;pisses;Pisses;Pisses;Lac des Pisses;Pisses lake;;W2005023 +lac_d_altitude;plan_vianney;Plan Vianney;Plan Vianney;Lac de Plan Vianney;Plan Vianney Lake;;W2735003 +lac_d_altitude;pormenaz;Pormenaz;Pormenaz;Lac de Pormenaz;Pormenaz lake;;V0015003 +lac_d_altitude;port_bielh;Port-Bielh;Port-Bielh;lac des pyrénées française;french pyrenes lake;;O0115003 +lac_d_altitude;rabuons;Rabuons;Rabuons;lac du Rabuons;Rabuons lake;;Y6205283 +riviere;dranse;Dranse;Dranse;rivière Dranse;Dranse river;;V03-0400 ou V0321430 +riviere;mercube;Mercube;Mercube;rivière Mercube;Mercube river;;V0351440 +lac_d_altitude;port___bielh;Port Bielh;Port Bielh;lac des pyrénées française;french pyrenes lake;;O0115002 diff --git a/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv new file mode 100644 index 000000000..a4e917ce4 --- /dev/null +++ b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv @@ -0,0 +1,17 @@ +Nom du projet;nom du site;Nom de la plateforme;date de prelevement;heure de prelevement;commentaire;Température de l'air;nebulosite;ensoleillement; temps ;direction du vent;vitesse du vent;pression atmosphérique;aspect de l'eau;etat de surface;transparence par disque inra;transparence par secchi 20 cm;couleur de l'eau +suivi des lacs;leman;SHL2;22/01/2020;08:45:00;probleme de treuil a 150 m batteries. sans consequences;3;1;ensoleille;clair;;2;978;vaguelettes;propre;;15;vert-vert +suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert +suivi des lacs;leman;SHL2;05/05/2020;10:30:00;pas d�iWS en panne . echantillon moyen avec les 7 surfaces. pas de production prim. commenc� par Multiparametre cause mauvais temps. puis echantillons avec amelioration;12;8;ombre;clair;;3;970;petites vagues;pollen;;6.1;vert-vert +suivi des lacs;leman;SHL2;02/06/2020;08:15:00;test de la 214. utilisation du Daphnie en secours ;24;1;ensoleille;clair;;1;970;plat;propre;;5.9;vert-gris +suivi des lacs;leman;SHL2;15/06/2020;08:30:00;PAM pour Serena. Cyto en panne.Pb treuil sur retour Sonde;18;6;ombre;clair;NW;1;974;plat;propre;;7.5;vert-vert +suivi des lacs;leman;SHL2;30/06/2020;08:45:00;PAM . +Louise;20;1;ensoleille;clair;;2;970;friselis;amas d'algues;;10.7;bleu-gris +suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris +suivi des lacs;leman;SHL2;03/08/2020;08:45:00;orage apres 2 palanquees. attente puis fin prelevements chimie. A/R Evian . impossible l'apres-midi. Pas de ProdPrim;16;10;ombre;clair;;12;969;vagues deferlantes;propre;;; +suivi des lacs;leman;SHL2;04/08/2020;09:00:00;;13;6;ombre;clair;E;3;971;houle longue;propre;;5.2;vert-vert +suivi des lacs;leman;SHL2;20/08/2020;08:30:00;la production a deriv�. retrouv�e en face de Torrent;21;1;ensoleille;clair;W;2;968;friselis;branches;;7.0;vert-gris +suivi des lacs;leman;SHL2;09/09/2020;09:30:00;La prod a d�riv� Pr�sence Yvan Mattadia (2 filets de ZOO);24;1;ensoleille;clair;;1;978;friselis;propre;;6;vert-vert +suivi des lacs;leman;SHL2;23/09/2020;10:30:00;Commencement tardif cause hourle � l'arriv�e;22;4;ensoleille;clair;;3;966;houle courte;propre;;5.8;vert-gris +suivi des lacs;leman;SHL2;13/10/2020;11:45:00;"Commencement tardif cause hourle jusqu'à 11H00, pr�l�vement pour Yvan M Leslie et Alexis. Branche sur parcours";11;5;ensoleille;clair;;3;966;houle courte;propre;;6.4;vert-vert +suivi des lacs;leman;SHL2;03/11/2020;09:20:00;Octeau tract� par Daphnie. Vent temp�tueux l'AM et pluie. Profil sonde jusqu�� 240 m.Profil sonde refait le 6/11;;;ombre;clair;;5;;;branches;;6.5;vert-vert +suivi des lacs;leman;SHL2;18/11/2020;09:15:00;Octeau tract� par Daphnie;12;5;ensoleille;clair;W;2;983;petites vagues;branches;;5.2;vert-jaune +suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;4;974;petites vagues;feuilles;;7.8;vert-vert diff --git a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json index e14bf38da..192d2a1f7 100644 --- a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json +++ b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json @@ -1 +1 @@ -{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"phytoplancton_aggregated\",\"duplicatedRows\":[3,4],\"uniquenessKey\":{\"outils_prélèvement\":\"Bouteille Pelletier\",\"outils_mesure\":\"microscope inverse zeiss axiovert 135\",\"dates_day\":\"24/02/2010\",\"projets_nom du projet\":\"suivi_des_lacs\",\"plateformes_nom de la plateforme\":\"leman.shl2__station_de_prelevement_lac\",\"site_nom du site\":\"grand_lac.leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]"} \ No newline at end of file +{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidDate":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloat":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidInt":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","requiredValue":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"} \ No newline at end of file -- GitLab From 34ad406a6a7ed3a36e2a52219c17f3586c7b7600 Mon Sep 17 00:00:00 2001 From: lucile varloteaux <lucile.varloteaux@inrae.fr> Date: Wed, 22 Jun 2022 15:44:45 +0200 Subject: [PATCH 3/4] =?UTF-8?q?r=C3=A9glage=20affichage=20erreur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/data/recursivite/recusivite.yaml | 2 +- ...s_leman_conditions_prelevements_01-01-2020_31-12-2020.csv | 2 +- ui/src/services/ErrorsService.js | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml index ee9101cfe..ce1cf86d9 100644 --- a/src/test/resources/data/recursivite/recusivite.yaml +++ b/src/test/resources/data/recursivite/recusivite.yaml @@ -150,7 +150,7 @@ dataTypes: # début de la description du fichier des données de condition de prélèvement condition_prelevements: uniqueness: - - variable: dates + - variable: date component: day # ajout d'un nom internationnalisé internationalizationName: diff --git a/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv index a4e917ce4..2b66eb861 100644 --- a/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv +++ b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv @@ -14,4 +14,4 @@ suivi des lacs;leman;SHL2;23/09/2020;10:30:00;Commencement tardif cause hourle suivi des lacs;leman;SHL2;13/10/2020;11:45:00;"Commencement tardif cause hourle jusqu'à 11H00, pr�l�vement pour Yvan M Leslie et Alexis. Branche sur parcours";11;5;ensoleille;clair;;3;966;houle courte;propre;;6.4;vert-vert suivi des lacs;leman;SHL2;03/11/2020;09:20:00;Octeau tract� par Daphnie. Vent temp�tueux l'AM et pluie. Profil sonde jusqu�� 240 m.Profil sonde refait le 6/11;;;ombre;clair;;5;;;branches;;6.5;vert-vert suivi des lacs;leman;SHL2;18/11/2020;09:15:00;Octeau tract� par Daphnie;12;5;ensoleille;clair;W;2;983;petites vagues;branches;;5.2;vert-jaune -suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;4;974;petites vagues;feuilles;;7.8;vert-vert +suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert diff --git a/ui/src/services/ErrorsService.js b/ui/src/services/ErrorsService.js index 16076bdd4..8821e8f60 100644 --- a/ui/src/services/ErrorsService.js +++ b/ui/src/services/ErrorsService.js @@ -143,11 +143,16 @@ export class ErrorsService { getCsvErrorsMessages(csvErrors) { return csvErrors.map((csvError) => { const func = ERRORS[csvError.validationCheckResult.message]; + // console.log(csvError.validationCheckResult.messageParams.target); if (csvError.validationCheckResult.messageParams.target != null) { if (csvError.validationCheckResult.messageParams.target.column != null) { csvError.validationCheckResult.messageParams.target = csvError.validationCheckResult.messageParams.target.column; } + if (csvError.validationCheckResult.messageParams.target.id != null) { + csvError.validationCheckResult.messageParams.target = + csvError.validationCheckResult.messageParams.target.id; + } } if(csvError.validationCheckResult.messageParams.expectedValue != null || csvError.validationCheckResult.messageParams.givenValue != null) { if (csvError.validationCheckResult.messageParams.expectedValue.sql != null) { -- GitLab From 9bda33f4ab7ccc417ab34f0287210568f3baacb4 Mon Sep 17 00:00:00 2001 From: lucile varloteaux <lucile.varloteaux@inrae.fr> Date: Wed, 22 Jun 2022 16:39:26 +0200 Subject: [PATCH 4/4] =?UTF-8?q?passage=20test=20(je=20ne=20sais=20pas=20tr?= =?UTF-8?q?op=20pourquoi=20il=20ne=20pass=C3=A9=20plus)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/inra/oresing/rest/Fixtures.java | 34 +++++++++---------- .../data/recursivite/recusivite.yaml | 10 ++++-- .../applications/errors/ref_ola_errors.json | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java index 6628fe11e..bbd523b05 100644 --- a/src/test/java/fr/inra/oresing/rest/Fixtures.java +++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java @@ -271,11 +271,6 @@ public class Fixtures { public Map<String, List<String>> getRecursiviteDataErrorsStringReplace() { Map<String, List<String>> DataTypeErrors = new LinkedHashMap<>(); - DataTypeErrors.put("duplicatedLineInDatatype", List.of( - "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", - "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris", - "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]" - )); // problème liste de site non fixe donc le test ne passe pas mais le message d'erreur est bon /*DataTypeErrors.put("invalidReference", List.of( "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", @@ -283,24 +278,29 @@ public class Fixtures { "[{\"validationCheckResult\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"level\":\"ERROR\",\"rawValue\":\"lemann\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReference\",\"messageParams\":{\"target\":\"site/nom du site\",\"referenceValues\":[\"izourt\",\"cos\",\"anterne\",\"bresses_superieur\",\"jovet\",\"lauzanier\",\"blanc_du_carro\",\"pormenaz\",\"barroude\",\"pave\",\"petarel\",\"dranse\",\"port___bielh\",\"bresses_inferieur\",\"estany_gros\",\"merlet_superieur\",\"rabuons\",\"corne\",\"blanc_du_bramant\",\"mercube\",\"pisses\",\"oncet\",\"annecy\",\"bourget\",\"gentau\",\"bramant\",\"aiguebelette\",\"leman\",\"mont_coua\",\"espingo\",\"port_bielh\",\"muzelle\",\"aumar\",\"arbu\",\"cornu\",\"aratilles\",\"gourg_gaudet\",\"isaby\",\"arpont\",\"plan_vianney\",\"brevent\",\"malrif\",\"noir_du_carro\"],\"refType\":\"site\",\"value\":\"lemann\"},\"error\":true,\"success\":false},\"lineNumber\":3}]" ));*/ DataTypeErrors.put("invalidDate", List.of( - "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", - "suivi des lacs;leman;SHL2;20/07/20;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris", - "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]" + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "suivi des lacs;leman;SHL2;x16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"x16/12/2020\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":17}]" )); DataTypeErrors.put("invalidInt", List.of( - "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", - "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;0.2;973;friselis;amas d'algues;;7.8;vert-gris", - "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]" + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6.0;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"temperature de l'air\",\"id\":\"valeurs quantitatives_temperature de l'air\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"6.0\"},\"error\":true,\"success\":false},\"lineNumber\":17}]" )); DataTypeErrors.put("invalidFloat", List.of( - "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", - "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8x;vert-gris", - "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]" + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8x;vert-vert", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":17}]" )); DataTypeErrors.put("requiredValue", List.of( - "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert", - "suivi des lacs;;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris", - "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]" + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "suivi des lacs;;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":17}]" + )); + DataTypeErrors.put("duplicatedLineInDatatype", List.of( + "suivi des lacs;leman;SHL2;18/11/2020;09:15:00;Octeau tract� par Daphnie;12;5;ensoleille;clair;W;2;983;petites vagues;branches;;5.2;vert-jaune", + "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert", + "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[16,17],\"uniquenessKey\":{\"date_time\":\"09:15:00\",\"date_day\":\"16/12/2020\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":16}]" )); return DataTypeErrors; } diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml index ce1cf86d9..9b3fb3ee6 100644 --- a/src/test/resources/data/recursivite/recusivite.yaml +++ b/src/test/resources/data/recursivite/recusivite.yaml @@ -152,6 +152,10 @@ dataTypes: uniqueness: - variable: date component: day + - variable: date + component: time + - variable: site + component: nom du site # ajout d'un nom internationnalisé internationalizationName: fr: Condition de prélèvement @@ -196,12 +200,14 @@ dataTypes: etat de surface: nebulosite: vitesse du vent: - checker: - name: Integer valeurs quantitatives: components: pression atmospherique: temperature de l'air: + checker: + name: Integer + params: + required: false transparence par disque inra: transparence par secchi: checker: diff --git a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json index 192d2a1f7..d2ad8a7fd 100644 --- a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json +++ b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json @@ -1 +1 @@ -{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidDate":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloat":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidInt":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","requiredValue":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"} \ No newline at end of file +{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidDate":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"x16/12/2020\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":17}]","invalidFloat":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":17}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[16,17],\"uniquenessKey\":{\"date_time\":\"09:15:00\",\"date_day\":\"16/12/2020\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":16}]","invalidInt":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"temperature de l'air\",\"id\":\"valeurs quantitatives_temperature de l'air\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"6.0\"},\"error\":true,\"success\":false},\"lineNumber\":17}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","requiredValue":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":17}]"} \ No newline at end of file -- GitLab