import { FreeDatas2HTML, Selector, SortingField } from "../src/freeDatas2HTML"; const errors=require("../src/errors.js"); const fixtures=require("./fixtures.js"); describe("Test des champs de classement.", () => { let converter: FreeDatas2HTML; let sortingField: SortingField; 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.run(); sortingField=new SortingField(converter); }); afterEach( () => { document.body.removeChild(document.getElementById("fixture")); }); describe("Test des données reçues pour configurer le champ de classement.", () => { 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 SortingField(converter); }).toThrowError(errors.sortingFieldNeedDatas); }); it("Doit générer une erreur, si initialisé sans élements HTML textuels dans la page servant d'entêtes aux données.", () => { expect(() => { return new SortingField(converter, "th.cols"); }).toThrowError(errors.sortingsFieldNotInHTML); }); it("Doit générer une erreur, si le nombre d'éléments du DOM devant servir d'entêtes est différent du nombre de champs des données.", () => { expect(() => { return new SortingField(converter, "td"); }).toThrowError(errors.sortingFieldsNbFail); }); it("Ne doit pas générer d'erreur, si initialisé avec des données correctes.", () => { expect(() => { return new SortingField(converter, "th"); }).not.toThrowError(); expect(() => { return new SortingField(converter); }).not.toThrowError(); }); it("Doit générer une erreur, si le numéro du champ de classement n'existe pas dans les données.", () => { expect(() => { return sortingField.datasFieldNb=9; }).toThrowError(errors.sortingFieldFieldNotFound); expect(() => { return sortingField.datasFieldNb=-1; }).toThrowError(errors.sortingFieldFieldNotFound); expect(() => { return sortingField.datasFieldNb=1.1; }).toThrowError(errors.sortingFieldFieldNotFound); }); it("Si le numéro de champ fourni est valide, il doit être accepté.", () => { expect(() => { return sortingField.datasFieldNb=1; }).not.toThrowError(); sortingField.datasFieldNb=1; expect(sortingField.datasFieldNb).toEqual(1); }); }); describe("Création et action des liens permettant de classer les données affichées.", () => { it("Doit générer un élement lien avec comme ancre l'élément HTML correspondant au nom de la colonne.", () => { sortingField.datasFieldNb=0; sortingField.field2HTML(); let sortingField2=new SortingField(converter); sortingField2.datasFieldNb=2; sortingField2.field2HTML(); let getTH=document.getElementsByTagName("th"); expect(getTH[0].innerHTML).toEqual(fixtures.sortingColumn1HTML); expect(getTH[2].innerHTML).toEqual(fixtures.sortingColumn2HTML); }); }); describe("Action des colonnes de classement en corrélation avec le convertiseur.", () => { it("Le 1er clic sur l'entête d'une des colonnes doit classer les données dans le sens ascendant, puis descendant et ainsi de suite.", async () => { sortingField.datasFieldNb=2; sortingField.field2HTML(); converter.datasSortingFields=[sortingField]; let getTHLink=document.querySelector("th a") as HTMLElement; getTHLink.click();// tri ascendant let getTR=document.querySelectorAll("tr"); let txtDatasViewsElt=getTR[1].innerHTML; expect(txtDatasViewsElt).toEqual("89ActiniumAcActinide≤ 1"); getTHLink.click();// tri descendant getTR=document.querySelectorAll("tr"); txtDatasViewsElt=getTR[1].innerHTML; expect(txtDatasViewsElt).toEqual("40ZirconiumZrMétal de transition> 100000"); getTHLink.click();// de nouveau ascendant getTR=document.querySelectorAll("tr"); txtDatasViewsElt=getTR[1].innerHTML; expect(txtDatasViewsElt).toEqual("89ActiniumAcActinide≤ 1"); }); it("Prise en compte d'une fonction spécifique associée au champ de classement.", async () => { 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 }]; sortingField.datasFieldNb=4; sortingField.field2HTML(); converter.datasSortingFields=[sortingField]; let getTHLink=document.querySelector("th a") as HTMLElement; getTHLink.click();// tri ascendant let getTR=document.querySelectorAll("tr"); let txtDatasViewsElt=getTR[1].innerHTML; expect(txtDatasViewsElt).toEqual("95AmériciumAmActinideInexistant"); getTHLink.click();// tri descendant getTR=document.querySelectorAll("tr"); txtDatasViewsElt=getTR[1].innerHTML; expect(txtDatasViewsElt).toEqual("1HydrogèneHNon-métal> 100000"); getTHLink.click();// de nouveau ascendant getTR=document.querySelectorAll("tr"); txtDatasViewsElt=getTR[1].innerHTML; expect(txtDatasViewsElt).toEqual("95AmériciumAmActinideInexistant"); }); }); });