297 lines
16 KiB
TypeScript
297 lines
16 KiB
TypeScript
import { freeDatas2HTML } from "../src/freeDatas2HTML";
|
|
const errors=require("../src/errors.js");
|
|
const fixtures=require("./fixtures.js");
|
|
|
|
describe("freeDatas2HTML", () =>
|
|
{
|
|
let converter: freeDatas2HTML;
|
|
|
|
beforeEach( () =>
|
|
{
|
|
converter=new freeDatas2HTML();
|
|
document.body.insertAdjacentHTML('afterbegin', fixtures.datasViewEltHTML);
|
|
});
|
|
|
|
afterEach( () =>
|
|
{
|
|
document.body.removeChild(document.getElementById('fixture'));
|
|
});
|
|
|
|
it("Doit avoir créé une instance de freeDatas2HTML", () =>
|
|
{
|
|
expect(converter).toBeInstanceOf(freeDatas2HTML);
|
|
});
|
|
|
|
describe("Test des données de configuration reçues.", () =>
|
|
{
|
|
it("Doit générer une erreur s'il n'y a pas d'élément dans la page pour l'id fourni pour afficher les données.", () =>
|
|
{
|
|
expect(() => { return converter.datasViewElt={ id:"dontExist" }; }).toThrowError(errors.elementNotFound+"dontExist");
|
|
});
|
|
|
|
it("Ne doit pas générer une erreur s'il y a bien un élément dans la page pour l'id fourni pour afficher les données.", () =>
|
|
{
|
|
expect(() => { return converter.datasViewElt={ id:"datas" }; }).not.toThrowError();
|
|
});
|
|
|
|
it("Ne doit accepter que les sélecteurs pour lesquels un élément a été trouvé dans la page pour l'id fourni.", () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:2, id:"selector2" },{ datasFieldNb:3, id:"selector3" }];
|
|
expect(converter.datasSelectors.length).toEqual(1);
|
|
expect(converter.datasSelectors[0].id).toEqual("selector2");
|
|
});
|
|
|
|
// Utile pour tester les valeurs fournies pour les numéros de colonne
|
|
it("Doit retourner un booléen indiquant si un nombre est naturel ou non.", () =>
|
|
{
|
|
expect(freeDatas2HTML.isNaturalNumber(-1)).toBeFalse();
|
|
expect(freeDatas2HTML.isNaturalNumber(1.25)).toBeFalse();
|
|
expect(freeDatas2HTML.isNaturalNumber(0)).toBeTrue();
|
|
expect(freeDatas2HTML.isNaturalNumber(1)).toBeTrue();
|
|
});
|
|
|
|
it("Si un séparateur vide est fourni pour un sélecteur, il doit être ignoré.", () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:2, id:"selector2", separator:"" }];
|
|
expect(converter.datasSelectors[0].separator).toBeUndefined();
|
|
});
|
|
|
|
it("Doit accepter tous les sélecteurs si leurs informations sont valides.", () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:0, id:"selector1" },{ datasFieldNb:3, id:"selector2" }];
|
|
expect(converter.datasSelectors.length).toEqual(2);
|
|
});
|
|
|
|
it("Doit générer une erreur si l'url fournie pour le fichier de données est vide.", () =>
|
|
{
|
|
expect(() => { return converter.datasSourceUrl=" "; }).toThrowError(errors.needUrl);
|
|
});
|
|
});
|
|
|
|
describe("Parsage du fichier et création du tableau de données", () =>
|
|
{
|
|
it("Doit générer une erreur si la lecture du fichier échoue.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/dontExist.csv";
|
|
await expectAsync(converter.parse()).toBeRejectedWith(new Error(errors.parserFail));
|
|
});
|
|
|
|
it("Doit enregistrer la liste des erreurs rencontrées en parsant le fichier.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas-errors1.csv";
|
|
await converter.parse();
|
|
expect(converter.parseErrors.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it("Ne doit garder que les noms de colonne non vides.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas-errors2.csv";
|
|
await converter.parse();
|
|
expect(converter.parseMeta.fields.length).toEqual(5);
|
|
});
|
|
|
|
it("Ne doit enregistrer aucune erreur de lecture si le fichier est ok.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
await converter.parse();
|
|
expect(converter.parseErrors.length).toEqual(0);
|
|
});
|
|
|
|
it("Doit générer une erreur si au moins un des deux paramètres nécessaires au fonctionnement n'est pas fourni.", async () =>
|
|
{
|
|
await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.needDatasElt));
|
|
converter.datasViewElt={ id:"datas" };
|
|
await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.needUrl));
|
|
});
|
|
|
|
it("Ne doit pas générer d'erreur si les deux paramètres fournis sont ok.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
await expectAsync(converter.run()).toBeResolved();
|
|
});
|
|
|
|
it("Doit générer une erreur si aucune donnée n'a été trouvée dans le fichier et ne rien afficher dans l'emplacement prévu pour les données.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/nodatas.csv";
|
|
await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.datasNotFound));
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual("");
|
|
});
|
|
|
|
it("Si la moindre erreur est rencontrée durant la parsage et que cela est demandé, ne rien afficher dans l'emplacement prévu pour les données.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas-errors1.csv";
|
|
converter.stopIfParseErrors=true;
|
|
await converter.run();
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual("");
|
|
});
|
|
|
|
it("Sauf si cela est demandé, les données trouvées dans le fichier seront affichées même si des erreurs sont rencontrées durant la parsage.", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas-errors1.csv";
|
|
await converter.run();
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).not.toEqual("");
|
|
});
|
|
|
|
it("Doit afficher un tableau correspondant aux données du fichier csv", async () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
await converter.run();
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTML);
|
|
});
|
|
});
|
|
|
|
describe("Création et action des sélecteurs permettant de filter les données affichées.", () =>
|
|
{
|
|
beforeEach( () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
});
|
|
|
|
it("Doit générer une erreur si au moins un des numéros de colonne fournis pour les sélecteurs ne correspond pas à une des colonne du fichier.", async () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:0, id:"selector1"},{ datasFieldNb:5, id:"selector2"}]; // il y a bien 5 champs, mais la numérotation commence à 0 :-)
|
|
await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.selectorFieldNotFound));
|
|
});
|
|
|
|
it("Ne doit pas pas générer d'erreur si tous les numéros de colonne des sélecteurs correspondent à une des colonnes du fichier.", async () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:3, id:"selector1"},{ datasFieldNb:4, id:"selector2"}];
|
|
await expectAsync(converter.run()).not.toBeRejected();
|
|
});
|
|
|
|
it("Pour chaque sélecteur demandé, doit générer un élement <select> listant les valeurs distinctes du fichier, classées dans le bon ordre.", async () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:3, id:"selector1"},{ datasFieldNb:4, id:"selector2"}];
|
|
await converter.run();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTML);
|
|
expect(document.getElementById("selector2").innerHTML).toEqual(fixtures.selector2HTML);
|
|
});
|
|
|
|
it("Si des valeurs vides sont présentes dans une colonne utilisée pour un sélecteur, elles doivent être ignorées.", async () =>
|
|
{
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1-emtyinfield.csv";
|
|
converter.datasSelectors=[{ datasFieldNb:3, id:"selector1"}];
|
|
await converter.run();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTML);
|
|
});
|
|
|
|
it("Le choix d'une option dans un des sélecteurs doit modifier le contenu du tableau pour ne garder que les données correspondantes et les afficher toutes si sélection 0.", async () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:3, id:"selector1"},{ datasFieldNb:4, id:"selector2"}];
|
|
await converter.run();
|
|
let selectElement = document.getElementById("freeDatas2HTMLSelector0") as HTMLInputElement;
|
|
selectElement.value="4";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor1Select);
|
|
selectElement.value="0";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTML);
|
|
});
|
|
|
|
it("Si plusieurs sélecteurs sont utilisés, seules les données correspondant à tous ces choix doivent être affichées. Il peut n'y avoir aucun résultat.", async () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:3, id:"selector1"},{ datasFieldNb:4, id:"selector2"}];
|
|
await converter.run();
|
|
let selectElement = document.getElementById("freeDatas2HTMLSelector0") as HTMLInputElement;
|
|
selectElement.value="2";
|
|
selectElement = document.getElementById("freeDatas2HTMLSelector1") as HTMLInputElement;
|
|
selectElement.value="1";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor2Select);
|
|
selectElement.value="4";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor2SelectNone);
|
|
});
|
|
|
|
// Cas particulier des champs pouvant contenir plusieurs valeurs :
|
|
it("Si un séparateur est fourni pour un sélecteur, les valeurs distinctes extraites de cette colonne doivent le prendre en compte.", async () =>
|
|
{
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1+tagsfield.csv";
|
|
converter.datasSelectors=[{ datasFieldNb:5, id:"selector1", separator:"|"}];
|
|
await converter.run();
|
|
expect(document.getElementById("selector1").innerHTML).toEqual(fixtures.selector1HTMLWithTags);
|
|
});
|
|
|
|
it("Si un séparateur est fourni pour un sélecteur, lorsque qu'une valeur y est sélectionnée, toutes les lignes de données la contenant doivent être affichées.", async () =>
|
|
{
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1+tagsfield.csv";
|
|
converter.datasSelectors=[{ datasFieldNb:5, id:"selector1", separator:"|"}];
|
|
await converter.run();
|
|
let selectElement=document.getElementById("freeDatas2HTMLSelector0") as HTMLInputElement;
|
|
selectElement.value="11"; // = "Exemple10" retournant une seule ligne
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLForSelectTagsField);
|
|
});
|
|
});
|
|
|
|
describe("Création et action des colonnes permettant de classer les données affichées.", () =>
|
|
{
|
|
beforeEach( () =>
|
|
{
|
|
converter.datasViewElt={ id:"datas" };
|
|
converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv";
|
|
});
|
|
|
|
it("Doit générer une erreur si au moins un des numéros de colonne de classement fournis pour ne correspond pas à une des colonne du fichier.", async () =>
|
|
{
|
|
converter.datasSortingColumns=[{ datasFieldNb:0 },{ datasFieldNb:5 }];
|
|
await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.sortingColumnsFieldNotFound));
|
|
});
|
|
|
|
it("Ne doit pas pas générer d'erreur si tous les numéros de colonne de classement fournis correspondent à des colonnes du fichier.", async () =>
|
|
{
|
|
converter.datasSortingColumns=[{ datasFieldNb:3 },{ datasFieldNb:4 }];
|
|
await expectAsync(converter.run()).not.toBeRejected();
|
|
});
|
|
|
|
it("Pour chaque colonne de classement demandée, doit générer un lien hypertexte dans l'entête de la colonne.", async () =>
|
|
{
|
|
converter.datasSortingColumns=[{ datasFieldNb:0 },{ datasFieldNb:2 }];
|
|
await converter.run();
|
|
let getTableTh=document.querySelectorAll("table th");
|
|
expect(getTableTh[0].innerHTML).toEqual(fixtures.sortingColumn1HTML);
|
|
expect(getTableTh[2].innerHTML).toEqual(fixtures.sortingColumn2HTML);
|
|
});
|
|
|
|
it("Le 1er click sur l'entête d'une des colonnes doit classer les données dans le sens ascendant, puis descendant et ainsi de suite, en prenant en compte les éventuels filtres.", async () =>
|
|
{
|
|
converter.datasSelectors=[{ datasFieldNb:3, id:"selector1"},{ datasFieldNb:4, id:"selector2"}];
|
|
converter.datasSortingColumns=[{ datasFieldNb:2 }];
|
|
await converter.run();
|
|
let selectElement = document.getElementById("freeDatas2HTMLSelector0") as HTMLInputElement;
|
|
selectElement.value="2";
|
|
selectElement = document.getElementById("freeDatas2HTMLSelector1") as HTMLInputElement;
|
|
selectElement.value="1";
|
|
selectElement.dispatchEvent(new Event('change'));
|
|
let getTableThLink=document.querySelector("table th a") as HTMLElement;
|
|
getTableThLink.click();// tri ascendant
|
|
let txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor2Select1Clic);
|
|
getTableThLink.click();// tri descendant
|
|
txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor2Select2Clic);
|
|
getTableThLink.click();// de nouveau ascendant
|
|
txtDatasViewsElt=document.getElementById("datas").innerHTML;
|
|
expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor2Select1Clic);
|
|
});
|
|
});
|
|
}); |