diff --git a/package.json b/package.json index 2e8fce9..d48d007 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "freedatas2html", - "version": "0.5.1", + "version": "0.5.2", "description": "Visualization of data from various sources (CSV, API, HTML...) with filters, classification, pagination, etc.", "main": "index.js", "scripts": { diff --git a/tests/fixtures.js b/tests/fixtures.js index c6b4e42..8b2f184 100644 --- a/tests/fixtures.js +++ b/tests/fixtures.js @@ -1,19 +1,12 @@ module.exports = { datasViewEltHTML: '
', - datasHTML : '
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)
1HydrogèneHNon-métal> 100000
2HéliumHeGaz noble> 1 et < 100 000
3LithiumLiMétal alcalin> 1 et < 100 000
4BérylliumBeMétal alcalino-terreux> 1 et < 100 000
5BoreBMétalloïde> 1 et < 100 000
6CarboneCNon-métal> 100000
7AzoteNNon-métal> 1 et < 100 000
8OxygèneONon-métal> 100000
9FluorFHalogène> 100000
10NéonNeGaz noble> 1 et < 100 000
11SodiumNaMétal alcalin> 100000
12MagnésiumMgMétal alcalino-terreux> 100000
13AluminiumAlMétal pauvre> 100000
14SiliciumSiMétalloïde> 100000
15PhosphorePNon-métal> 100000
16SoufreSNon-métal> 100000
17ChloreClHalogène> 100000
18ArgonArGaz noble> 1 et < 100 000
19PotassiumKMétal alcalin> 100000
20CalciumCaMétal alcalino-terreux> 100000
21ScandiumScMétal de transition> 1 et < 100 000
22TitaneTiMétal de transition> 100000
23VanadiumVMétal de transition> 100000
24ChromeCrMétal de transition> 100000
25ManganèseMnMétal de transition> 100000
26FerFeMétal de transition> 100000
27CobaltCoMétal de transition> 1 et < 100 000
28NickelNiMétal de transition> 1 et < 100 000
29CuivreCuMétal de transition> 1 et < 100 000
30ZincZnMétal pauvre> 1 et < 100 000
31GalliumGaMétal pauvre> 1 et < 100 000
32GermaniumGeMétalloïde> 1 et < 100 000
33ArsenicAsMétalloïde> 1 et < 100 000
34SéléniumSeNon-métal> 1 et < 100 000
35BromeBrHalogène> 1 et < 100 000
36KryptonKrgaz rare≤ 1
37RubidiumRbMétal alcalin> 1 et < 100 000
38StrontiumSrMétal alcalino-terreux> 100000
39YttriumYMétal de transition> 1 et < 100 000
40ZirconiumZrMétal de transition> 100000
41NiobiumNbMétal de transition> 1 et < 100 000
42MolybdèneMoMétal de transition> 1 et < 100 000
43TechnétiumTcMétal de transitionTraces
44RuthéniumRuMétal de transition≤ 1
45RhodiumRhMétal de transition≤ 1
46PalladiumPdMétal de transition> 1 et < 100 000
47ArgentAgMétal de transition> 1 et < 100 000
48CadmiumCdMétal pauvre> 1 et < 100 000
49IndiumInMétal pauvre> 1 et < 100 000
50ÉtainSnMétal pauvre> 1 et < 100 000
51AntimoineSbMétalloïde> 1 et < 100 000
52TellureTeMétalloïde≤ 1
53IodeIHalogène> 1 et < 100 000
54XénonXegaz rare≤ 1
55CésiumCsMétal alcalin> 1 et < 100 000
56BaryumBaMétal alcalino-terreux> 100000
57LanthaneLaLanthanide> 1 et < 100 000
58CériumCeLanthanide> 1 et < 100 000
59PraséodymePrLanthanide> 1 et < 100 000
60NéodymeNdLanthanide> 1 et < 100 000
61ProméthiumPmLanthanideTraces
62SamariumSmLanthanide> 1 et < 100 000
63EuropiumEuLanthanide> 1 et < 100 000
64GadoliniumGdLanthanide> 1 et < 100 000
65TerbiumTbLanthanide> 1 et < 100 000
66DysprosiumDyLanthanide> 1 et < 100 000
67HolmiumHoLanthanide> 1 et < 100 000
68ErbiumErLanthanide> 1 et < 100 000
69ThuliumTmLanthanide> 1 et < 100 000
70YtterbiumYbLanthanide> 1 et < 100 000
71LutéciumLuLanthanide> 1 et < 100 000
72HafniumHfMétal de transition> 1 et < 100 000
73TantaleTaMétal de transition> 1 et < 100 000
74TungstèneWMétal de transition> 1 et < 100 000
75RhéniumReMétal de transition≤ 1
76OsmiumOsMétal de transition> 1 et < 100 000
77IridiumIrMétal de transition≤ 1
78PlatinePtMétal de transition> 1 et < 100 000
79OrAuMétal de transition> 1 et < 100 000
80MercureHgMétal pauvre> 1 et < 100 000
81ThalliumTlMétal pauvre> 1 et < 100 000
82PlombPbMétal pauvre> 1 et < 100 000
83BismuthBiMétal pauvre> 1 et < 100 000
84PoloniumPoMétal pauvre≤ 1
85AstateAtMétalloïdeTraces
86RadonRnGaz noble≤ 1
87FranciumFrMétal alcalinTraces
88RadiumRaMétal alcalino-terreux≤ 1
89ActiniumAcActinide≤ 1
90ThoriumThActinide> 1 et < 100 000
91ProtactiniumPaActinide≤ 1
92UraniumUActinide> 1 et < 100 000
93NeptuniumNpActinideTraces
94PlutoniumPuActinideTraces
95AmériciumAmActinideInexistant
96CuriumCmActinideInexistant
97BerkéliumBkActinideInexistant
98CaliforniumCfActinideInexistant
99EinsteiniumEsActinideInexistant
100FermiumFmActinideInexistant
101MendéléviumMdActinideInexistant
102NobéliumNoActinideInexistant
103LawrenciumLrActinideInexistant
104RutherfordiumRfMétal de transitionInexistant
105DubniumDbMétal de transitionInexistant
106SeaborgiumSgMétal de transitionInexistant
107BohriumBhMétal de transitionInexistant
108HassiumHsMétal de transitionInexistant
109MeitnériumMtIndéfinieInexistant
110DarmstadtiumDsIndéfinieInexistant
111RoentgeniumRgIndéfinieInexistant
112CoperniciumCnMétal de transitionInexistant
113NihoniumNhIndéfinieInexistant
114FléroviumFlIndéfinieInexistant
115MoscoviumMcIndéfinieInexistant
116LivermoriumLvIndéfinieInexistant
117TennesseTsIndéfinieInexistant
118OganessonOgIndéfinieInexistant
', selector1HTML: '', selector2HTML: '', selector1HTMLWithSeparator: '', selector1HTMLWithFunction: '', - datasHTMLFor1Select: '
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)
9FluorFHalogène> 100000
17ChloreClHalogène> 100000
35BromeBrHalogène> 1 et < 100 000
53IodeIHalogène> 1 et < 100 000
', - datasHTMLFor2Select:'
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)
2HéliumHeGaz noble> 1 et < 100 000
10NéonNeGaz noble> 1 et < 100 000
18ArgonArGaz noble> 1 et < 100 000
', - datasHTMLFor2SelectNone:'
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)
', - datasHTMLForSelectTagsField:'
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)Étiquettes
118OganessonOgIndéfinieInexistantExemple10
', sortingColumn1HTML: 'Z (numéro atomique)', sortingColumn2HTML: 'Symbole', - datasHTMLFor2Select1Clic: '
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)
18ArgonArGaz noble> 1 et < 100 000
2HéliumHeGaz noble> 1 et < 100 000
10NéonNeGaz noble> 1 et < 100 000
', - datasHTMLFor2Select2Clic: '
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)
10NéonNeGaz noble> 1 et < 100 000
2HéliumHeGaz noble> 1 et < 100 000
18ArgonArGaz noble> 1 et < 100 000
', selectorForPagination: '', selectorForPages: '', firstLineForPageSelection1:"51AntimoineSbMétalloïde> 1 et < 100 000", diff --git a/tests/freeDatas2HTMLSpec.ts b/tests/freeDatas2HTMLSpec.ts index da411da..d5619eb 100644 --- a/tests/freeDatas2HTMLSpec.ts +++ b/tests/freeDatas2HTMLSpec.ts @@ -1,4 +1,4 @@ -import { FreeDatas2HTML, Selector } from "../src/freeDatas2HTML"; +import { FreeDatas2HTML, Render} from "../src/freeDatas2HTML"; const errors=require("../src/errors.js"); const fixtures=require("./fixtures.js"); @@ -134,10 +134,8 @@ describe("Test du script central de FreeDatas2HTML", () => 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 () => + it("Doit générer une erreur si lancé sur url fournie pour le fichier de données.", async () => { - await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.converterNeedDatasElt)); - converter.datasViewElt={ id:"datas" }; await expectAsync(converter.run()).toBeRejectedWith(new Error(errors.parserNeedUrl)); }); @@ -181,8 +179,17 @@ describe("Test du script central de FreeDatas2HTML", () => 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); + const render=new Render(converter); + const htmlForDatas=render.rend2HTML(converter.parseDatas); + // On ne peut comparer directement au contenu du DOM, + // car le navigateur change certains caractères (exemple : ">" devient ">") + expect(converter.datasHTML).toEqual(htmlForDatas); + // Mais le code commence tout de même par : + const txtDatasViewsElt=document.getElementById("datas").innerHTML; + expect(txtDatasViewsElt.indexOf("
")).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 () => @@ -194,7 +201,5 @@ describe("Test du script central de FreeDatas2HTML", () => let txtDatasViewsElt=document.getElementById("counter").innerHTML; expect(txtDatasViewsElt).toEqual("118"); }); - }); - }); \ No newline at end of file diff --git a/tests/paginationSpec.ts b/tests/paginationSpec.ts index dee8634..78f799d 100644 --- a/tests/paginationSpec.ts +++ b/tests/paginationSpec.ts @@ -85,7 +85,7 @@ describe("Test de la pagination.", () => beforeEach( async () => { pagination.options={ displayElement: { id:"paginationOptions" }, values: [10,20,50,500] , name: "Choix de pagination :" }; - pagination.selectedValue=10; // revoir car n'est pas testé si déclaré avant les options + pagination.selectedValue=10; pagination.rend2HTML(); converter.pagination=pagination; await converter.run(); @@ -102,6 +102,18 @@ describe("Test de la pagination.", () => expect(getTR.length).toEqual(pagination.selectedValue+1); // 1er TR sert aux titres }); + it("La manipulation du sélecteur de pagination doit appeler la fonction actualisant l'affichage.", () => + { + spyOn(converter, "refreshView"); + let selectElement=document.getElementById("freeDatas2HTMLPaginationSelector") as HTMLInputElement; + selectElement.value="2"; + selectElement.dispatchEvent(new Event('change')); + expect(converter.refreshView).toHaveBeenCalledTimes(1); + selectElement.value="0"; + selectElement.dispatchEvent(new Event('change')); + expect(converter.refreshView).toHaveBeenCalledTimes(2); + }); + it("Si une des options de pagination fournies est sélectionnée, doit afficher le nombre de résultats correspondants.", () => { let selectElement=document.getElementById("freeDatas2HTMLPaginationSelector") as HTMLInputElement; @@ -124,6 +136,18 @@ describe("Test de la pagination.", () => let selectElement=document.getElementById("pages").innerHTML; expect(selectElement).toEqual(fixtures.selectorForPages); }); + + it("La manipulation du sélecteur de pages doit appeler la fonction actualisant l'affichage.", () => + { + spyOn(converter, "refreshView"); + let selectElement=document.getElementById("freeDatas2HTMLPagesSelector") as HTMLInputElement; + selectElement.value="2"; + selectElement.dispatchEvent(new Event('change')); + expect(converter.refreshView).toHaveBeenCalledTimes(1); + selectElement.value="0"; + selectElement.dispatchEvent(new Event('change')); + expect(converter.refreshView).toHaveBeenCalledTimes(2); + }); it("Si l'utilisateur sélectionne une des pages proposées, l'affichage des résultats doit s'adapter en prenant en compte la pagination sélectionnée.", () => { @@ -143,7 +167,5 @@ describe("Test de la pagination.", () => expect(getTR[18].innerHTML).toEqual(fixtures.lastLineForPageSelection2); expect(getTR[50]).toBeUndefined(); }); - }); - }); \ No newline at end of file diff --git a/tests/selectorSpec.ts b/tests/selectorSpec.ts index b30c1a3..131c071 100644 --- a/tests/selectorSpec.ts +++ b/tests/selectorSpec.ts @@ -184,91 +184,20 @@ describe("Test des filtres de données", () => }; expect(selector.dataIsOk(data2Test)).toBeTrue(); }); - }); - describe("Action des sélecteurs en corrélation avec le convertisseur.", () => - { - beforeEach( async () => + it("La manipulation d'un sélecteur doit appeler la fonction actualisant l'affichage, y compris pour supprimer ce filtre (0).", () => { - 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" }); selector.selector2HTML(); - }); - - 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.", () => - { converter.datasSelectors=[selector]; + spyOn(converter, "refreshView"); let selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement; selectElement.value="4"; selectElement.dispatchEvent(new Event('change')); - let txtDatasViewsElt=document.getElementById("datas").innerHTML; - expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLFor1Select); + expect(converter.refreshView).toHaveBeenCalledTimes(1); 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.", () => - { - let selector2=new Selector(converter, 4, { id:"selector2" }); - selector2.selector2HTML(); - converter.datasSelectors=[selector, selector2]; - let selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement; - selectElement.value="2"; - selectElement=document.getElementById("freeDatas2HTML_selector2") 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); - }); - - 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"; - await converter.parse(); - selector=new Selector(converter, 5, { id:"selector1" }); - selector.separator="|"; - selector.selector2HTML(); - converter.datasSelectors=[selector]; - let selectElement=document.getElementById("freeDatas2HTML_selector1") 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); - }); - - it("Les filtres basés sur un séparateur peuvent fonctionner avec un autre filtre.", async () => - { - converter.datasSourceUrl="http://localhost:9876/datas/datas1+tagsfield.csv"; - await converter.parse(); - selector=new Selector(converter, 4, { id:"selector1" }); - selector.selector2HTML(); - let selector2=new Selector(converter, 5, { id:"selector2" }); - selector2.separator="|"; - selector2.selector2HTML(); - converter.datasSelectors=[selector, selector2]; - let selectElement=document.getElementById("freeDatas2HTML_selector2") 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); - selectElement=document.getElementById("freeDatas2HTML_selector1") as HTMLInputElement; - selectElement.value="1"; // doit garder la ligne - selectElement.dispatchEvent(new Event('change')); - expect(txtDatasViewsElt).toEqual(fixtures.datasHTMLForSelectTagsField); - selectElement.value="3"; // doit supprimer la ligne restant - selectElement.dispatchEvent(new Event('change')); - txtDatasViewsElt=document.getElementById("datas").innerHTML; - expect(txtDatasViewsElt).toEqual("
Z (numéro atomique)ÉlémentSymboleFamilleAbondance des éléments dans la croûte terrestre (μg/k)Étiquettes
"); + expect(converter.refreshView).toHaveBeenCalledTimes(2); }); }); }); \ No newline at end of file diff --git a/tests/sortingFieldSpec.ts b/tests/sortingFieldSpec.ts index 61be59e..240e149 100644 --- a/tests/sortingFieldSpec.ts +++ b/tests/sortingFieldSpec.ts @@ -3,7 +3,7 @@ import { FreeDatas2HTML, Selector, SortingField } from "../src/freeDatas2HTML"; const errors=require("../src/errors.js"); const fixtures=require("./fixtures.js"); -describe("Test des champs de classement.", () => +xdescribe("Test des champs de classement.", () => { let converter: FreeDatas2HTML; let sortingField: SortingField;