2021-09-27 17:29:58 +02:00
import { FreeDatas2HTML , Render } 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-10-01 13:12:45 +02:00
/// Tests à revoir pour ne pas dépendre du bon fonctionnement de Parser et Render.
2021-09-30 12:52:33 +02:00
2021-09-21 17:46:04 +02:00
describe ( "Test du script central de FreeDatas2HTML" , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-09-17 18:02:45 +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-10-11 16:44:20 +02:00
converter = new FreeDatas2HTML ( "CSV" ) ;
converter . parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas1.csv" } ) ;
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-09-17 18:02:45 +02:00
it ( "Doit avoir créé une instance de FreeDatas2HTML" , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-09-17 18:02:45 +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-09-22 12:29:43 +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." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-09-22 12:29:43 +02:00
expect ( ( ) = > { return FreeDatas2HTML . checkInDOMById ( { id : "dontExist" } ) ; } ) . toThrowError ( errors . converterElementNotFound + "dontExist" ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-09-22 12:29:43 +02:00
it ( "S'il y a bien un élément dans la page pour l'id fourni, doit retourner l'élement DOM complété." , ( ) = >
2021-08-05 18:23:19 +02:00
{
2021-09-22 12:29:43 +02:00
const eltInDOM = document . getElementById ( "datas" ) ;
const checkElt = FreeDatas2HTML . checkInDOMById ( { id : "datas" } ) ;
expect ( checkElt ) . toEqual ( { id : "datas" , eltDOM : eltInDOM } ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
2021-09-22 16:25:10 +02:00
it ( "Doit retourner false si un numéro de champ n'est pas trouvé dans les données." , async ( ) = >
{
2021-09-30 12:52:33 +02:00
let check = converter . checkFieldExist ( 2 ) ; // aucune donnée chargée, donc le champ ne peut être trouvé
2021-09-22 16:25:10 +02:00
expect ( check ) . toBeFalse ( ) ;
2021-09-30 12:52:33 +02:00
await converter . run ( ) ;
2021-09-22 16:25:10 +02:00
check = converter . checkFieldExist ( - 2 ) ;
expect ( check ) . toBeFalse ( ) ;
check = converter . checkFieldExist ( 1.1 ) ;
expect ( check ) . toBeFalse ( ) ;
check = converter . checkFieldExist ( 10 ) ;
expect ( check ) . toBeFalse ( ) ;
} ) ;
2021-09-30 12:52:33 +02:00
it ( "Doit retourner true si un numéro de champ est bien trouvé dans les données." , async ( ) = >
2021-09-22 16:25:10 +02:00
{
2021-09-30 12:52:33 +02:00
await converter . run ( ) ;
2021-09-22 16:25:10 +02:00
let check = converter . checkFieldExist ( 0 ) ;
expect ( check ) . toBeTrue ( ) ;
check = converter . checkFieldExist ( 2 ) ;
expect ( check ) . toBeTrue ( ) ;
} ) ;
2021-09-30 12:52:33 +02:00
2021-09-22 16:25:10 +02:00
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
2021-10-11 16:44:20 +02:00
converter = new FreeDatas2HTML ( "CSV" ) ;
converter . parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas1.csv" } ) ;
2021-09-30 12:52:33 +02:00
await converter . run ( ) ;
expect ( ( ) = > { return converter . datasSortingFunctions = [ { datasFieldNb :10 , sort :simpleSort } ] ; } ) . toThrowError ( errors . converterFieldNotFound ) ;
2021-09-22 16:25:10 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
it ( "Doit accepter la fonction associée à un champ, de manière à ce qu'elle soit utilisable pour comparer deux valeurs." , async ( ) = >
2021-09-06 17:25:30 +02:00
{
const simpleSort = ( a : any , b : any ) = >
{
if ( a < b )
return 1 ;
else if ( a > b )
return - 1 ;
else
return 0 ;
} ;
2021-09-30 12:52:33 +02:00
await converter . run ( ) ;
2021-09-06 17:25:30 +02:00
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 ] ) ;
} ) ;
2021-08-10 15:58:15 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
describe ( "Affichage des données reçues." , ( ) = >
2021-08-10 15:58:15 +02:00
{
2021-09-30 12:52:33 +02:00
it ( "Doit générer une erreur si des données n'ont pas été importées." , async ( ) = >
2021-08-10 15:58:15 +02:00
{
2021-09-30 12:52:33 +02:00
// 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);
2021-08-10 15:58:15 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
it ( "Doit générer une erreur si l'élément du DOM où afficher les données est inconnu." , async ( ) = >
2021-08-10 15:58:15 +02:00
{
2021-09-30 12:52:33 +02:00
await converter . run ( ) ;
expect ( ( ) = > { return converter . refreshView ( ) ; } ) . toThrowError ( errors . converterRefreshFail ) ;
2021-08-12 16:31:21 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
it ( "Ne doit pas générer d'erreur si les informations nécessaires sont ok." , async ( ) = >
2021-08-12 11:39:19 +02:00
{
converter . datasViewElt = { id : "datas" } ;
2021-09-30 12:52:33 +02:00
await converter . run ( ) ;
expect ( ( ) = > { return converter . refreshView ( ) ; } ) . not . toThrowError ( ) ;
2021-08-12 11:39:19 +02:00
} ) ;
2021-08-12 18:38:09 +02:00
2021-09-30 12:52:33 +02:00
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 ( ) = >
2021-08-12 18:38:09 +02:00
{
2021-10-11 16:44:20 +02:00
converter = new FreeDatas2HTML ( "CSV" ) ;
converter . parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas-errors1.csv" } ) ;
2021-08-12 18:38:09 +02:00
converter . stopIfParseErrors = true ;
2021-09-30 12:52:33 +02:00
await expectAsync ( converter . run ( ) ) . toBeRejectedWith ( new Error ( errors . parserMeetErrors ) ) ;
2021-08-12 18:38:09 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
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 ( ) = >
2021-08-12 18:38:09 +02:00
{
converter . datasViewElt = { id : "datas" } ;
2021-10-11 16:44:20 +02:00
converter = new FreeDatas2HTML ( "CSV" ) ;
converter . parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas-errors1.csv" } ) ;
2021-09-30 12:52:33 +02:00
await expectAsync ( converter . run ( ) ) . toBeResolved ( ) ;
2021-08-10 15:58:15 +02:00
} ) ;
2021-09-30 12:52:33 +02:00
/// Plutôt pour tester Render
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" } ;
await converter . run ( ) ;
2021-09-27 17:29:58 +02:00
const render = new Render ( converter ) ;
2021-09-30 12:52:33 +02:00
const htmlForDatas = render . rend2HTML ( converter . datas ) ;
2021-09-27 17:29:58 +02:00
// 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 <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 ) ;
2021-08-05 18:23:19 +02:00
} ) ;
2021-09-23 11:28:27 +02:00
it ( "Si demandé, doit afficher le nombre de lignes de données du fichier." , async ( ) = >
{
2021-09-30 12:52:33 +02:00
converter . datasViewElt = { id : "datas" } ;
2021-09-23 11:28:27 +02:00
converter . datasCounter = { id : "counter" } ;
await converter . run ( ) ;
let txtDatasViewsElt = document . getElementById ( "counter" ) . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( "118" ) ;
} ) ;
2021-08-12 11:39:19 +02:00
} ) ;
2021-10-19 15:40:47 +02:00
/ * d e s c r i b e ( " A c t i o n d e s c h a m p s d e c l a s s e m e n t e n c o r r é l a t i o n a v e c l e c o n v e r t i s s e u r . " , ( ) = >
{
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 ( ) = >
{
let sortingField = new SortingField ( converter , 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 ( "<td>89</td><td>Actinium</td><td>Ac</td><td>Actinide</td><td>≤ 1</td>" ) ;
getTHLink . click ( ) ; // tri descendant
getTR = document . querySelectorAll ( "tr" ) ;
txtDatasViewsElt = getTR [ 1 ] . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( "<td>40</td><td>Zirconium</td><td>Zr</td><td>Métal de transition</td><td>> 100000</td>" ) ;
getTHLink . click ( ) ; // de nouveau ascendant
getTR = document . querySelectorAll ( "tr" ) ;
txtDatasViewsElt = getTR [ 1 ] . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( "<td>89</td><td>Actinium</td><td>Ac</td><td>Actinide</td><td>≤ 1</td>" ) ;
} ) ;
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 } ] ;
let sortingField = new SortingField ( converter , 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 ( "<td>95</td><td>Américium</td><td>Am</td><td>Actinide</td><td>Inexistant</td>" ) ;
getTHLink . click ( ) ; // tri descendant
getTR = document . querySelectorAll ( "tr" ) ;
txtDatasViewsElt = getTR [ 1 ] . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( "<td>1</td><td>Hydrogène</td><td>H</td><td>Non-métal</td><td>> 100000</td>" ) ;
getTHLink . click ( ) ; // de nouveau ascendant
getTR = document . querySelectorAll ( "tr" ) ;
txtDatasViewsElt = getTR [ 1 ] . innerHTML ;
expect ( txtDatasViewsElt ) . toEqual ( "<td>95</td><td>Américium</td><td>Am</td><td>Actinide</td><td>Inexistant</td>" ) ;
} ) ;
} ) ; * /
2021-09-30 12:52:33 +02:00
2021-08-05 18:23:19 +02:00
} ) ;