2021-10-18 17:32:54 +02:00
import { ParserForHTML as Parser } from "../src/ParserForHTML" ;
2021-10-13 12:41:34 +02:00
const errors = require ( "../src/errors.js" ) ;
const fixtures = require ( "./fixtures.js" ) ;
describe ( "Tests du parseur HTML" , ( ) = >
{
let parser : Parser , datasElt : HTMLElement ;
beforeEach ( ( ) = >
{
parser = new Parser ( ) ;
document . body . insertAdjacentHTML ( 'afterbegin' , "<div id='datas'></div>" ) ;
datasElt = document . getElementById ( "datas" ) ;
} ) ;
afterEach ( ( ) = >
{
document . body . removeChild ( document . getElementById ( "datas" ) ) ;
} ) ;
it ( "Doit avoir créé une instance du parseur." , ( ) = >
{
expect ( parser ) . toBeInstanceOf ( Parser ) ;
2021-10-19 11:46:35 +02:00
expect ( parser . datasRemoteSource . url ) . toEqual ( "" ) ;
2021-10-13 12:41:34 +02:00
} ) ;
2021-10-19 11:46:35 +02:00
it ( "Ne doit pas accepter de valeurs vides pour les sélecteurs CSS." , ( ) = >
2021-10-13 12:41:34 +02:00
{
expect ( ( ) = > { return parser . fieldsSelector = "" ; } ) . toThrowError ( errors . parserSelectorsIsEmpty ) ;
expect ( ( ) = > { return parser . rowsSelector = " " ; } ) . toThrowError ( errors . parserSelectorsIsEmpty ) ;
expect ( ( ) = > { return parser . datasSelector = " " ; } ) . toThrowError ( errors . parserSelectorsIsEmpty ) ;
} ) ;
describe ( "Accès à des données distantes." , ( ) = >
{
it ( "Doit générer une erreur, si l'accès aux données distantes ne fonctionne pas." , async ( ) = >
{
parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas.htm" } ) ; // une seule lettre vous manque...
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserRemoteFail ) ) ;
} ) ;
it ( "Si le parseur est appelé avec une url correcte, le DOM du document distant doit être enregistré." , async ( ) = >
{
parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas.html" } ) ;
await parser . parse ( ) ;
const parserDOM = new DOMParser ( ) ;
const htmlString = "<html><head></head><body><table><thead><tr><th>Champ 1</th><th>Champ 2</th></tr></thead></table></body></html>" ;
const doc = parserDOM . parseFromString ( htmlString , "text/html" ) ;
expect ( parser . document2Parse ) . toEqual ( doc ) ;
} ) ;
2021-10-19 11:46:35 +02:00
it ( "Si des options de connexion distante sont fournies, elles doivent être utilisées." , async ( ) = >
{
spyOn ( window , "fetch" ) . and . callThrough ( ) ;
parser . setRemoteSource ( { url : "http://localhost:9876/datas/datas.html" , headers : [ { key : "token" , value : "1234" } , { key : "userName" , value : "Toto" } ] , withCredentials :true } ) ;
await parser . parse ( ) ;
const headers = new Headers ( ) ;
headers . append ( "token" , "1234" ) ;
headers . append ( "userName" , "Toto" ) ;
expect ( window . fetch ) . toHaveBeenCalledWith ( "http://localhost:9876/datas/datas.html" , { method : "GET" , headers : headers , credentials : "include" } ) ;
} ) ;
2021-10-13 12:41:34 +02:00
} ) ;
describe ( "Extraction des données du document." , ( ) = >
{
it ( "Doit générer une erreur si aucun élément n'est trouvé dans le document pour les sélecteurs CSS fournis pour les noms de champs." , async ( ) = >
{
2021-10-19 11:46:35 +02:00
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserElementsNotFound + "table > thead > tr > th" ) ) ; // = valeurs par défaut, mais rien dans le DOM
2021-10-13 12:41:34 +02:00
datasElt . innerHTML = fixtures . htmlParserDatas ;
await expectAsync ( parser . parse ( ) ) . not . toBeRejectedWith ( new Error ( errors . parserElementsNotFound + "table > thead > tr > th" ) ) ;
parser . fieldsSelector = "ul#dontExist > li" ; // n'existe pas dans ce qui a été injecté
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserElementsNotFound + "ul#dontExist > li" ) ) ;
} ) ;
2021-10-19 11:46:35 +02:00
it ( "Les noms de champ vides ou en doublon doivent être ignorés et les erreurs reportées." , async ( ) = >
2021-10-13 12:41:34 +02:00
{
datasElt . innerHTML = "<ul><li>Champ1</li><li> </li><li>Champ2</li><li>Champ2</li></ul>" ;
parser . fieldsSelector = "ul > li" ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "Champ1" , "Champ2" ] ) ;
2021-10-19 11:46:35 +02:00
expect ( parser . parseResults . errors ) . toEqual ( [ { row : - 1 , message : errors.parserFieldNameFail } , { row : - 1 , message : errors.parserFieldNameFail } ] ) ;
2021-10-13 12:41:34 +02:00
} ) ;
2021-10-19 11:46:35 +02:00
it ( "Doit générer une erreur, si aucun nom de champ valide n'est trouvé dans le document." , async ( ) = >
2021-10-13 12:41:34 +02:00
{
2021-10-19 11:46:35 +02:00
datasElt . innerHTML = "<ul><li> </li><li> </li></ul>" ;
2021-10-13 12:41:34 +02:00
parser . fieldsSelector = "ul > li" ;
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserFieldsNotFound ) ) ;
} ) ;
it ( "Les espaces entourant les noms de champs doivent être supprimés." , async ( ) = >
{
datasElt . innerHTML = fixtures . htmlParserDatas ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "Z (numéro atomique)" , "Élément" , "Symbole" , "Famille" , "Mots-clés" ] ) ;
} ) ;
it ( "Si des champs en trop sont trouvés dans une ligne de données, ils doivent être ignorés. Idem pour les champs absents. Ces anomalies doivent être reportées." , async ( ) = >
{
datasElt . innerHTML = fixtures . htmlParserDatasBadFields ; // un "td" manquant en ligne 0 et un en trop en ligne 1
await parser . parse ( ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { "Z (numéro atomique)" : "1" , "Élément" : "Hydrogène" , Symbole : "H" , Famille : "Non-métal" } , { "Z (numéro atomique)" : "2" , "Élément" : "Hélium" , Symbole : "He" , Famille : "Gaz noble" , "Mots-clés" : "Mot-clé2" } , { "Z (numéro atomique)" : "3" , "Élément" : "Lithium" , Symbole : "Li" , Famille : "Métal alcalin" , "Mots-clés" : "Mot-clé2,Mot-clé1" } , { "Z (numéro atomique)" : "4" , "Élément" : "Béryllium" , Symbole : "Be" , Famille : "Métal alcalino-terreux" , "Mots-clés" : "Mot-clé3" } ] ) ;
2021-10-19 11:46:35 +02:00
expect ( parser . parseResults . errors [ 0 ] ) . toEqual ( { row :0 , message :errors.parserNumberOfFieldsFail } ) ;
expect ( parser . parseResults . errors [ 1 ] ) . toEqual ( { row :1 , message :errors.parserNumberOfFieldsFail } ) ;
2021-10-13 12:41:34 +02:00
} ) ;
it ( "Le fait qu'aucune donnée ne soit trouvée ne doit pas générer une erreur." , async ( ) = >
{
2021-10-19 11:46:35 +02:00
datasElt . innerHTML = "<table><thead><tr><th>Champ1</th><th>Champ2</th></tr></thead></table>" ;
2021-10-13 12:41:34 +02:00
await expectAsync ( parser . parse ( ) ) . toBeResolved ( ) ;
} ) ;
it ( "Une ligne n'ayant aucune donnée sera ignorée et l'erreur reportée. Les valeurs vides sont par contre acceptées." , async ( ) = >
{
datasElt . innerHTML = fixtures . htmlParserDatasEmptyLine ; // avant dernière ligne sans "td", "Mots-clé" vide pour la 1ière ligne.
await parser . parse ( ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { "Z (numéro atomique)" : "1" , "Élément" : "Hydrogène" , Symbole : "H" , Famille : "Non-métal" , "Mots-clés" : "" } , { "Z (numéro atomique)" : "2" , "Élément" : "Hélium" , Symbole : "He" , Famille : "Gaz noble" , "Mots-clés" : "Mot-clé2" } , { "Z (numéro atomique)" : "3" , "Élément" : "Lithium" , Symbole : "Li" , Famille : "Métal alcalin" , "Mots-clés" : "Mot-clé2,Mot-clé1" } , { "Z (numéro atomique)" : "4" , "Élément" : "Béryllium" , Symbole : "Be" , Famille : "Métal alcalino-terreux" , "Mots-clés" : "Mot-clé3" } ] ) ;
2021-10-19 11:46:35 +02:00
expect ( parser . parseResults . errors [ 1 ] ) . toEqual ( { row :3 , message :errors.parserLineWithoutDatas } ) ; // errors[0] = erreur nombre de champs 1ère ligne
2021-10-13 12:41:34 +02:00
} ) ;
it ( "Si le code HTML fourni est ok, aucune erreur de lecture ne doit être reportée." , async ( ) = >
{
datasElt . innerHTML = fixtures . htmlParserDatas ;
await parser . parse ( ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { "Z (numéro atomique)" : "1" , "Élément" : "Hydrogène" , Symbole : "H" , Famille : "Non-métal" , "Mots-clés" : "" } , { "Z (numéro atomique)" : "2" , "Élément" : "Hélium" , Symbole : "He" , Famille : "Gaz noble" , "Mots-clés" : "Mot-clé2" } , { "Z (numéro atomique)" : "3" , "Élément" : "Lithium" , Symbole : "Li" , Famille : "Métal alcalin" , "Mots-clés" : "Mot-clé2,Mot-clé1" } , { "Z (numéro atomique)" : "4" , "Élément" : "Béryllium" , Symbole : "Be" , Famille : "Métal alcalino-terreux" , "Mots-clés" : "Mot-clé3" } ] ) ;
expect ( parser . parseResults . errors . length ) . toEqual ( 0 ) ;
} ) ;
} ) ;
} ) ;