203 lines
9.2 KiB
TypeScript
203 lines
9.2 KiB
TypeScript
import { FreeDatas2HTML, Selector } from "../src/freeDatas2HTML";
|
|
|
|
const errors=require("../src/errors.js");
|
|
const fixtures=require("./fixtures.js");
|
|
|
|
describe("Test des filtres de données", () =>
|
|
{
|
|
let converter: FreeDatas2HTML;
|
|
let selector: Selector;
|
|
|
|
beforeEach( async () =>
|
|
{
|
|
document.body.insertAdjacentHTML("afterbegin", fixtures.datasViewEltHTML);
|
|
converter=new FreeDatas2HTML();
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
await converter.parse();
|
|
});
|
|
|
|
afterEach( () =>
|
|
{
|
|
document.body.removeChild(document.getElementById("fixture"));
|
|
});
|
|
|
|
describe("Test des données reçues pour configurer un filtre.", () =>
|
|
{
|
|
it("Doit générer une erreur, si initialisé sans fournir la liste des champs servant à classer les données.", () =>
|
|
{
|
|
converter=new FreeDatas2HTML();
|
|
expect(() => { return new Selector(converter, 0, { id:"selector1" }); }).toThrowError(errors.selectorNeedDatas);
|
|
});
|
|
|
|
it("Doit générer une erreur, si le numéro de champ fourni n'existe pas dans les données.", () =>
|
|
{
|
|
expect(() => { return new Selector(converter, 9, { id:"selector1" }); }).toThrowError(errors.selectorFieldNotFound);
|
|
expect(() => { return new Selector(converter, -1, { id:"selector1" }); }).toThrowError(errors.selectorFieldNotFound);
|
|
expect(() => { return new Selector(converter, 1.1, { id:"selector1" }); }).toThrowError(errors.selectorFieldNotFound);
|
|
});
|
|
|
|
it("Si un séparateur vide est fourni pour un filtre, il doit être ignoré.", () =>
|
|
{
|
|
selector=new Selector(converter, 0, { id:"selector1" });
|
|
selector.separator="";
|
|
expect(selector.separator).toBeUndefined();
|
|
});
|
|
|
|
it("Si toutes les paramètres sont correctes, ils doivent être acceptés.", () =>
|
|
{
|
|
const elt=document.getElementById("selector1");
|
|
const selector=new Selector(converter, 2, { id:"selector1" });
|
|
selector.separator=",";
|
|
expect(selector.datasFieldNb).toEqual(2);
|
|
expect(selector.datasViewElt).toEqual({ id:"selector1", eltDOM:elt });
|
|
expect(selector.separator).toEqual(",");
|
|
});
|
|
|
|
});
|
|
|
|
describe("Création et action des sélecteurs permettant de filter les données affichées.", () =>
|
|
{
|
|
beforeEach( async () =>
|
|
{
|
|
document.body.insertAdjacentHTML("afterbegin", fixtures.datasViewEltHTML);
|
|
converter=new FreeDatas2HTML();
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
await converter.parse();
|
|
selector=new Selector(converter, 3, { id:"selector1" });
|
|
});
|
|
|
|
it("Doit générer un élement <select> listant les valeurs distinctes du champ spécifié, classées dans le bon ordre.", () =>
|
|
{
|
|
selector.selector2HTML();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTML);
|
|
selector=new Selector(converter, 4, { id:"selector2" });
|
|
selector.selector2HTML();
|
|
expect(document.getElementById("selector2").innerHTML).toEqual(fixtures.selector2HTML);
|
|
});
|
|
|
|
it("Si des valeurs vides sont présentes dans une champ utilisé pour un sélecteur, elles doivent être ignorées.", async () =>
|
|
{
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1-emtyinfield.csv";
|
|
await converter.parse();
|
|
selector.selector2HTML();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTML);
|
|
});
|
|
|
|
it("Si un séparateur est fourni, les valeurs distinctes extraites de ce champ doivent le prendre en compte.", async () =>
|
|
{
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1+tagsfield.csv";
|
|
await converter.parse();
|
|
selector=new Selector(converter, 5, { id:"selector1" });
|
|
selector.separator="|";
|
|
selector.selector2HTML();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTMLWithSeparator);
|
|
});
|
|
|
|
it("Si une fonction spécifique est fournie pour le champ utilisé pour ce filtre, elle doit être prise en compte.", () =>
|
|
{
|
|
const mySort=(a: any, b: any, order: "asc"|"desc"="asc") =>
|
|
{
|
|
const values=[ "> 100000", "> 1 et < 100 000", "≤ 1", "Traces", "Inexistant"];
|
|
if(order === "desc")
|
|
values.reverse();
|
|
if(values.indexOf(a) > values.indexOf(b))
|
|
return -1;
|
|
else if(values.indexOf(a) < values.indexOf(b))
|
|
return 1;
|
|
else
|
|
return 0;
|
|
};
|
|
converter.datasSortingFunctions=[{ datasFieldNb: 4, sort:mySort }];
|
|
selector=new Selector(converter, 4, { id:"selector1" });
|
|
selector.separator="|";
|
|
selector.selector2HTML();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTMLWithFunction);
|
|
});
|
|
|
|
it("Doit générer une erreur si une donnée est testée pour un sélecteur non correctement initialisé.", () =>
|
|
{
|
|
let data2Test= {
|
|
"Z (numéro atomique)" : "53",
|
|
"Élément": "Iode",
|
|
"Symbole": "I",
|
|
"Famille": "Halogène",
|
|
"Abondance des éléments dans la croûte terrestre (μg/k)": "> 1 et < 100 000",
|
|
};
|
|
expect(() => { selector.dataIsOk(data2Test); }).toThrowError(errors.selectorCheckIsOkFail);
|
|
});
|
|
|
|
it("Doit retourner false, si la donnée testée ne possède pas le champ sur lequel les données sont filtrées.", () =>
|
|
{
|
|
selector.selector2HTML();
|
|
let selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement;
|
|
selectElement.value="4";
|
|
let data2Test= { // le champ à filtrer ("Famille") est manquant
|
|
"Z (numéro atomique)" : "53",
|
|
"Élément": "Iode",
|
|
"Symbole": "I",
|
|
"Abondance des éléments dans la croûte terrestre (μg/k)": "> 1 et < 100 000",
|
|
};
|
|
expect(selector.dataIsOk(data2Test)).toBeFalse();
|
|
});
|
|
|
|
it("Doit retourner false, si une donnée testée ne correspond pas à la valeur sélectionnée pour le filtre.", () =>
|
|
{
|
|
selector.selector2HTML();
|
|
let selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement;
|
|
selectElement.value="4";
|
|
let data2Test= {
|
|
"Z (numéro atomique)" : "53",
|
|
"Élément": "Iode",
|
|
"Symbole": "I",
|
|
"Famille": "Halogene", // manque un accent :)
|
|
"Abondance des éléments dans la croûte terrestre (μg/k)": "> 1 et < 100 000",
|
|
};
|
|
expect(selector.dataIsOk(data2Test)).toBeFalse();
|
|
});
|
|
|
|
it("Doit retourner true, si une donnée testée correspond pas à la valeur sélectionnée pour ce filtre.", () =>
|
|
{
|
|
selector.selector2HTML();
|
|
let selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement;
|
|
selectElement.value="4";
|
|
let data2Test= {
|
|
"Z (numéro atomique)" : "53",
|
|
"Élément": "Iode",
|
|
"Symbole": "I",
|
|
"Famille": "Halogène",
|
|
"Abondance des éléments dans la croûte terrestre (μg/k)": "> 1 et < 100 000",
|
|
};
|
|
expect(selector.dataIsOk(data2Test)).toBeTrue();
|
|
});
|
|
|
|
it("Doit toujours retourner true, si aucune valeur sélectionnée dans la liste.", () =>
|
|
{
|
|
selector.selector2HTML();
|
|
let data2Test= {
|
|
"Z (numéro atomique)" : "530",
|
|
"Élément": "Yode",
|
|
"Symbole": "L",
|
|
"Famille": "Halogene",
|
|
"Abondance des éléments": "> 1 et < 100 000",
|
|
};
|
|
expect(selector.dataIsOk(data2Test)).toBeTrue();
|
|
});
|
|
|
|
it("La manipulation d'un sélecteur doit appeler la fonction actualisant l'affichage, y compris pour supprimer ce filtre (0).", () =>
|
|
{
|
|
selector=new Selector(converter, 3, { id:"selector1" });
|
|
selector.selector2HTML();
|
|
converter.datasSelectors=[selector];
|
|
spyOn(converter, "refreshView");
|
|
let selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement;
|
|
selectElement.value="4";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
expect(converter.refreshView).toHaveBeenCalledTimes(1);
|
|
selectElement.value="0";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
expect(converter.refreshView).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
}); |