2021-10-06 16:54:20 +02:00
import { ParserForJSON as Parser } from "../src/freeDatas2HTMLParserForJSON" ;
const errors = require ( "../src/errors.js" ) ;
describe ( "Tests du parseur de JSON" , ( ) = >
{
let parser : Parser ;
beforeEach ( ( ) = >
{
parser = new Parser ( ) ;
} ) ;
it ( "Doit avoir créé une instance du Parser" , ( ) = >
{
expect ( parser ) . toBeInstanceOf ( Parser ) ;
} ) ;
it ( "Doit générer une erreur si la chaîne de données à parser est vide." , ( ) = >
{
2021-10-11 16:44:20 +02:00
expect ( ( ) = > { return parser . datas2Parse = "" } ) . toThrowError ( errors . parserNeedDatas ) ;
expect ( ( ) = > { return parser . datas2Parse = " " } ) . toThrowError ( errors . parserNeedDatas ) ;
2021-10-06 16:54:20 +02:00
} ) ;
it ( "Doit accepter toute chaîne de caractères non vide pour les données à parser." , ( ) = >
{
parser . datas2Parse = "datas" ;
expect ( parser . datas2Parse ) . toEqual ( "datas" ) ;
} ) ;
it ( "Doit générer une erreur si le parseur est lancé sans source de données fournie." , async ( ) = >
{
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserNeedSource ) ) ;
} ) ;
it ( "Si le parseur a été appelé avec des données correctes, des résultats doivent être enregistrés." , async ( ) = >
{
parser . datas2Parse = ` [{ "nom": "dugenoux"},{ "nom": "dupont"}] ` ;
await parser . parse ( ) ;
expect ( parser . parseResults ) . not . toBeUndefined ( ) ;
} ) ;
describe ( "Accès à des données distantes." , ( ) = >
2021-10-11 16:44:20 +02:00
{
2021-10-06 16:54:20 +02:00
it ( "Doit générer une erreur, si l'accès aux données distantes est défaillant." , async ( ) = >
{
2021-10-11 16:44:20 +02:00
parser . setRemoteSource ( { url : "http://localhost:9876/datas/posts.jso" } ) ; // une seule lettre vous manque...
2021-10-06 16:54:20 +02:00
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserRemoteFail ) ) ;
} ) ;
it ( "Si le parseur a été appelé avec une url fournissant des données correctes, des résultats doivent être enregistrés." , async ( ) = >
{
2021-10-11 16:44:20 +02:00
parser . setRemoteSource ( { url : "http://localhost:9876/datas/posts.json" } ) ;
2021-10-06 16:54:20 +02:00
await parser . parse ( ) ;
expect ( parser . parseResults ) . not . toBeUndefined ( ) ;
} ) ;
} ) ;
describe ( "Noms des champs et données fournies dans deux tableaux distincts." , ( ) = >
{
it ( "Les valeurs fournies pour les champs doivent être des chaînes de caractères." , ( ) = >
{
const fields = [ "nom" , 24 , "prénom" , true , { field : "champ" } , "âge" , [ "je suis un nom de champ" ] ] ;
expect ( Parser . trimAllFields ( fields ) ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
} ) ;
it ( "Les espaces entourant les noms de champs doivent être supprimés." , ( ) = >
{
const fields = [ " nom" , "prénom " , " âge " ] ;
expect ( Parser . trimAllFields ( fields ) ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
} ) ;
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." , async ( ) = >
{
parser . datas2Parse = ` { "fields": ["nom","prénom", "âge"], "datas": [["dugenoux","henri",25,"je me champ en trop"],["michu","mariette"]] } ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "prénom" : "henri" , "âge" : "25" } , { nom : "michu" , "prénom" : "mariette" } ] ) ;
} ) ;
it ( "Si certaines des données fournies ont un type non accepté, elles doivent être ignorées et les erreurs doivent être reportées." , async ( ) = >
{
parser . datas2Parse = ` { "fields": ["nom","prénom", "âge"], "datas": [["dugenoux",{ "prenom":"henri"},25],["michu","mariette",null]] } ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "âge" : "25" } , { nom : "michu" , "prénom" : "mariette" } ] ) ;
expect ( parser . parseResults . errors [ 0 ] ) . toEqual ( { row :0 , message :errors.parserTypeError + "object" } ) ;
expect ( parser . parseResults . errors [ 1 ] ) . toEqual ( { row :1 , message :errors.parserTypeError + "object" } ) ;
} ) ;
it ( "Un enregistrement n'ayant aucune donnée valide sera ignoré." , async ( ) = >
{
parser . datas2Parse = ` { "fields": ["nom","prénom", "âge"], "datas": [["dugenoux","henri",25],[null,{ "prenom":"mariette"},[58]]] } ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "prénom" : "henri" , "âge" : "25" } ] ) ;
} ) ;
it ( "Si toutes les données fournies sont ok, on doit les retrouver en résultat." , async ( ) = >
{
parser . datas2Parse = ` { "fields": ["nom","prénom", "âge"], "datas": [["dugenoux","henri",25],["michu","mariette",58]] } ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "prénom" : "henri" , "âge" : "25" } , { nom : "michu" , "prénom" : "mariette" , "âge" : "58" } ] ) ;
} ) ;
} ) ;
describe ( "Données fournies sous forme de tableau d'objets." , ( ) = >
{
it ( "Les espaces entourant les noms de champs doivent être supprimés." , async ( ) = >
{
parser . datas2Parse = ` [{"nom ":"dugenoux"," prénom":"henri"," âge ":25},{"nom":"michu","prénom":"mariette","âge":58}] ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
} ) ;
it ( "Si certaines des données fournies ont un type non accepté, elles doivent être ignorées ainsi que leur attribut. Et les erreurs doivent être reportées." , async ( ) = >
{
parser . datas2Parse = ` [{"nom":"dugenoux","prénom":{"value":"henri"},"âge":25},{"âge":"58","nom":"michu","prénom":"mariette","pseudo":["madame Michu"]}] ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "âge" , "prénom" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "âge" : "25" } , { "âge" : "58" , nom : "michu" , "prénom" : "mariette" } ] ) ;
expect ( parser . parseResults . errors [ 0 ] ) . toEqual ( { row :0 , message :errors.parserTypeError + "object" } ) ;
expect ( parser . parseResults . errors [ 1 ] ) . toEqual ( { row :1 , message :errors.parserTypeError + "object" } ) ;
} ) ;
it ( "Un enregistrement n'ayant aucune donnée valide doit être ignoré." , async ( ) = >
{
parser . datas2Parse = ` [{"nom":["dugenoux"],"prénom":{"value":"henri"},"âge":null},{"nom":"michu","prénom":"mariette","âge":58}] ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "michu" , "prénom" : "mariette" , "âge" : "58" } ] ) ;
} ) ;
it ( "Si toutes les données fournies sont ok, on doit les retrouver en résultat." , async ( ) = >
{
parser . datas2Parse = ` [{"nom":"dugenoux","prénom":"henri","âge":25},{"nom":"michu","prénom":"mariette","âge":58}] ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "prénom" : "henri" , "âge" : "25" } , { nom : "michu" , "prénom" : "mariette" , "âge" : "58" } ] ) ;
// Tous les objets n'ont pas forcément les mêmes attributs, ni dans le même ordre
parser . datas2Parse = ` [{"nom":"dugenoux","prénom":"henri","âge":"25"},{"âge":"58","nom":"michu","pseudo":"madame Michu"}] ` ;
await parser . parse ( ) ;
expect ( parser . parseResults . fields ) . toEqual ( [ "nom" , "prénom" , "âge" , "pseudo" ] ) ;
expect ( parser . parseResults . datas ) . toEqual ( [ { nom : "dugenoux" , "prénom" : "henri" , "âge" : "25" } , { "âge" : "58" , nom : "michu" , pseudo : "madame Michu" } ] ) ;
} ) ;
} ) ;
it ( "Doit générer une erreur si les champs n'ont pas été trouvés dans les données." , async ( ) = >
{
parser . datas2Parse = ` { "field": [" nom","prénom ", " âge "], "datas": [["dugenoux","henri","25"]] } ` ; // manque un "s" à fields :)
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserFail ) ) ;
parser . datas2Parse = ` [{" ":"dugenoux"," ":"henri"},{" ":"michu"," ":" "}] ` ;
await expectAsync ( parser . parse ( ) ) . toBeRejectedWith ( new Error ( errors . parserFail ) ) ;
} ) ;
} ) ;