diff --git a/src/FreeDatas2HTML.ts b/src/FreeDatas2HTML.ts index e9a2451..2de2e87 100644 --- a/src/FreeDatas2HTML.ts +++ b/src/FreeDatas2HTML.ts @@ -19,13 +19,13 @@ export class FreeDatas2HTML public stopIfParseErrors: boolean=false; // Les options (classement, pagination, filtres...) : - private _datasCounterElt: DOMElement|undefined=undefined; private _datasSortingFunctions: SortingFunctions[]=[]; - private _fields2Rend: number[]=[]; public datasFilters: Filters[]=[]; public datasSortingFields: SortingFields[]=[]; public datasSortedField: SortingFields|undefined; public pagination: Paginations|undefined; + private _fields2Rend: number[]=[]; + public datasCounterElt: DOMElement|undefined=undefined; // Les résultats : private _fields: ParseResults["fields"]=[]; @@ -33,7 +33,8 @@ export class FreeDatas2HTML private _datas2Rend: {[index: string]:string}[]=[]; private _nbDatasValid: number=0; - // Le parseur, comme le render sont initialisés, mais peuvent être modifiés par des instances d'autres classes respectant leur interface. + // Le parseur, comme le render sont initialisés. + // Mais ils peuvent être modifiés ensuite par des instances de classes respectant leurs interfaces. constructor(datasFormat:"CSV"|"HTML"|"JSON", datas2Parse="", datasRemoteSource?:RemoteSources) { this.datasRender=new Render(); @@ -50,13 +51,13 @@ export class FreeDatas2HTML break; } if(datas2Parse.trim() !== "") - this.parser.datas2Parse=datas2Parse.trim(); + this.parser.datas2Parse=datas2Parse; else if(datasRemoteSource !== undefined) this.parser.setRemoteSource(datasRemoteSource); } // Vérifie s'il y a bien un élément dans le DOM pour l'id fourni. - // Fonction statique également utilisée par les autres classes. + // Méthode statique également utilisée par les autres classes. public static checkInDOMById(checkedElt: DOMElement) : DOMElement { let searchEltInDOM=document.getElementById(checkedElt.id); @@ -74,11 +75,6 @@ export class FreeDatas2HTML this._datasViewElt=FreeDatas2HTML.checkInDOMById(elt); } - set datasCounterElt(counterDisplayElement: DOMElement) - { - this._datasCounterElt=FreeDatas2HTML.checkInDOMById(counterDisplayElement); - } - get datas(): ParseResults["datas"] { return this._datas; @@ -104,8 +100,42 @@ export class FreeDatas2HTML return this._datas2Rend; } + // Retourne l'éventuelle fonction spécifique de classement associée à un champ + public getSortingFunctionForField(datasFieldNb: number): SortingFunctions|undefined + { + for(let checkedFunction of this._datasSortingFunctions) + { + if(checkedFunction.datasFieldNb === datasFieldNb) + return checkedFunction; + } + return undefined; + } + + // Lance le parsage des données + // + lance un premier affichage si l'élément du DOM devant recevoir les données est connu + public async run(): Promise + { + await this.parser.parse(); + if(this.parser.parseResults === undefined) // le parseur devrait lui-même générer une erreur blocante avant. + throw new Error(errors.parserFail); + else + { + if(this.stopIfParseErrors && this.parser.parseResults.errors !== undefined) + throw new Error(errors.parserMeetErrors); + else + { + this._fields=this.parser.parseResults.fields; + this._datas=this.parser.parseResults.datas; + if(this._datasViewElt !== undefined) + this.refreshView(); + return true; + } + } + } + + // Toutes les méthodes suivantes nécessitent que les données aient d'abord été parsées. + // Vérifie qu'un champ existe bien dans les données parsées. - // Utilisée par les autres classes. public checkFieldExist(nb: number) : boolean { if(this.parser.parseResults === undefined || this.parser.parseResults.fields[nb] === undefined) @@ -114,20 +144,6 @@ export class FreeDatas2HTML return true; } - // Vérifie que les numéros de champs pour lesquels il y a des fonctions de classement spécifiques sont cohérents. - // ! Ne peut donc être utilisé qu'après avoir parsé les données. - set datasSortingFunctions(SortingFunctions: SortingFunctions[]) - { - this._datasSortingFunctions=[]; - for(let checkedFunction of SortingFunctions) - { - if(! this.checkFieldExist(checkedFunction.datasFieldNb)) - throw new Error(errors.converterFieldNotFound); - else - this._datasSortingFunctions.push(checkedFunction); - } - } - // Vérifie que tous les numéros de champs à afficher sont valides // Un tableau vide signifie que tous les champs parsés seront affichés. set fields2Rend(fields: number[]) @@ -136,7 +152,7 @@ export class FreeDatas2HTML this._fields2Rend=fields; else { - this._fields2Rend=[]; + this._fields2Rend=[]; // réinitialisation nécessaire en cas de + sieurs appels au setter for(let field of fields) { if(! this.checkFieldExist(field)) @@ -147,6 +163,31 @@ export class FreeDatas2HTML } } + // Vérifie qu'un champ faire partie de ceux à afficher. + public checkField2Rend(nb: number) : boolean + { + if(this._fields2Rend.length === 0) + return this.checkFieldExist(nb); + else + { + if(this._fields2Rend.indexOf(nb) === -1) + return false; + else + return true; + } + } + + // Retourne le rang d'un champ parmis ceux à afficher + public getFieldDisplayRank(nb: number) : number + { + if(this.checkField2Rend(nb) === false) + return -1; + if(this._fields2Rend.length === 0) + return nb; + else + return this._fields2Rend.indexOf(nb); + } + // Retourne le nom des champs à afficher public realFields2Rend() : string[] { @@ -163,57 +204,17 @@ export class FreeDatas2HTML return realFields; } } - - // Vérifie qu'un champ faire partie de ceux à afficher. - public checkField2Rend(nb: number) : boolean - { - if(this.realFields2Rend()[nb] === undefined) - return false; - else - return true; - } - - // Retourne l'éventuelle fonction spécifique de classement associée à un champ - public getSortingFunctionForField(datasFieldNb: number): SortingFunctions|undefined - { - for(let checkedFunction of this._datasSortingFunctions) - { - if(checkedFunction.datasFieldNb === datasFieldNb) - return checkedFunction; - } - return undefined; - } - // Lancer le parsage des données et lance éventuellement un 1er affichage. - public async run(): Promise - { - await this.parser.parse(); - if(this.parser.parseResults === undefined) // mais le parseur devrait lui-même générer une erreur avant - throw new Error(errors.parserFail); - else - { - if(this.stopIfParseErrors && this.parser.parseResults.errors !== undefined) - throw new Error(errors.parserMeetErrors); - else - { - this._fields=this.parser.parseResults.fields; - this._datas=this.parser.parseResults.datas; - if(this._datasViewElt !== undefined) - this.refreshView(); - return true; - } - } - } - - public datasCounter2HTML() : void + // Vérifie que les numéros de champs pour lesquels il y a des fonctions de classement spécifiques sont cohérents. + set datasSortingFunctions(SortingFunctions: SortingFunctions[]) { - if(this._datasCounterElt !== undefined) + this._datasSortingFunctions=[]; + for(let checkedFunction of SortingFunctions) { - // Dans certains cas, il est nécessaire de rechercher de nouveau l'élément pour que l'affichage fonctionne correctement. - // Du coup, revoir intérêt de faire la même chose dans le setter ? - const searchEltInDOM=document.getElementById(this._datasCounterElt.id); - if(searchEltInDOM !== null) - searchEltInDOM.textContent=""+this._nbDatasValid; + if(! this.checkFieldExist(checkedFunction.datasFieldNb)) + throw new Error(errors.converterFieldNotFound); + else + this._datasSortingFunctions.push(checkedFunction); } } @@ -225,21 +226,20 @@ export class FreeDatas2HTML throw new Error(errors.converterRefreshFail); else { - //console.log(this._fields2Rend); - if(this._fields2Rend.length === 0) this.datasRender.fields=this._fields; else this.datasRender.fields=this.realFields2Rend(); this._datas2Rend=this.datas2HTML(); - this.datasRender.datas= this._datas2Rend; + this.datasRender.datas=this._datas2Rend; this._datasViewElt.eltDOM!.innerHTML=this.datasRender.rend2HTML(); // "!", car l'existence de "eltDOM" est testée par le setter. - // Actualisation de l'éventuel compteur, après l'opération précédente, car le compteur peut être dans le template passé au Render + // Actualisation du compteur, nécessairement après l'opération précédente, + // car l'élément HTML du compteur peut être dans le template du Render. this.datasCounter2HTML(); - // Réactivation des éventuels champs de classement qui ont pu être écrasés : + // (ré)activation des éventuels champs de classement : for(let field of this.datasSortingFields) field.field2HTML(); @@ -249,6 +249,18 @@ export class FreeDatas2HTML } } + public datasCounter2HTML() : void + { + if(this.datasCounterElt !== undefined) + { + // La recherche de l'existence de l'élément du compteur du DOM ne se fait pas au niveau d'un setter. + // Car son emplacement peut être situé dans le template d'affichage des données et donc pas encore affiché. + // La recherche doit être faite à chaque fois pour cette même raison (bug du DOM). + this.datasCounterElt=FreeDatas2HTML.checkInDOMById(this.datasCounterElt); + this.datasCounterElt.eltDOM!.textContent=""+this._nbDatasValid; // "!", car on vient de tester l'existence de l'élément. + } + } + // Fonction sélectionnant les données à afficher en prenant en compte les éventuels filtres, la pagination, etc. public datas2HTML() : {[index: string]:string}[] { @@ -297,18 +309,17 @@ export class FreeDatas2HTML this._nbDatasValid=nbTotal; // Tous les champs doivent-ils être affichés ? - // Ne pas enlever les champs cachés plus tôt, car ils peuvent servir à filtrer les données + // Ne pas les enlever les champs + tôt, car ils peuvent servir à filtrer les données if(this._fields2Rend.length !== 0) { - let newDatas2Display=[]; + const realFields=this.realFields2Rend(), newDatas2Display=[]; for(let row in datas2Display) { - let i=0, newData: {[index: string]: string} = {}; + let newData: {[index: string]: string}={}; for(let field in datas2Display[row]) { - if(this._fields2Rend.indexOf(i) !== -1) + if(realFields.indexOf(field) !== -1) newData[field]=datas2Display[row][field]; - i++; } newDatas2Display.push(newData); } diff --git a/tests/freeDatas2HTMLSpec.ts b/tests/freeDatas2HTMLSpec.ts index 365bbb5..2646beb 100644 --- a/tests/freeDatas2HTMLSpec.ts +++ b/tests/freeDatas2HTMLSpec.ts @@ -49,7 +49,7 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(converter.parser.datas2Parse).toEqual(""); }); - it("S'il est fourni une chaîne de caractères valide, elle doit être passée au parseur.", () => + it("S'il est fourni une chaîne de caractères non vide, elle doit être passée au parseur.", () => { converter=new FreeDatas2HTML("CSV", "datas"); expect(converter.parser.datas2Parse).toEqual("datas"); @@ -86,7 +86,7 @@ describe("Tests du script central de FreeDatas2HTML", () => it("Doit générer une erreur si le parseur ne retourne aucun résultat.", async () => { converter=new FreeDatas2HTML("CSV"); - spyOn(converter.parser, "parse"); // bloque le fonctionnement de parse() + spyOn(converter.parser, "parse"); // bloque le fonctionnement de parse() qui sinon bloquerait la suite await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.parserFail)); }); @@ -133,7 +133,7 @@ describe("Tests du script central de FreeDatas2HTML", () => beforeEach( async () => { converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datas1.csv" }); - await converter.run(); + await converter.run(); // simple parsage, car aucun élément indiqué pour l'affichage simpleSort = (a: number, b: number) => { if(a < b) @@ -148,12 +148,11 @@ describe("Tests du script central de FreeDatas2HTML", () => it("Le test d'existence d'un champ doit retourner false s'il est lancé avant que les données n'aient été parsées.", () => { converter=new FreeDatas2HTML("CSV"); - const check=converter.checkFieldExist(0); expect(converter.checkFieldExist(0)).toBeFalse(); // Dans le cas d'un parsage ne retournant rien, c'est le parseur qui doit générer une erreur. }); - it("Doit retourner false si le numéro de champ n'est pas trouvé dans les données.", () => + it("Doit retourner false si le numéro de champ n'est pas trouvé dans les données parsées.", () => { let check=converter.checkFieldExist(-2); expect(check).toBeFalse(); @@ -163,7 +162,7 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(check).toBeFalse(); }); - it("Doit retourner true si le numéro de champ est bien trouvé dans les données.", () => + it("Doit retourner true si le numéro de champ est bien trouvé dans les données parsées.", () => { let check=converter.checkFieldExist(0); expect(check).toBeTrue(); @@ -171,7 +170,7 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(check).toBeTrue(); }); - it("Doit générer une erreur si tous les champs devant être affichés ne sont pas présents dans les données reçues.", () => + it("Doit générer une erreur si tous les champs devant être affichés ne sont pas présents dans les données parsées.", () => { expect(() => { return converter.fields2Rend=[0,2,8]; }).toThrowError(errors.converterFieldNotFound); }); @@ -182,10 +181,60 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(converter.fields2Rend.length).toEqual(0); }); - it("Si tous les champs à afficher sont trouvés dans les données, ils doivent être acceptés.", () => + it("Si tous les champs devant être affichés sont trouvés dans les données, ils doivent être acceptés.", () => { expect(() => { return converter.fields2Rend=[0,1,2]; }).not.toThrowError(); expect(converter.fields2Rend).toEqual([0,1,2]); + // On peut même changer d'avis : + converter.fields2Rend=[1,2,3]; + expect(converter.fields2Rend).toEqual([1,2,3]); + }); + + it("Doit retourner false si le numéro de champ n'est pas trouvé dans ceux devant être affichés.", () => + { + let check=converter.checkField2Rend(10); + expect(check).toBeFalse(); + converter.fields2Rend=[]; // = tous les champs affichés + check=converter.checkField2Rend(10); + expect(check).toBeFalse(); + converter.fields2Rend=[1,3,4]; + check=converter.checkField2Rend(2); + expect(check).toBeFalse(); + }); + + it("Doit retourner true si le numéro de champ est bien trouvé dans ceux devant être affichés.", () => + { + let check=converter.checkField2Rend(2); + expect(check).toBeTrue(); + converter.fields2Rend=[]; // = tous les champs affichés + check=converter.checkField2Rend(2); + expect(check).toBeTrue(); + converter.fields2Rend=[1,3,4]; + check=converter.checkField2Rend(4); + expect(check).toBeTrue(); + }); + + it("Doit retourner le rang d'un champ parmis ceux devant être affichés et -1 s'il n'est pas trouvé.", () => + { + // Pas de champs sélectionnés, on recherche parmis tous les champs parsés : + expect(converter.getFieldDisplayRank(10)).toEqual(-1); + expect(converter.getFieldDisplayRank(0)).toEqual(0); + expect(converter.getFieldDisplayRank(3)).toEqual(3); + // Seuls certains champs doivent être affichés : + converter.fields2Rend=[1,3,4]; + expect(converter.getFieldDisplayRank(2)).toEqual(-1); + expect(converter.getFieldDisplayRank(1)).toEqual(0); + expect(converter.getFieldDisplayRank(3)).toEqual(1); + expect(converter.getFieldDisplayRank(4)).toEqual(2); + }); + + it("Doit retourner la liste des champs devant être affichés.", () => + { + // Pas de champs sélectionnés = tous les champs parsés doivent être affichés : + expect(converter.realFields2Rend()).toEqual(converter.fields); + // Seuls certains champs doivent être affichés : + converter.fields2Rend=[1,3,4]; + expect(converter.realFields2Rend()).toEqual([converter.fields[1], converter.fields[3], converter.fields[4]]); }); it("Doit générer une erreur si une fonction est associée à un champ n'existant pas dans les données.", () => @@ -206,7 +255,7 @@ describe("Tests du script central de FreeDatas2HTML", () => beforeEach( async () => { converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datas1.csv" }); - await converter.run();// récupére les données sans actualiser affichage car élement HTML non connu + await converter.run(); // récupére les données sans actualiser affichage car élement HTML non connu converter.datasViewElt={ id:"datas" }; // pour la suite, si ! :) }); @@ -225,7 +274,20 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(() => { return converter.refreshView(); }).toThrowError(errors.converterRefreshFail); }); - it("Doit appelé la fonction préparant les données à afficher et transmettre le résultat au moteur de rendu.", () => + it("Si les champs à afficher n'ont pas été renseignés, tous ceux trouvés par le parseur doivent tous être transmis au moteur de rendu.", () => + { + converter.refreshView(); + expect(converter.datasRender.fields).toEqual(converter.parser.parseResults.fields); + }); + + it("Si dans champs à afficher ont été renseignés, ils doivent être transmis au moteur de rendu", () => + { + converter.fields2Rend=[0,2]; + converter.refreshView(); + expect(converter.datasRender.fields).toEqual([converter.parser.parseResults.fields[0],converter.parser.parseResults.fields[2]]); + }); + + it("Doit appeler la fonction préparant les données à afficher et transmettre le résultat au moteur de rendu.", () => { spyOn(converter, "datas2HTML").and.callThrough(); converter.refreshView(); @@ -233,40 +295,7 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(converter.datasRender.datas).toEqual(converter.datas2Rend); }); - it("Si des champs à afficher n'ont pas été renseignés, tous ceux trouvés par le parserur doivent tous être transmis au moteur de rendu.", () => - { - converter.refreshView(); - expect(converter.datasRender.fields).toEqual(converter.parser.parseResults.fields); - }); - - it("Si dans champs à afficher ont été renseignés, ils doivent être transmis au moteur rendu", async () => - { - converter.fields2Rend=[1,2]; - await converter.run(); - expect(converter.datasRender.fields).toEqual([converter.parser.parseResults.fields[1],converter.parser.parseResults.fields[2]]); - }); - - it("Doit appelé la fonction actualisant le compteur d'enregistrements.", () => - { - spyOn(converter, "datasCounter2HTML"); - converter.refreshView(); - expect(converter.datasCounter2HTML).toHaveBeenCalled(); - }); - - it("Si un élément du DOM est renseigné pour le compteur, il doit afficher le nombre d'enregistrements.", async () => - { - converter.datasCounterElt={ id:"counter" }; - converter.datasCounter2HTML(); - converter.refreshView(); - expect(document.getElementById("counter").textContent).toEqual("118"); - // Y compris quand aucune donnée trouvée : - converter.parser=new ParserForCSV(); - converter.parser.datas2Parse="name,firstname,city"; - await converter.run(); - expect(document.getElementById("counter").textContent).toEqual("0"); - }); - - it("Doit appelé le moteur de rendu et afficher le résultat dans la page.", async () => + it("Doit appeler le moteur de rendu et afficher le résultat dans la page.", async () => { converter=new FreeDatas2HTML("CSV", "name,firstname,birthday\ndoe,john,2000/12/25"); await converter.run();// parse sans rien afficher @@ -274,20 +303,31 @@ describe("Tests du script central de FreeDatas2HTML", () => spyOn(converter.datasRender, "rend2HTML").and.callThrough(); converter.refreshView(); expect(converter.datasRender.rend2HTML).toHaveBeenCalled(); - // Les données à afficher doivent être assez simples, car certains caractères peuvent être remplacés par innerHTML (exemples :"<" ou ">") + // Pour ce test, les données à afficher doivent être assez simples, car certains caractères peuvent être remplacés par innerHTML (exemples :"<" ou ">") expect(document.getElementById("datas").innerHTML).toEqual(converter.datasRender.rend2HTML()); }); - - it("Si un élément HTML devant affiché le nombre de résultats est connu, il doit être actualisé.", () => + + it("Doit appeler la fonction actualisant le compteur d'enregistrements.", () => + { + spyOn(converter, "datasCounter2HTML"); + converter.refreshView(); + expect(converter.datasCounter2HTML).toHaveBeenCalled(); + }); + + it("Si un élément HTML devant affiché le nombre de résultats est connu, il doit être actualisé.", async () => { converter.datasCounterElt={ id: "counter" }; converter.refreshView(); expect(document.getElementById("counter").innerHTML).toEqual(""+converter.nbDatasValid); + // Y compris quand aucune donnée trouvée : + converter.parser=new ParserForCSV(); + converter.parser.datas2Parse="name,firstname,city"; + await converter.run(); + expect(document.getElementById("counter").textContent).toEqual("0"); }); it("Si des champs de classement existent, leur code HTML doit être actualisé.", () => { - converter.refreshView(); // nécessaire pour que les champs soit trouvés dans le HTML const sortingField1=new SortingField(converter, 0); const sortingField2=new SortingField(converter, 1); converter.datasSortingFields=[sortingField1,sortingField2]; @@ -297,7 +337,7 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(sortingField1.field2HTML).toHaveBeenCalled(); expect(sortingField2.field2HTML).toHaveBeenCalled(); }); - + it("Si une pagination est configurée, le code HTML listant les pages doit être actualisé.", () => { const pagination=new Pagination(converter, { id:"pages" }, "Page à afficher :"); @@ -317,34 +357,15 @@ describe("Tests du script central de FreeDatas2HTML", () => await converter.run(); }); - it("Si une liste de champs à afficher a été renseignée, elle doit être prise en compte.", async () => - { - converter=new FreeDatas2HTML("CSV","id,firstname,name,birthday\n1,john,doe,2001/12/25\n2,donald,duck,1934/06/09"); - converter.datasViewElt={ id:"datas" }; - await converter.run(); - converter.fields2Rend=[1,2]; - converter.refreshView(); - expect(converter.datas2Rend).toEqual([{ firstname:"john", name:"doe" }, { firstname:"donald", name:"duck" }]); - }); - - it("Par défaut, tous les champs trouvés doivent être affichés.", async () => - { - converter=new FreeDatas2HTML("CSV","id,firstname,name,birthday\n1,john,doe,2001/12/25\n2,donald,duck,1934/06/09"); - converter.datasViewElt={ id:"datas" }; - await converter.run(); - converter.refreshView(); - expect(converter.datas2Rend).toEqual([{ id:"1", firstname:"john", name:"doe", birthday:"2001/12/25" }, { id:"2", firstname:"donald", name:"duck", birthday:"1934/06/09" }]); - }); - it("Si un champ de classement est activé par l'utilisateur, les données doivent être classées via ce champ.", () => { - // Compliqué de tester avec spyOn que sort() a été appelée avec la bonne fonction de classement en paramètre - // Donc je compare les résultats à ceux attendus + // Semble compliqué de tester que sort() a été appelée avec la bonne fonction de classement en paramètre. + // Donc je compare les résultats à ceux attendus en cliquant sur le 1er champ. const sortingField=new SortingField(converter, 0); converter.datasSortingFields=[sortingField]; sortingField.field2HTML(); - const fieldName=converter.fields[0]; const getTHLink=document.querySelector("th a") as HTMLElement; + const fieldName=converter.fields[0]; getTHLink.click(); converter.datas.sort( (a, b) => compare( {order: "asc"} )(a[fieldName], b[fieldName])); expect(converter.datas2Rend).toEqual(converter.datas); @@ -356,7 +377,7 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(converter.datas2Rend).toEqual(converter.datas); }); - it("Si une fonction de classement est définie pour le champ activé par l'utilisateur, elle doit être prise en compte.", () => + it("Si une fonction de classement est définie pour le champ cliqué par l'utilisateur, elle doit être prise en compte.", () => { const mySort = (a: any, b: any, order: "asc"|"desc" = "asc") => { @@ -374,20 +395,29 @@ describe("Tests du script central de FreeDatas2HTML", () => const sortingField=new SortingField(converter, 4); converter.datasSortingFields=[sortingField]; sortingField.field2HTML(); - const fieldName=converter.fields[0]; - const getTHLink=document.querySelector("th a") as HTMLElement; - getTHLink.click(); + const fieldName=converter.fields[4]; + const getTHLink=document.querySelectorAll("th a") as NodeListOf; + getTHLink[0].click(); converter.datas.sort( (a, b) => { return mySort(a[fieldName], b[fieldName], "asc"); }); expect(converter.datas2Rend).toEqual(converter.datas); - getTHLink.click(); + getTHLink[0].click(); converter.datas.sort( (a, b) => { return mySort(a[fieldName], b[fieldName], "desc"); }); expect(converter.datas2Rend).toEqual(converter.datas); - getTHLink.click(); + getTHLink[0].click(); converter.datas.sort( (a, b) => { return mySort(a[fieldName], b[fieldName], "asc"); }); expect(converter.datas2Rend).toEqual(converter.datas); + }); + + it("Par défaut, tous les champs trouvés doivent être affichés.", async () => + { + converter=new FreeDatas2HTML("CSV","id,firstname,name,birthday\n1,john,doe,2001/12/25\n2,donald,duck,1934/06/09"); + converter.datasViewElt={ id:"datas" }; + await converter.run(); + converter.refreshView(); + expect(converter.datas2Rend).toEqual([{ id:"1", firstname:"john", name:"doe", birthday:"2001/12/25" }, { id:"2", firstname:"donald", name:"duck", birthday:"1934/06/09" }]); }); - it("Si des options de pagination sont activées par l'utilisateur, seules les données de la page choisie doivent être retournées.", () => + it("Si des options de pagination sont activées, seules les données de la page choisie doivent être retournées.", () => { const pagination=new Pagination(converter, { id:"pages" }, "Page à afficher :"); pagination.options={ displayElement: { id:"paginationOptions" }, values: [10,20,50] , name: "Choix de pagination :" }; @@ -416,7 +446,7 @@ describe("Tests du script central de FreeDatas2HTML", () => filter1.filter2HTML(); const filter2=new Selector(converter, 4, { id:"selector2"} ); converter.datasFilters=[filter1,filter2]; - // si le 1er n'est pas réellement lancé, le second est bloqué, car cela retourne un "false" + // Nécessaire de vraiment lancer le 1er, sinon le second est bloqué, car cela retourne un "false" spyOn(filter1, "dataIsOk").and.callThrough(); spyOn(filter2, "dataIsOk"); converter.refreshView(); @@ -439,5 +469,22 @@ describe("Tests du script central de FreeDatas2HTML", () => expect(filter1.dataIsOk).toHaveBeenCalledTimes(118); expect(filter2.dataIsOk).toHaveBeenCalledTimes(4); }); + + it("Si une liste de champs à afficher a été renseignée, elle doit être prise en compte.", async () => + { + converter=new FreeDatas2HTML("CSV","id,firstname,name,birthday\n1,john,doe,2001/12/25\n2,donald,duck,1934/06/09"); + converter.datasViewElt={ id:"datas" }; + await converter.run(); + converter.fields2Rend=[1,2]; + converter.refreshView(); + expect(converter.datas2Rend).toEqual([{ firstname:"john", name:"doe" }, { firstname:"donald", name:"duck" }]); + // Même quand les données sont dans le désordre : + converter=new FreeDatas2HTML("JSON", JSON.stringify([{nom:"dugenoux","prénom":"henri","âge":25},{nom:"michu","âge":58,"prénom":"mariette"}])); + await converter.run(); + converter.fields2Rend=[0,1]; + converter.datasViewElt={ id:"datas" }; + converter.refreshView(); + expect(converter.datas2Rend).toEqual([{"nom": "dugenoux", "prénom": "henri"}, { nom:"michu", "prénom":"mariette" }]); + }); }); }); \ No newline at end of file