Mutualisation de la méthode contrôleur qu'un numéro de champ est valide.

This commit is contained in:
Fabrice PENHOËT 2021-09-22 16:25:10 +02:00
parent fb9e69a2b7
commit 7b313ae150
7 changed files with 65 additions and 12 deletions

View File

@ -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": {

View File

@ -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.",
};

View File

@ -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]);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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]);

View File

@ -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);
});