diff --git a/package.json b/package.json index 0ab8b81..dcdb1ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "freedatas2html", - "version": "0.4.2", + "version": "0.4.3", "description": "Visualization of data from various sources (CSV, API, HTML...) with filters, classification, pagination, etc.", "main": "index.js", "scripts": { diff --git a/src/errors.js b/src/errors.js index f861b4c..d4265b2 100644 --- a/src/errors.js +++ b/src/errors.js @@ -1,6 +1,7 @@ module.exports = { converterElementNotFound : "Aucun élément HTML n'a été trouvé ayant comme \"id\" : ", + converterFieldNotFound : "Le champ n'existe pas dans les données ou les données n'ont pas encore été chargées.", converterNeedDatasElt: "Merci de fournir un id valide pour l'élément où afficher les données.", converterRefreshFail: "Le nom des champs et l'élement du DOM receveur sont nécessaires à l'affichage des données.", pagination2HTMLFail : "Toutes les donnée nécessaires à la création des sélecteurs de pagination n'ont pas été fournies.", @@ -13,11 +14,12 @@ module.exports = parserNeedUrl: "Merci de fournir une url valide pour le fichier à parser.", selector2HTMLFail: "Le création d'un filtre dans le DOM nécessite l'initialisation de l'élément HTML et du numéro du champs à filter.", selectorCheckIsOkFail: "Le test est lancé sur un filtre incorrectement initialisé ou sur un attribut absent de la donnée à tester.", - selectorFieldNotFound: "Au moins une des colonnes devant servir à filtrer les données n'existe pas dans le fichier.", + selectorFieldNotFound: "Au moins un des champs devant servir à filtrer les données n'existe pas dans le fichier.", selectorNeedDatas: "Le création d'un filtre nécessite la transmission des données à filtrer.", selectorSelectedIndexNotFound: "La valeur sélectionnée n'a pas été trouvée dans la liste des champs.", sortingField2HTMLFail: "Toutes les donnée nécessaires à la création du lien de classement n'ont pas été fournies.", sortingFieldNeedDatas: "Le création d'un champ de classement nécessite la transmission de la liste des champs.", + sortingFieldFieldNotFound: "Au moins un des champs devant permettre de classer les données n'existe pas dans le fichier.", sortingFieldsNbFail: "Le nombre de champs trouvés dans le DOM ne correspond pas à celui des données à classer.", sortingFieldsNotInHTML: "Les champs pouvant servir à classer les données n'ont pas été trouvés dans le DOM.", }; \ No newline at end of file diff --git a/src/freeDatas2HTML.ts b/src/freeDatas2HTML.ts index bc32f71..a5827aa 100644 --- a/src/freeDatas2HTML.ts +++ b/src/freeDatas2HTML.ts @@ -51,6 +51,15 @@ export class FreeDatas2HTML } } + // Vérifie qu'un champ existe bien dans les données + public checkFieldExist(nb: number) : boolean + { + if(this.parseMetas === undefined || this.parseMetas.fields === undefined || this.parseMetas.fields[nb] === undefined) + return false; + else + return true; + } + // Vérifie que l'élément devant afficher les données existe dans le DOM : set datasViewElt(elt: DOMElement) { @@ -67,14 +76,15 @@ export class FreeDatas2HTML } // Vérifie que les numéros de champs pour lesquels il y a des fonctions de classement spécifiques sont cohérents + // ! Ne peut être testé qu'après avoir reçu les données set datasSortingFunctions(SortingFunctions: SortingFunctions[]) { this._datasSortingFunctions=[]; for(let i = 0; i < SortingFunctions.length; i++) { - //if(FreeDatas2HTML.isNaturalNumber(SortingFunctions[i].datasFieldNb) === false) // revoir pour tester l'existence du champ - // console.error(errors.needNaturalNumber); // -> à remplacer par un test d'existence de colonne ! - //else + if(! this.checkFieldExist(SortingFunctions[i].datasFieldNb)) + throw new Error(errors.converterFieldNotFound); + else this._datasSortingFunctions.push(SortingFunctions[i]); } } diff --git a/src/freeDatas2HTMLSelector.ts b/src/freeDatas2HTMLSelector.ts index 7e550f3..634eeab 100644 --- a/src/freeDatas2HTMLSelector.ts +++ b/src/freeDatas2HTMLSelector.ts @@ -35,7 +35,7 @@ export class Selector implements Selectors // Vérifie que le numéro de champ existe dans les données reçues set datasFieldNb(datasFieldNb: number|undefined) { - if(datasFieldNb !== undefined && this._converter.parseMetas!.fields![datasFieldNb] === undefined) + if(datasFieldNb === undefined || ! this._converter.checkFieldExist(Number(datasFieldNb))) throw new Error(errors.selectorFieldNotFound); else this._datasFieldNb=datasFieldNb; diff --git a/src/freeDatas2HTMLSortingField.ts b/src/freeDatas2HTMLSortingField.ts index 45f03a3..a3d20aa 100644 --- a/src/freeDatas2HTMLSortingField.ts +++ b/src/freeDatas2HTMLSortingField.ts @@ -35,7 +35,7 @@ export class SortingField implements SortingFields // Mais on peut créer un lien sur une image, un span, etc. set datasFieldNb(datasFieldNb: number|undefined) { - if(datasFieldNb !== undefined && this._converter.parseMetas!.fields![datasFieldNb] === undefined) + if(datasFieldNb === undefined || ! this._converter.checkFieldExist(Number(datasFieldNb))) throw new Error(errors.sortingFieldFieldNotFound); else this._datasFieldNb=datasFieldNb; diff --git a/tests/freeDatas2HTMLSpec.ts b/tests/freeDatas2HTMLSpec.ts index c5b483f..cbc3c37 100644 --- a/tests/freeDatas2HTMLSpec.ts +++ b/tests/freeDatas2HTMLSpec.ts @@ -40,11 +40,33 @@ describe("Test du script central de FreeDatas2HTML", () => { expect(() => { return converter.datasSourceUrl=" "; }).toThrowError(errors.parserNeedUrl); }); - - // Fonction spécfique de classement des données : - it("Doit me retourner la fonction associée à une colonne, de manière à ce qu'elle soit utilisable pour comparer deux valeurs.", () => + + it("Doit retourner false si un numéro de champ n'est pas trouvé dans les données.", async () => + { + let check=converter.checkFieldExist(2);// aucune donnée chargée, donc le champ ne peut être trouvé + expect(check).toBeFalse(); + converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv"; + await converter.parse(); + check=converter.checkFieldExist(-2); + expect(check).toBeFalse(); + check=converter.checkFieldExist(1.1); + expect(check).toBeFalse(); + check=converter.checkFieldExist(10); + expect(check).toBeFalse(); + }); + + it("Doit retourner true si un numéro de champ a bien été trouvé dans les données.", async () => + { + converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv"; + await converter.parse(); + let check=converter.checkFieldExist(0); + expect(check).toBeTrue(); + check=converter.checkFieldExist(2); + expect(check).toBeTrue(); + }); + + it("Doit générer une erreur si une fonction est associée à un champ n'existant pas dans les données.", async () => { - // Fonction volontairement basique, car ce n'est pas la fonction que l'on teste ici, mais le fait que l'on puisse l'utiliser ! const simpleSort = (a: any, b: any) => { if(a < b) @@ -54,6 +76,25 @@ describe("Test du script central de FreeDatas2HTML", () => else return 0; }; + expect(() => { return converter.datasSortingFunctions=[{ datasFieldNb:0, sort:simpleSort }]; }).toThrowError(errors.converterFieldNotFound); // données non chargées + converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv"; + await converter.parse(); + expect(() => { return converter.datasSortingFunctions=[{ datasFieldNb:10, sort:simpleSort }]; }).toThrowError(errors.converterFieldNotFound); + }); + + it("Doit accepter le fonction associée à un champ, de manière à ce qu'elle soit utilisable pour comparer deux valeurs.", async () => + { + const simpleSort = (a: any, b: any) => + { + if(a < b) + return 1; + else if(a > b) + return -1; + else + return 0; + }; + converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv"; + await converter.parse(); converter.datasSortingFunctions=[{ datasFieldNb:0, sort:simpleSort }]; expect(converter.getSortingFunctionForField(0)).toBeDefined(); expect([7,9,3,5].sort(converter.getSortingFunctionForField(0).sort)).toEqual([9,7,5,3]); diff --git a/tests/selectorSpec.ts b/tests/selectorSpec.ts index 628e4f6..560b1ca 100644 --- a/tests/selectorSpec.ts +++ b/tests/selectorSpec.ts @@ -46,7 +46,7 @@ describe("Test des filtres de données", () => it("Si le numéro de champ fourni est valide, il doit être accepté.", () => { expect(() => { return selector.datasFieldNb=1; }).not.toThrowError(); - selector.datasFieldNb=1; + selector.datasFieldNb=1; expect(selector.datasFieldNb).toEqual(1); });