From 3ec30a48435dca500266c34f8eee98a5df2ef387 Mon Sep 17 00:00:00 2001 From: Fufeck Date: Wed, 10 Apr 2024 10:36:38 +0200 Subject: [PATCH] feat: add additionalValues from uid_adresse --- lib/schema/error-labels.js | 5 + lib/schema/index.js | 53 ++++++- lib/schema/profiles/1.3-relax.js | 3 + lib/schema/profiles/1.3-strict.js | 2 +- lib/schema/profiles/1.3.js | 3 + .../profiles/{1.4-strict.js => 1.4-relax.js} | 53 ++++--- lib/schema/profiles/1.4.js | 47 ++++--- lib/schema/profiles/index.js | 2 +- .../1.4/data/1.3-valid-uid_adresse.csv | 2 + lib/validate/__tests__/1.4/index.js | 132 ++++++++++-------- lib/validate/__tests__/index.js | 8 +- lib/validate/row.js | 4 +- 12 files changed, 199 insertions(+), 115 deletions(-) rename lib/schema/profiles/{1.4-strict.js => 1.4-relax.js} (92%) create mode 100644 lib/validate/__tests__/1.4/data/1.3-valid-uid_adresse.csv diff --git a/lib/schema/error-labels.js b/lib/schema/error-labels.js index a14c23c..fbdbdc3 100644 --- a/lib/schema/error-labels.js +++ b/lib/schema/error-labels.js @@ -25,6 +25,11 @@ module.exports = { "cle_interop.voie_non_renseignee": "La partie voie de la clé d’interopératibilité a été laissée à nul (0000 ou xxxx)", + // uid_adresse + "uid_adresse.type_invalide": "La valeur de uid_adresse n’est pas valide", + "uid_adresse.incoherence_ids_ban": + "Les ids ban renseignés ne sont pas cohérents", + // id_ban_commune "id_ban_commune.type_invalide": "La valeur de id_ban_commune n’est pas un uuidv4 valide", diff --git a/lib/schema/index.js b/lib/schema/index.js index 06c3190..116d5f9 100644 --- a/lib/schema/index.js +++ b/lib/schema/index.js @@ -92,6 +92,55 @@ exports.fields = { trim: true, formats: ["1.1", "1.2", "1.3"], aliases: ["uid_adress"], + parse(v, { addError, setAdditionnalValues }) { + const regUuidCommune = + /@c([A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12})/gi; + const regUuidToponyme = + /@v[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}/gi; + const regUuidAdresse = + /@a[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}/gi; + + const [uuidCommune] = v.match(regUuidCommune) || []; + const [uuidToponyme] = v.match(regUuidToponyme) || []; + const [uuidAdresse] = v.match(regUuidAdresse) || []; + + const idBanCommune = uuidCommune?.substr(2) || null; + const idBanToponyme = uuidToponyme?.substr(2) || null; + const idBanAdresse = uuidAdresse?.substr(2) || null; + + if ( + !isUuid(idBanCommune) || + !isUuid(idBanToponyme) || + idBanAdresse === null || + !isUuid(idBanAdresse) + ) { + return addError("type_invalide"); + } + + if (!idBanCommune || !idBanToponyme) { + addError("incoherence_ids_ban"); + } + + // LES IDS id_ban_commune / id_ban_toponyme / id_ban_adresse NE PEUVENT PAS ËTRE IDENTIQUES + if ( + (idBanCommune && idBanToponyme && idBanCommune === idBanToponyme) || + (idBanCommune && idBanAdresse && idBanCommune === idBanAdresse) || + (idBanAdresse && idBanToponyme && idBanToponyme === idBanAdresse) + ) { + addError("incoherence_ids_ban"); + } + + // SI IL Y A UN id_ban_toponyme, IL Y A UN id_ban_commune + // SI IL Y A UN id_ban_adresse, IL Y A UN id_ban_toponyme ET DONC IL Y A IL Y A UN id_ban_commune + + setAdditionnalValues({ + idBanCommune, + idBanToponyme, + idBanAdresse, + }); + + return v; + }, }, id_ban_commune: { @@ -380,7 +429,7 @@ exports.fields = { } return parcelles.map((p) => - p.length === 14 ? p : p.slice(0, 2) + p.slice(3), + p.length === 14 ? p : p.slice(0, 2) + p.slice(3) ); }, }, @@ -481,7 +530,7 @@ function validateCoords(row, { addError }) { if (x !== undefined && y !== undefined) { const distance = Math.sqrt( (x - projectedCoordInMeters[0]) ** 2 + - (y - projectedCoordInMeters[1]) ** 2, + (y - projectedCoordInMeters[1]) ** 2 ); const tolerance = 10; diff --git a/lib/schema/profiles/1.3-relax.js b/lib/schema/profiles/1.3-relax.js index 2419b8f..35466f5 100644 --- a/lib/schema/profiles/1.3-relax.js +++ b/lib/schema/profiles/1.3-relax.js @@ -93,6 +93,9 @@ const warnings = [ "cad_parcelles.espaces_debut_fin", "source.espaces_debut_fin", "date_der_maj.espaces_debut_fin", + // ID BAN + "uid_adresse.type_invalide", + "uid_adresse.incoherence_ids_ban", ]; const infos = ["cle_interop.voie_non_renseignee"]; diff --git a/lib/schema/profiles/1.3-strict.js b/lib/schema/profiles/1.3-strict.js index 9445eaf..aeb26f2 100644 --- a/lib/schema/profiles/1.3-strict.js +++ b/lib/schema/profiles/1.3-strict.js @@ -85,7 +85,7 @@ const warnings = ["position.enum_fuzzy"]; module.exports = { code: "1.3-strict", name: "BAL 1.3 Strict", - isUsed: true, + isUsed: false, relax: false, errors, warnings, diff --git a/lib/schema/profiles/1.3.js b/lib/schema/profiles/1.3.js index e43868f..fd12307 100644 --- a/lib/schema/profiles/1.3.js +++ b/lib/schema/profiles/1.3.js @@ -99,6 +99,9 @@ const warnings = [ "cad_parcelles.espaces_debut_fin", "source.espaces_debut_fin", "date_der_maj.espaces_debut_fin", + // ID BAN + "uid_adresse.type_invalide", + "uid_adresse.incoherence_ids_ban", ]; const infos = ["cle_interop.voie_non_renseignee"]; diff --git a/lib/schema/profiles/1.4-strict.js b/lib/schema/profiles/1.4-relax.js similarity index 92% rename from lib/schema/profiles/1.4-strict.js rename to lib/schema/profiles/1.4-relax.js index 7c8e26e..1ba1ea1 100644 --- a/lib/schema/profiles/1.4-strict.js +++ b/lib/schema/profiles/1.4-relax.js @@ -2,9 +2,6 @@ const errors = [ "cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.numero_invalide", - "cle_interop.valeur_manquante", - "cle_interop.numero_prefixe_manquant", - "cle_interop.casse_invalide", "voie_nom.valeur_manquante", "voie_nom.trop_court", "voie_nom.trop_long", @@ -12,48 +9,30 @@ const errors = [ "numero.valeur_manquante", "numero.type_invalide", "numero.trop_grand", - "numero.contient_prefixe", "suffixe.debut_invalide", "suffixe.trop_long", - "date_der_maj.date_invalide", "commune_insee.commune_invalide", - "commune_insee.valeur_manquante", - "commune_insee.espaces_debut_fin", "x.valeur_invalide", "y.valeur_invalide", - "x.separateur_decimal_invalide", - "y.separateur_decimal_invalide", "long.valeur_invalide", "lat.valeur_invalide", - "long.separateur_decimal_invalide", - "lat.separateur_decimal_invalide", "row.incoherence_numero", "row.commune_manquante", "row.longlat_vides", "row.longlat_invalides", "row.adresse_incomplete", - "field.commune_insee.missing", "field.voie_nom.missing", "field.numero.missing", - "field.commune_nom.long", - "field.commune_nom.lat", - "suffixe.espaces_debut_fin", - "file.encoding.non_standard", - "file.delimiter.non_standard", - "file.linebreak.non_standard", "rows.empty", - - "id_ban_commune.type_invalide", - "id_ban_toponyme.type_invalide", - "id_ban_adresse.type_invalide", - "row.incoherence_ids_ban", - "row.id_ban_adresses_required", - "rows.ids_required_every", ]; const warnings = [ + "cle_interop.valeur_manquante", + "cle_interop.casse_invalide", "cle_interop.voie_invalide", + "cle_interop.numero_prefixe_manquant", "cle_interop.commune_ancienne", + "numero.contient_prefixe", "voie_nom.casse_incorrecte", "voie_nom.contient_tiret_bas", "voie_nom_@@.casse_incorrecte", @@ -67,10 +46,15 @@ const warnings = [ "commune_deleguee_insee.commune_ancienne_non_deleguee", "position.enum_fuzzy", "position.valeur_invalide", + "x.separateur_decimal_invalide", + "y.separateur_decimal_invalide", + "long.separateur_decimal_invalide", + "lat.separateur_decimal_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", + "date_der_maj.date_invalide", "date_der_maj.date_ancienne", "date_der_maj.date_future", "certification_commune.valeur_invalide", @@ -79,6 +63,7 @@ const warnings = [ "row.longlat_xy_incoherents", "field.suffixe.missing", "field.cle_interop.missing", + "field.commune_insee.missing", "field.position.missing", "field.long.missing", "field.lat.missing", @@ -89,6 +74,7 @@ const warnings = [ "field.certification_commune.missing", "cle_interop.espaces_debut_fin", + "commune_insee.espaces_debut_fin", "commune_nom.espaces_debut_fin", "commune_deleguee_insee.espaces_debut_fin", "commune_deleguee_nom.espaces_debut_fin", @@ -98,6 +84,7 @@ const warnings = [ "lieudit_complement_nom.espaces_debut_fin", "lieudit_complement_nom_@@.espaces_debut_fin", "numero.espaces_debut_fin", + "suffixe.espaces_debut_fin", "position.espaces_debut_fin", "long.espaces_debut_fin", "lat.espaces_debut_fin", @@ -110,15 +97,23 @@ const warnings = [ "field.id_ban_commune.missing", "field.id_ban_toponyme.missing", "field.id_ban_adresse.missing", + "id_ban_commune.type_invalide", + "id_ban_toponyme.type_invalide", + "id_ban_adresse.type_invalide", + "row.incoherence_ids_ban", + "row.id_ban_adresses_required", + "rows.ids_required_every", + "uid_adresse.type_invalide", + "uid_adresse.incoherence_ids_ban", ]; const infos = ["cle_interop.voie_non_renseignee"]; module.exports = { - code: "1.4-strict", - name: "BAL 1.4 Strict (beta)", - isUsed: true, - relax: false, + code: "1.4-relax", + name: "BAL 1.4 Relax (beta)", + isUsed: false, + relax: true, errors, warnings, infos, diff --git a/lib/schema/profiles/1.4.js b/lib/schema/profiles/1.4.js index b5969a9..f670cf5 100644 --- a/lib/schema/profiles/1.4.js +++ b/lib/schema/profiles/1.4.js @@ -2,6 +2,9 @@ const errors = [ "cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.numero_invalide", + "cle_interop.valeur_manquante", + "cle_interop.numero_prefixe_manquant", + "cle_interop.casse_invalide", "voie_nom.valeur_manquante", "voie_nom.trop_court", "voie_nom.trop_long", @@ -9,30 +12,48 @@ const errors = [ "numero.valeur_manquante", "numero.type_invalide", "numero.trop_grand", + "numero.contient_prefixe", "suffixe.debut_invalide", "suffixe.trop_long", + "date_der_maj.date_invalide", "commune_insee.commune_invalide", + "commune_insee.valeur_manquante", + "commune_insee.espaces_debut_fin", "x.valeur_invalide", "y.valeur_invalide", + "x.separateur_decimal_invalide", + "y.separateur_decimal_invalide", "long.valeur_invalide", "lat.valeur_invalide", + "long.separateur_decimal_invalide", + "lat.separateur_decimal_invalide", "row.incoherence_numero", "row.commune_manquante", "row.longlat_vides", "row.longlat_invalides", "row.adresse_incomplete", + "field.commune_insee.missing", "field.voie_nom.missing", "field.numero.missing", + "field.commune_nom.long", + "field.commune_nom.lat", + "suffixe.espaces_debut_fin", + "file.encoding.non_standard", + "file.delimiter.non_standard", + "file.linebreak.non_standard", "rows.empty", + + "id_ban_commune.type_invalide", + "id_ban_toponyme.type_invalide", + "id_ban_adresse.type_invalide", + "row.incoherence_ids_ban", + "row.id_ban_adresses_required", + "rows.ids_required_every", ]; const warnings = [ - "cle_interop.valeur_manquante", - "cle_interop.casse_invalide", "cle_interop.voie_invalide", - "cle_interop.numero_prefixe_manquant", "cle_interop.commune_ancienne", - "numero.contient_prefixe", "voie_nom.casse_incorrecte", "voie_nom.contient_tiret_bas", "voie_nom_@@.casse_incorrecte", @@ -46,15 +67,10 @@ const warnings = [ "commune_deleguee_insee.commune_ancienne_non_deleguee", "position.enum_fuzzy", "position.valeur_invalide", - "x.separateur_decimal_invalide", - "y.separateur_decimal_invalide", - "long.separateur_decimal_invalide", - "lat.separateur_decimal_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", - "date_der_maj.date_invalide", "date_der_maj.date_ancienne", "date_der_maj.date_future", "certification_commune.valeur_invalide", @@ -63,7 +79,6 @@ const warnings = [ "row.longlat_xy_incoherents", "field.suffixe.missing", "field.cle_interop.missing", - "field.commune_insee.missing", "field.position.missing", "field.long.missing", "field.lat.missing", @@ -74,7 +89,6 @@ const warnings = [ "field.certification_commune.missing", "cle_interop.espaces_debut_fin", - "commune_insee.espaces_debut_fin", "commune_nom.espaces_debut_fin", "commune_deleguee_insee.espaces_debut_fin", "commune_deleguee_nom.espaces_debut_fin", @@ -84,7 +98,6 @@ const warnings = [ "lieudit_complement_nom.espaces_debut_fin", "lieudit_complement_nom_@@.espaces_debut_fin", "numero.espaces_debut_fin", - "suffixe.espaces_debut_fin", "position.espaces_debut_fin", "long.espaces_debut_fin", "lat.espaces_debut_fin", @@ -97,12 +110,8 @@ const warnings = [ "field.id_ban_commune.missing", "field.id_ban_toponyme.missing", "field.id_ban_adresse.missing", - "id_ban_commune.type_invalide", - "id_ban_toponyme.type_invalide", - "id_ban_adresse.type_invalide", - "row.incoherence_ids_ban", - "row.id_ban_adresses_required", - "rows.ids_required_every", + "uid_adresse.type_invalide", + "uid_adresse.incoherence_ids_ban", ]; const infos = ["cle_interop.voie_non_renseignee"]; @@ -110,7 +119,7 @@ const infos = ["cle_interop.voie_non_renseignee"]; module.exports = { code: "1.4", name: "BAL 1.4 (beta)", - isUsed: false, + isUsed: true, relax: false, errors, warnings, diff --git a/lib/schema/profiles/index.js b/lib/schema/profiles/index.js index 15c68f8..b6641d2 100644 --- a/lib/schema/profiles/index.js +++ b/lib/schema/profiles/index.js @@ -1,6 +1,6 @@ const profiles = { 1.4: require("./1.4"), - "1.4-strict": require("./1.4-strict"), + "1.4-relax": require("./1.4-relax"), 1.3: require("./1.3"), "1.3-relax": require("./1.3-relax"), "1.3-strict": require("./1.3-strict"), diff --git a/lib/validate/__tests__/1.4/data/1.3-valid-uid_adresse.csv b/lib/validate/__tests__/1.4/data/1.3-valid-uid_adresse.csv new file mode 100644 index 0000000..0ac5214 --- /dev/null +++ b/lib/validate/__tests__/1.4/data/1.3-valid-uid_adresse.csv @@ -0,0 +1,2 @@ +cle_interop;uid_adresse;commune_insee;voie_nom;numero;suffixe;commune_nom;position;long;lat;x;y;source;date_der_maj +31591_xxxx_00009;@c0246e48c-f33d-433a-8984-034219be842e @v8a3bab10-f329-4ce3-9c7d-280d91a8053a @a3c87abe4-887b-46ee-9192-5c1b35a06625;31591;Rue des 3 Places;9;;Escoulis;entrée;1.028392;43.111637;539416.13;6225601.11;;2020-11-09 diff --git a/lib/validate/__tests__/1.4/index.js b/lib/validate/__tests__/1.4/index.js index 4dd30ab..9a9b1df 100644 --- a/lib/validate/__tests__/1.4/index.js +++ b/lib/validate/__tests__/1.4/index.js @@ -17,17 +17,17 @@ test("Valid file 1.3", async (t) => { const report = await validate(buffer, { profile: "1.3" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, true); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, true); + t.is(report.profilesValidation["1.4-relax"].isValid, true); }); test("Valid file 1.4", async (t) => { const buffer = await readAsBuffer("1.4-valid.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, true); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, true); + t.is(report.profilesValidation["1.4-relax"].isValid, true); }); test("Valid file 1.4 with relaxFieldsDetection", async (t) => { @@ -35,57 +35,57 @@ test("Valid file 1.4 with relaxFieldsDetection", async (t) => { const report = await validate(buffer, { relaxFieldsDetection: true }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, true); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, true); + t.is(report.profilesValidation["1.4-relax"].isValid, true); }); test("Valid file 1.4 with profile relax", async (t) => { const buffer = await readAsBuffer("1.4-valid-relax.csv"); const report = await validate(buffer, { - profile: "1.4", + profile: "1.4-relax", relaxFieldsDetection: true, }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, true); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, true); + t.is(report.profilesValidation["1.4-relax"].isValid, true); }); test("Error file 1.4 without relaxFieldsDetection", async (t) => { const buffer = await readAsBuffer("1.4-valid-relax.csv"); const report = await validate(buffer, { - profile: "1.4", + profile: "1.4-relax", relaxFieldsDetection: false, }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, false); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, false); }); test("Error file 1.4 with profile 1.4", async (t) => { const buffer = await readAsBuffer("1.4-valid-relax.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, false); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, false); }); test("Error bad id ban adresses (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-bad-id-ban-adresse.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "id_ban_adresse.type_invalide", + (e) => e.code === "id_ban_adresse.type_invalide" ); t.is(error.length, 1); t.is(error[0].level, "E"); @@ -93,15 +93,15 @@ test("Error bad id ban adresses (file 1.4)", async (t) => { test("Error bad id ban commune (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-bad-id-ban-commune.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "id_ban_commune.type_invalide", + (e) => e.code === "id_ban_commune.type_invalide" ); t.is(error.length, 1); t.is(error[0].level, "E"); @@ -109,15 +109,15 @@ test("Error bad id ban commune (file 1.4)", async (t) => { test("Error bad id ban toponyme a (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-bad-id-ban-toponyme.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "id_ban_toponyme.type_invalide", + (e) => e.code === "id_ban_toponyme.type_invalide" ); t.is(error.length, 1); t.is(error[0].level, "E"); @@ -125,15 +125,15 @@ test("Error bad id ban toponyme a (file 1.4)", async (t) => { test("Error incoherent ban id (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-incoherent-id-ban.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "row.incoherence_ids_ban", + (e) => e.code === "row.incoherence_ids_ban" ); t.is(error.length, 1); t.is(error[0].level, "E"); @@ -141,25 +141,25 @@ test("Error incoherent ban id (file 1.4)", async (t) => { test("Good incoherent dependance ban id (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-good-dependance-id-ban.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, true); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, true); + t.is(report.profilesValidation["1.4-relax"].isValid, true); }); test("Error incoherent dependance ban id (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-bad-dependance-id-ban.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "row.incoherence_ids_ban", + (e) => e.code === "row.incoherence_ids_ban" ); t.is(error.length, 1); t.is(error[0].level, "E"); @@ -167,15 +167,15 @@ test("Error incoherent dependance ban id (file 1.4)", async (t) => { test("Warning id_ban_adresses_required (file 1.4) with profile relax", async (t) => { const buffer = await readAsBuffer("1.4-without-ban-adresse.csv"); - const report = await validate(buffer, { profile: "1.4" }); + const report = await validate(buffer, { profile: "1.4-relax" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "row.id_ban_adresses_required", + (e) => e.code === "row.id_ban_adresses_required" ); t.is(error.length, 1); t.is(error[0].level, "W"); @@ -183,15 +183,15 @@ test("Warning id_ban_adresses_required (file 1.4) with profile relax", async (t) test("ERROR id_ban_adresses_required (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-without-ban-adresse.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "row.id_ban_adresses_required", + (e) => e.code === "row.id_ban_adresses_required" ); t.is(error.length, 1); t.is(error[0].level, "E"); @@ -199,15 +199,15 @@ test("ERROR id_ban_adresses_required (file 1.4)", async (t) => { test("Warning rows.ids_required_every (file 1.4) with profile relax", async (t) => { const buffer = await readAsBuffer("1.4-no-ids-ban-every.csv"); - const report = await validate(buffer, { profile: "1.4" }); + const report = await validate(buffer, { profile: "1.4-relax" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "rows.ids_required_every", + (e) => e.code === "rows.ids_required_every" ); t.is(error.length, 1); t.is(error[0].level, "W"); @@ -215,16 +215,38 @@ test("Warning rows.ids_required_every (file 1.4) with profile relax", async (t) test("Warning rows.ids_required_every (file 1.4)", async (t) => { const buffer = await readAsBuffer("1.4-no-ids-ban-every.csv"); - const report = await validate(buffer, { profile: "1.4-strict" }); + const report = await validate(buffer, { profile: "1.4" }); t.is(report.encoding, "utf-8"); t.is(report.parseOk, true); - t.is(report.profilesValidation["1.4-strict"].isValid, false); - t.is(report.profilesValidation[1.4].isValid, true); + t.is(report.profilesValidation["1.4"].isValid, false); + t.is(report.profilesValidation["1.4-relax"].isValid, true); const error = report.profilErrors.filter( - (e) => e.code === "rows.ids_required_every", + (e) => e.code === "rows.ids_required_every" ); t.is(error.length, 1); t.is(error[0].level, "E"); }); + +test("Read uid_adresse", async (t) => { + const buffer = await readAsBuffer("1.3-valid-uid_adresse.csv"); + const report = await validate(buffer, { profile: "1.4" }); + console.log(); + t.is(report.encoding, "utf-8"); + t.is(report.parseOk, true); + t.is(report.profilesValidation["1.4"].isValid, true); + t.is(report.profilesValidation["1.4-relax"].isValid, true); + t.is( + report.rows[0].additionalValues.uid_adresse.idBanCommune, + "0246e48c-f33d-433a-8984-034219be842e" + ); + t.is( + report.rows[0].additionalValues.uid_adresse.idBanToponyme, + "8a3bab10-f329-4ce3-9c7d-280d91a8053a" + ); + t.is( + report.rows[0].additionalValues.uid_adresse.idBanAdresse, + "3c87abe4-887b-46ee-9192-5c1b35a06625" + ); +}); diff --git a/lib/validate/__tests__/index.js b/lib/validate/__tests__/index.js index cfe3b64..96d51a8 100644 --- a/lib/validate/__tests__/index.js +++ b/lib/validate/__tests__/index.js @@ -41,9 +41,7 @@ test("validate a file with aliases / relaxFieldsDetection true", async (t) => { for (const schemaName of Object.keys(aliasedFields)) { const originalName = aliasedFields[schemaName]; t.truthy( - fields.find( - (f) => f.name === originalName && f.schemaName === schemaName, - ), + fields.find((f) => f.name === originalName && f.schemaName === schemaName) ); } @@ -101,9 +99,7 @@ test("validate a file with aliases with 1.3-relax", async (t) => { for (const schemaName of Object.keys(aliasedFields)) { const originalName = aliasedFields[schemaName]; t.truthy( - fields.find( - (f) => f.name === originalName && f.schemaName === schemaName, - ), + fields.find((f) => f.name === originalName && f.schemaName === schemaName) ); } diff --git a/lib/validate/row.js b/lib/validate/row.js index afc3a1a..8e63ba0 100644 --- a/lib/validate/row.js +++ b/lib/validate/row.js @@ -97,7 +97,7 @@ async function validateRow(row, { line, indexedFields }) { localizedValues[field.schemaName][field.locale] = result.parsedValue; } } - }), + }) ); schema.row( @@ -106,7 +106,7 @@ async function validateRow(row, { line, indexedFields }) { addError(code) { errors.push({ code: `row.${code}` }); }, - }, + } ); return {