FreeDatas2HTML/tests/freeDatas2HTMLSpec.ts

165 lines
7.3 KiB
TypeScript

import { FreeDatas2HTML, Render} from "../src/freeDatas2HTML";
const errors=require("../src/errors.js");
const fixtures=require("./fixtures.js");
/// Tests à revoir pour ne pas dépendre du bon fonctionnement de Parser et Render (mock...)
describe("Test du script central de FreeDatas2HTML", () =>
{
let converter: FreeDatas2HTML;
beforeEach( () =>
{
converter=new FreeDatas2HTML("CSV","", { url:"http://localhost:9876/datas/datas1.csv"});
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.", () =>
{
expect(() => { return FreeDatas2HTML.checkInDOMById({ id:"dontExist" }); }).toThrowError(errors.converterElementNotFound+"dontExist");
});
it("S'il y a bien un élément dans la page pour l'id fourni, doit retourner l'élement DOM complété.", () =>
{
const eltInDOM=document.getElementById("datas");
const checkElt=FreeDatas2HTML.checkInDOMById({ id:"datas" });
expect(checkElt).toEqual({ id:"datas", eltDOM: eltInDOM });
});
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();
await converter.run();
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 est bien trouvé dans les données.", async () =>
{
await converter.run();
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 () =>
{
const simpleSort = (a: any, b: any) =>
{
if(a < b)
return 1;
else if(a > b)
return -1;
else
return 0;
};
expect(() => { return converter.datasSortingFunctions=[{ datasFieldNb:0, sort:simpleSort }]; }).toThrowError(errors.converterFieldNotFound); // données non chargées
converter=new FreeDatas2HTML("CSV","", { url:"http://localhost:9876/datas/datas1.csv"});
await converter.run();
expect(() => { return converter.datasSortingFunctions=[{ datasFieldNb:10, sort:simpleSort }]; }).toThrowError(errors.converterFieldNotFound);
});
it("Doit accepter la 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;
};
await converter.run();
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]);
});
});
describe("Affichage des données reçues.", () =>
{
it("Doit générer une erreur si des données n'ont pas été importées.", async () =>
{
// Parseur non lancé :
expect(() => { return converter.refreshView(); }).toThrowError(errors.converterRefreshFail);
// Lancé, mais sur un fichier vide : à revoir, car c'est le parseur qui génère d'abord une erreur
//converter=new FreeDatas2HTML("CSV","", { url:"http://localhost:9876/datas/nodatas.csv"});
//await converter.run();
//expect(() => { return converter.refreshView(); }).toThrowError(errors.converterRefreshFail);
});
it("Doit générer une erreur si l'élément du DOM où afficher les données est inconnu.", async () =>
{
await converter.run();
expect(() => { return converter.refreshView(); }).toThrowError(errors.converterRefreshFail);
});
it("Ne doit pas générer d'erreur si les informations nécessaires sont ok.", async () =>
{
converter.datasViewElt={ id:"datas" };
await converter.run();
expect(() => { return converter.refreshView(); }).not.toThrowError();
});
it("Doit générer une erreur, si la moindre erreur est rencontrée durant la parsage et que cela n'est pas accepté.", async () =>
{
converter=new FreeDatas2HTML("CSV","", { url:"http://localhost:9876/datas/datas-errors1.csv"});
converter.stopIfParseErrors=true;
await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.parserMeetErrors));
});
it("Si cela n'est pas demandé, le script ne sera pas bloqué, même si des erreurs sont rencontrées durant le parsage.", async () =>
{
converter.datasViewElt={ id:"datas" };
converter=new FreeDatas2HTML("CSV","", { url:"http://localhost:9876/datas/datas-errors1.csv"});
await expectAsync(converter.run()).toBeResolved();
});
/// Plutôt pour tester Render
it("Doit afficher un tableau correspondant aux données du fichier csv", async () =>
{
converter.datasViewElt={ id:"datas" };
await converter.run();
const render=new Render(converter);
const htmlForDatas=render.rend2HTML(converter.datas);
// On ne peut comparer directement au contenu du DOM,
// car le navigateur change certains caractères (exemple : ">" devient "&gt;")
expect(converter.datasHTML).toEqual(htmlForDatas);
// Mais le code commence tout de même par <table> :
const txtDatasViewsElt=document.getElementById("datas").innerHTML;
expect(txtDatasViewsElt.indexOf("<table>")).toEqual(0);
// Et on doit retrouver le bon nombre de lignes :
const getTR=document.getElementsByTagName("tr");
expect(getTR.length).toEqual(119);
});
it("Si demandé, doit afficher le nombre de lignes de données du fichier.", async () =>
{
converter.datasViewElt={ id:"datas" };
converter.datasCounter={ id:"counter" };
await converter.run();
let txtDatasViewsElt=document.getElementById("counter").innerHTML;
expect(txtDatasViewsElt).toEqual("118");
});
});
});