2021-08-30 18:06:59 +02:00
import { freeDatas2HTML } from "../src/freeDatas2HTML" ;
2021-08-05 18:23:19 +02:00
const errors = require ( "../src/errors.js" ) ;
2021-08-10 15:58:15 +02:00
const fixtures = require ( "./fixtures.js" ) ;
2021-08-05 18:23:19 +02:00
2021-08-30 18:06:59 +02:00
describe ( "freeDatas2HTML" , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-30 18:06:59 +02:00
let converter : freeDatas2HTML ;
2021-08-05 18:23:19 +02:00
2021-08-10 15:58:15 +02:00
beforeEach ( ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-30 18:06:59 +02:00
converter = new freeDatas2HTML ( ) ;
2021-08-10 15:58:15 +02:00
document . body . insertAdjacentHTML ( 'afterbegin' , fixtures . datasViewEltHTML ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-08-10 15:58:15 +02:00
afterEach ( ( ) = >
2021-08-05 18:23:19 +02:00
{
document . body . removeChild ( document . getElementById ( 'fixture' ) ) ;
} ) ;
2021-08-30 18:06:59 +02:00
it ( "Doit avoir créé une instance de freeDatas2HTML" , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-30 18:06:59 +02:00
expect ( converter ) . toBeInstanceOf ( freeDatas2HTML ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-08-12 11:39:19 +02:00
describe ( "Test des données de configuration reçues." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-10 15:58:15 +02:00
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." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-12 11:39:19 +02:00
expect ( ( ) = > { return converter . datasViewElt = { id : "dontExist" } ; } ) . toThrowError ( errors . elementNotFound + "dontExist" ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-08-10 15:58:15 +02:00
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." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-12 11:39:19 +02:00
expect ( ( ) = > { return converter . datasViewElt = { id : "datas" } ; } ) . not . toThrowError ( ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-08-12 17:43:34 +02:00
it ( "Ne doit accepter que les sélecteurs pour lesquels un élément a été trouvé dans la page pour l'id fourni." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :2 , id : "selector2" } , { datasFieldNb :3 , id : "selector3" } ] ;
2021-08-12 17:43:34 +02:00
expect ( converter . datasSelectors . length ) . toEqual ( 1 ) ;
expect ( converter . datasSelectors [ 0 ] . id ) . toEqual ( "selector2" ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-08-12 17:43:34 +02:00
it ( "Ne doit accepter que les sélecteurs pour lesquels les numéros de colonne fourrnis sont des nombres naturels." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :2.3 , id : "selector1" } , { datasFieldNb :3 , id : "selector2" } ] ;
2021-08-12 17:43:34 +02:00
expect ( converter . datasSelectors . length ) . toEqual ( 1 ) ;
expect ( converter . datasSelectors [ 0 ] . id ) . toEqual ( "selector2" ) ;
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :2 , id : "selector1" } , { datasFieldNb : - 1 , id : "selector2" } ] ;
2021-08-12 17:43:34 +02:00
expect ( converter . datasSelectors . length ) . toEqual ( 1 ) ;
expect ( converter . datasSelectors [ 0 ] . id ) . toEqual ( "selector1" ) ;
2021-08-10 15:58:15 +02:00
} ) ;
2021-09-02 18:15:15 +02:00
it ( "Ne doit accepter que les colonnes de classement pour lesquelles les numéros fournis sont des nombres naturels." , ( ) = >
{
converter . datasSortingColumns = [ { datasFieldNb :2.3 } , { datasFieldNb :3 } ] ;
expect ( converter . datasSortingColumns . length ) . toEqual ( 1 ) ;
converter . datasSortingColumns = [ { datasFieldNb :2 } , { datasFieldNb : - 1 } ] ;
expect ( converter . datasSortingColumns . length ) . toEqual ( 1 ) ;
converter . datasSortingColumns = [ { datasFieldNb :2 } , { datasFieldNb :3 } ] ;
expect ( converter . datasSortingColumns . length ) . toEqual ( 2 ) ;
} ) ;
2021-08-12 17:43:34 +02:00
2021-09-01 12:12:28 +02:00
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 ( ) ;
} ) ;
2021-08-12 17:43:34 +02:00
it ( "Doit accepter tous les sélecteurs si leurs informations sont valides." , ( ) = >
2021-08-10 15:58:15 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :0 , id : "selector1" } , { datasFieldNb :3 , id : "selector2" } ] ;
2021-08-12 17:43:34 +02:00
expect ( converter . datasSelectors . length ) . toEqual ( 2 ) ;
2021-08-10 15:58:15 +02:00
} ) ;
2021-08-12 17:43:34 +02:00
2021-08-10 15:58:15 +02:00
it ( "Doit générer une erreur si l'url fournie pour le fichier de données est vide." , ( ) = >
{
2021-08-12 11:39:19 +02:00
expect ( ( ) = > { return converter . datasSourceUrl = " " ; } ) . toThrowError ( errors . needUrl ) ;
2021-08-10 15:58:15 +02:00
} ) ;
} ) ;
2021-08-12 11:39:19 +02:00
describe ( "Parsage du fichier et création du tableau de données" , ( ) = >
2021-08-10 15:58:15 +02:00
{
it ( "Doit générer une erreur si la lecture du fichier échoue." , async ( ) = >
{
converter . datasViewElt = { id : "datas" } ;
2021-08-12 11:39:19 +02:00
converter . datasSourceUrl = "http://localhost:9876/datas/dontExist.csv" ;
2021-08-12 17:43:34 +02:00
await expectAsync ( converter . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserFail ) ) ;
2021-08-10 15:58:15 +02:00
} ) ;
it ( "Doit enregistrer la liste des erreurs rencontrées en parsant le fichier." , async ( ) = >
{
converter . datasViewElt = { id : "datas" } ;
2021-08-12 11:39:19 +02:00
converter . datasSourceUrl = "http://localhost:9876/datas/datas-errors1.csv" ;
2021-08-12 17:43:34 +02:00
await converter . parse ( ) ;
2021-08-10 15:58:15 +02:00
expect ( converter . parseErrors . length ) . toBeGreaterThan ( 0 ) ;
} ) ;
2021-08-12 18:38:09 +02:00
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 ) ;
} ) ;
2021-08-10 15:58:15 +02:00
it ( "Ne doit enregistrer aucune erreur de lecture si le fichier est ok." , async ( ) = >
{
converter . datasViewElt = { id : "datas" } ;
2021-08-12 11:39:19 +02:00
converter . datasSourceUrl = "http://localhost:9876/datas/datas1.csv" ;
2021-08-10 15:58:15 +02:00
await converter . parse ( ) ;
expect ( converter . parseErrors . length ) . toEqual ( 0 ) ;
} ) ;
2021-08-12 16:31:21 +02:00
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 ) ) ;
} ) ;
2021-08-12 11:39:19 +02:00
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" ;
2021-08-12 16:31:21 +02:00
await expectAsync ( converter . run ( ) ) . toBeResolved ( ) ;
2021-08-12 11:39:19 +02:00
} ) ;
2021-08-12 17:57:05 +02:00
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 ( ) = >
2021-08-10 15:58:15 +02:00
{
converter . datasViewElt = { id : "datas" } ;
2021-08-12 11:39:19 +02:00
converter . datasSourceUrl = "http://localhost:9876/datas/nodatas.csv" ;
2021-08-12 17:57:05 +02:00
await expectAsync ( converter . run ( ) ) . toBeRejectedWith ( new Error ( errors . datasNotFound ) ) ;
2021-08-10 15:58:15 +02:00
let txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
2021-08-12 17:57:05 +02:00
expect ( txtDatasViewsElt ) . toEqual ( "" ) ;
2021-08-12 18:38:09 +02:00
} ) ;
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 ( "" ) ;
} ) ;
2021-08-31 16:59:25 +02:00
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 ( ) = >
2021-08-12 18:38:09 +02:00
{
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 ( "" ) ;
2021-08-10 15:58:15 +02:00
} ) ;
it ( "Doit afficher un tableau correspondant aux données du fichier csv" , async ( ) = >
{
converter . datasViewElt = { id : "datas" } ;
2021-08-12 11:39:19 +02:00
converter . datasSourceUrl = "http://localhost:9876/datas/datas1.csv" ;
2021-08-10 15:58:15 +02:00
await converter . run ( ) ;
let txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( fixtures . datasHTML ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-08-12 11:39:19 +02:00
} ) ;
2021-09-02 18:15:15 +02:00
2021-08-12 11:39:19 +02:00
describe ( "Création et action des sélecteurs permettant de filter les données affichées." , ( ) = >
{
beforeEach ( ( ) = >
2021-08-11 15:24:00 +02:00
{
converter . datasViewElt = { id : "datas" } ;
2021-08-12 11:39:19 +02:00
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 ( ) = >
{
2021-09-01 12:12:28 +02:00
converter . datasSelectors = [ { datasFieldNb :0 , id : "selector1" } , { datasFieldNb :5 , id : "selector2" } ] ; // il y a bien 5 champs, mais la numérotation commence à 0 :-)
2021-08-11 15:24:00 +02:00
await expectAsync ( converter . run ( ) ) . toBeRejectedWith ( new Error ( errors . selectorFieldNotFound ) ) ;
} ) ;
2021-09-01 12:12:28 +02:00
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 ( ) = >
2021-08-11 15:24:00 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :3 , id : "selector1" } , { datasFieldNb :4 , id : "selector2" } ] ;
2021-08-11 15:24:00 +02:00
await expectAsync ( converter . run ( ) ) . not . toBeRejected ( ) ;
} ) ;
2021-09-01 12:12:28 +02:00
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 ( ) = >
2021-08-11 15:24:00 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :3 , id : "selector1" } , { datasFieldNb :4 , id : "selector2" } ] ;
2021-08-11 15:24:00 +02:00
await converter . run ( ) ;
expect ( document . getElementById ( "selector1" ) . innerHTML ) . toEqual ( fixtures . selector1HTML ) ;
expect ( document . getElementById ( "selector2" ) . innerHTML ) . toEqual ( fixtures . selector2HTML ) ;
} ) ;
2021-09-01 12:12:28 +02:00
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 ( ) = >
2021-08-11 15:24:00 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :3 , id : "selector1" } , { datasFieldNb :4 , id : "selector2" } ] ;
2021-08-11 15:24:00 +02:00
await converter . run ( ) ;
2021-08-30 18:06:59 +02:00
let selectElement = document . getElementById ( "freeDatas2HTMLSelector0" ) as HTMLInputElement ;
2021-08-11 15:24:00 +02:00
selectElement . value = "4" ;
selectElement . dispatchEvent ( new Event ( 'change' ) ) ;
let txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
2021-08-12 11:39:19 +02:00
expect ( txtDatasViewsElt ) . toEqual ( fixtures . datasHTMLFor1Select ) ;
2021-08-11 15:24:00 +02:00
selectElement . value = "0" ;
selectElement . dispatchEvent ( new Event ( 'change' ) ) ;
txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( fixtures . datasHTML ) ;
} ) ;
2021-08-11 17:25:56 +02:00
2021-08-31 16:59:25 +02:00
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 ( ) = >
2021-08-11 17:25:56 +02:00
{
2021-08-31 16:22:28 +02:00
converter . datasSelectors = [ { datasFieldNb :3 , id : "selector1" } , { datasFieldNb :4 , id : "selector2" } ] ;
2021-08-11 17:25:56 +02:00
await converter . run ( ) ;
2021-08-30 18:06:59 +02:00
let selectElement = document . getElementById ( "freeDatas2HTMLSelector0" ) as HTMLInputElement ;
2021-08-11 17:25:56 +02:00
selectElement . value = "2" ;
2021-08-30 18:06:59 +02:00
selectElement = document . getElementById ( "freeDatas2HTMLSelector1" ) as HTMLInputElement ;
2021-08-11 17:25:56 +02:00
selectElement . value = "1" ;
selectElement . dispatchEvent ( new Event ( 'change' ) ) ;
let txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
2021-08-12 11:39:19 +02:00
expect ( txtDatasViewsElt ) . toEqual ( fixtures . datasHTMLFor2Select ) ;
2021-08-11 17:25:56 +02:00
selectElement . value = "4" ;
selectElement . dispatchEvent ( new Event ( 'change' ) ) ;
txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
2021-08-12 11:39:19 +02:00
expect ( txtDatasViewsElt ) . toEqual ( fixtures . datasHTMLFor2SelectNone ) ;
2021-08-11 17:25:56 +02:00
} ) ;
2021-09-01 12:12:28 +02:00
// 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 ;
2021-09-01 17:54:34 +02:00
selectElement . value = "11" ; // = "Exemple10" retournant une seule ligne
2021-09-01 12:12:28 +02:00
selectElement . dispatchEvent ( new Event ( 'change' ) ) ;
let txtDatasViewsElt = document . getElementById ( "datas" ) . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( fixtures . datasHTMLForSelectTagsField ) ;
} ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-09-02 18:15:15 +02:00
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 ) ;
} ) ;
} ) ;
2021-08-05 18:23:19 +02:00
} ) ;