diff --git a/VERSION b/VERSION index f8a696c8..661e7aea 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.7.2 +1.7.3 diff --git a/apptax/taxonomie/routesbibnoms.py b/apptax/taxonomie/routesbibnoms.py index b2ab81c0..00ec6ef0 100644 --- a/apptax/taxonomie/routesbibnoms.py +++ b/apptax/taxonomie/routesbibnoms.py @@ -115,8 +115,6 @@ def getOne_bibtaxonsInfo(cd_nom): - id_attribut(integer): id_attribut (Possibilité de passer plusiers id_attribut) """ - params = dict(request.args) - # Récupération du cd_ref à partir du cd_nom cd_ref = db.session.query(Taxref.cd_ref).filter_by(cd_nom=cd_nom).first() obj = {} @@ -125,17 +123,17 @@ def getOne_bibtaxonsInfo(cd_nom): obj["attributs"] = [] q = db.session.query(CorTaxonAttribut).filter_by(cd_ref=cd_ref) join_on_bib_attr = False - if "id_theme" in params: + if "id_theme" in request.args.keys() : q = q.join( BibAttributs, BibAttributs.id_attribut == CorTaxonAttribut.id_attribut - ).filter(BibAttributs.id_theme.in_(params["id_theme"])) + ).filter(BibAttributs.id_theme.in_( request.args.getlist("id_theme") )) join_on_bib_attr = True - if "id_attribut" in params: + if "id_attribut" in request.args.keys() : if not join_on_bib_attr: q = q.join( BibAttributs, BibAttributs.id_attribut == CorTaxonAttribut.id_attribut ) - q = q.filter(BibAttributs.id_attribut.in_(params["id_attribut"])) + q = q.filter(BibAttributs.id_attribut.in_( request.args.getlist("id_attribut") )) bibAttr = q.all() for attr in bibAttr: o = dict(attr.as_dict().items()) @@ -144,7 +142,6 @@ def getOne_bibtaxonsInfo(cd_nom): theme = db.session.query(BibThemes).filter_by(id_theme=id).first() o["nom_theme"] = theme.as_dict()["nom_theme"] obj["attributs"].append(o) - # Ajout des medias medias = db.session.query(TMedias).filter_by(cd_ref=cd_ref).all() obj["medias"] = [] @@ -154,7 +151,6 @@ def getOne_bibtaxonsInfo(cd_nom): obj["medias"].append(o) return obj - @adresses.route("/simple/", methods=["GET"]) @json_resp def getOneSimple_bibtaxons(id_nom): diff --git a/data/scripts/import_inpn_media/README.rst b/data/scripts/import_inpn_media/README.rst index 6c1339ca..c85d6917 100644 --- a/data/scripts/import_inpn_media/README.rst +++ b/data/scripts/import_inpn_media/README.rst @@ -1,30 +1,40 @@ -Exemple d'utilisation de la fonctionnalité importer médias depuis INPN +Script d'import des médias de l'INPN +==================================== + +| Exemple d'utilisation de la fonctionnalité importer des médias depuis l'INPN. +| Ressources : `Connecter TaxHub à wikidata (ou l'INPN) pour en récupérer les médias `_ + Configuration -============= +------------- -Modifier le fichier ``config.py``, en le créant à partir du fichier ``config.py.sample`` +Modifier le fichier ``config.py``, en le créant à partir du fichier ``config.py.sample`` : ``cp config.py.sample config.py`` ``SQLALCHEMY_DATABASE_URI`` = Chaine de connexion à la base de données ``QUERY_SELECT_CDREF`` = Requete SQL permettant de sélectionner les cd_ref -Usage -===== +Installation +------------ -* Créer environnement Python : +* Dans un terminal, se placer dans le dossier du script puis créer l'environnement virtuel Python 3 : :: virtualenv -p /usr/bin/python3 venv + # Alternative : python3 -m venv venv source venv/bin/activate pip install psycopg2 pip install requests deactivate -* Lancer le script : + +Usage +----- + +Lancer le script : :: @@ -32,7 +42,41 @@ Usage python import_inpn_media.py deactivate -Librairies requises (à installer via pip dans un virtualenv de préférence) : +Le script ajoute toutes les photos en tant que "Photo secondaire" (*id_type = 2*). + +L'API de l'INPN ne permet pas encore (2020-09-01) d'obtenir les votes +effectués sur les images sur le site de l'INPN. Cette information pourrait +servir à sélectionner un photo principale (*id_type = 1*). + +Si vous souhaitez malgré tout ajouter une photo principale vous pouvez en sélectionner +une aléatoirement (ici le plus petit ``id_media`` pour chaque ``cd_ref``) : + +.. code-block:: sql + + WITH first_media AS ( + SELECT MIN(id_media) AS first_id_media_founded, cd_ref + FROM taxonomie.t_medias + GROUP BY cd_ref + ) + UPDATE taxonomie.t_medias AS tm + SET id_type = 1 + FROM first_media AS fm + WHERE tm.id_media = fm.first_id_media_founded + AND tm.cd_ref = fm.cd_ref ; + +Une fois l'import des médias effectué, et à fin de **rendre visible les photos sur GeoNature-atlas**, +il est nécessaire de rafraichir les données de ses vues matérialisées *atlas.vm_medias* et *atlas.vm_taxons_plus_observes* : + +:: + + REFRESH MATERIALIZED VIEW atlas.vm_medias WITH DATA ; + REFRESH MATERIALIZED VIEW atlas.vm_taxons_plus_observes WITH DATA ; + + +Dépendances +----------- + +Ce script nécessite Python 3 et les bibliothèques suivantes (à installer via pip dans un virtualenv de préférence) : - psycopg2 - requests diff --git a/data/scripts/import_inpn_media/import_inpn_media.py b/data/scripts/import_inpn_media/import_inpn_media.py index c074fba5..5959c05b 100644 --- a/data/scripts/import_inpn_media/import_inpn_media.py +++ b/data/scripts/import_inpn_media/import_inpn_media.py @@ -1,6 +1,4 @@ # coding: utf8 - - ''' Script permettant l'import de médias récupérés via l'API inpn ''' @@ -10,7 +8,7 @@ import config -# ################ + # CONSTANTES API_URL = "https://taxref.mnhn.fr/api/taxa/{}/media" @@ -42,24 +40,24 @@ class Media(): def __init__( self, - cd_ref, titre, auteur, desc_media, licence, + cd_ref, titre, nom, auteur, desc_media, licence, url ): self.cd_ref = cd_ref self.titre = titre + self.nom = nom self.auteur = auteur self.desc_media = desc_media self.licence = licence self.url = url def __repr__(self): - return "cd_ref: {}, titre: {}, url:{}".format( - self.cd_ref, self.titre, self.url + return "Nom: {}, Media: {}".format( + self.nom, self.url ) -# ################ -# FONCTIONS +# FONCTIONS def runquery(cursor, sql, params, trap=False): ''' Fonction permettant d'executer une requete @@ -80,18 +78,17 @@ def runquery(cursor, sql, params, trap=False): def process_media(cur, cd_ref, media): ''' - Fonction qui gère l'enregistrement du media - dans la base + Fonction qui gère l'enregistrement du media dans la base ''' m_obj = Media( cd_ref, titre = media['taxon']['referenceNameHtml'], + nom = media['taxon']['scientificName'], auteur = media['copyright'], desc_media = media['title'], licence = media['licence'], url = media['_links']['file']['href'] ) - print(m_obj) # Test si média existe déjà en base runquery( @@ -103,8 +100,8 @@ def process_media(cur, cd_ref, media): if nb_r[0][0] > 0: # Mise à jour au cas ou les données - # licence/légende/copyright aient changées - print('update') + # licence/légende/copyright aient changées + print(f'\t{m_obj}, Action : UPDATE') runquery( cur, QUERY_UPDATE_TMEDIA, @@ -120,8 +117,8 @@ def process_media(cur, cd_ref, media): True ) else: - # Si le média n'éxiste pas insertion en base - print('insert') + # Si le média n'existe pas insertion en base + print(f'\t{m_obj}, Action : INSERT') runquery( cur, QUERY_INSERT_TMEDIA, @@ -136,12 +133,11 @@ def process_media(cur, cd_ref, media): DB_CONNEXION.commit() -# ################ # SCRIPT try: DB_CONNEXION = psycopg2.connect(config.SQLALCHEMY_DATABASE_URI) except Exception as exp: - print("Connexion à la base impossible") + print("ERREUR : connexion à la base impossible !") quit() try: @@ -149,7 +145,7 @@ def process_media(cur, cd_ref, media): rows = runquery(cursor, config.QUERY_SELECT_CDREF, None, False) rows = cursor.fetchall() except Exception as exp: - print("Problème lors de la récupération de la liste des cd_ref") + print("ERREUR : problème lors de la récupération de la liste des cd_ref !") quit() @@ -158,15 +154,19 @@ def process_media(cur, cd_ref, media): url = API_URL.format(cd_ref[0]) r = requests.get(url) + if r.status_code != 200: + print(f"\tERREUR : l'URL {url} retourne le code HTTP {r.status_code} !") + continue + if '_embedded' in r.json(): medias = r.json()['_embedded']['media'] if not medias: - print(' no media') + print('\tERREUR : aucun media !') for media in medias: if media['taxon']['referenceId'] == cd_ref[0]: process_media(cursor, cd_ref[0], media) else: - print (" media non pris en compte car pas sur le bon taxon ", media['taxon']['id']) + print(f"\tERREUR : media non pris en compte car pas sur le bon taxon {media['taxon']['id']} !") DB_CONNEXION.close() diff --git a/docs/changelog.rst b/docs/changelog.rst index 18ed244f..210984e5 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,19 @@ CHANGELOG ========= +1.7.3 (2020-09-29) +------------------ + +**🚀 Nouveautés** + +* Ajout de tests unitaires +* Mise à jour des dépendances (``psycopg2`` et ``SQLAlchemy``) + +**🐛 Corrections** + +* Correction d'un bug sur la récupération des attributs des taxons (#235 par @jbdesbas) +* Script de récupération des médias sur INPN. Le script continue lorsqu'un appel à l'API renvoie un autre code que 200 + 1.7.2 (2020-07-03) ------------------ @@ -58,7 +71,7 @@ CHANGELOG * Vous pouvez supprimer le paramètre ``id_application`` du fichier ``constants.js`` car il n'est plus utilisé * Vous pouvez supprimer les anciennes listes de taxons qui correspondaient à des groupes utilisés par GeoNature v1 (Flore, Fonge, Vertébrés, Invertébrés, Amphibiens, Oiseaux, Poissons...) -* Exécutez le script SQL de mise à jour de la BDD (``data/update1.6.5to1.7.0.sql``) +* Exécutez le script SQL de mise à jour de la BDD (https://github.com/PnX-SI/TaxHub/blob/master/data/update1.6.5to1.7.0.sql) * Suivez la procédure standard de mise à jour de TaxHub : https://taxhub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application * Vous pouvez mettre à jour Taxref en version 13 avec la documentation et les scripts du dossier ``data/scripts/update_taxref/`` (https://github.com/PnX-SI/TaxHub/tree/master/data/scripts/update_taxref) @@ -85,7 +98,7 @@ CHANGELOG **Notes de version** -* Exécuter le script de migration SQL https://github.com/PnX-SI/TaxHub/blob/master/data/update1.6.3to1.6.4.sql +* Exécuter le script de migration SQL (https://github.com/PnX-SI/TaxHub/blob/master/data/update1.6.3to1.6.4.sql) * Suivez la procédure standard de mise à jour de TaxHub : https://taxhub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application 1.6.3 (2019-07-16) @@ -104,10 +117,9 @@ CHANGELOG **Notes de version** -* Exécuter le script de migration SQL ``data/update1.6.2to1.6.3.sql`` +* Exécuter le script de migration SQL (https://github.com/PnX-SI/TaxHub/blob/master/data/update1.6.2to1.6.3.sql) * Suivez la procédure standard de mise à jour de TaxHub : https://taxhub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application - 1.6.2 (2019-02-27) ------------------ @@ -125,7 +137,7 @@ CHANGELOG * Afin que les logs de l'application (supervisor et gunicorn) soient tous écrits au même endroit, modifier le fichier ``taxhub-service.conf`` (``sudo nano /etc/supervisor/conf.d/taxhub-service.conf``). A la ligne ``stdout_logfile``, remplacer la ligne existante par : ``stdout_logfile = /home//taxhub/var/log/taxhub-errors.log`` (en remplaçant ```` par votre utilisateur linux) * Pour ne pas avoir de conflits de sessions d'authentification entre TaxHub et GeoNature, ajouter une variable ``ID_APP`` dans le fichier de configuration ``config.py`` et y mettre l'identifiant de l'application TaxHub tel qu'il est inscrit dans la table ``utilisateurs.t_applications``. Exemple : ``ID_APP = 2`` -* Exécuter le script de migration SQL: https://github.com/PnX-SI/TaxHub/blob/1.6.2/data/update1.6.1to1.6.2.sql +* Exécuter le script de migration SQL : https://github.com/PnX-SI/TaxHub/blob/master/data/update1.6.1to1.6.2.sql * Suivez la procédure standard de mise à jour de TaxHub : https://taxhub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application 1.6.1 (2019-01-21) @@ -165,7 +177,7 @@ CHANGELOG * Exécuter la commande suivante pour ajouter l'extension PostgreSQL ``pg_trgm``, en remplaçant la variable ``$db_name`` par le nom de votre BDD : ``sudo -n -u postgres -s psql -d $db_name -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"`` * Vous pouvez adapter la configuration Apache de TaxHub pour y intégrer la redirection sans ``/`` à la fin de l'URL (https://taxhub.readthedocs.io/fr/latest/installation.html#configuration-apache) -* Exécutez le script de mise de la BDD : https://raw.githubusercontent.com/PnX-SI/TaxHub/1.6.0/data/update1.5.1to1.6.0.sql +* Exécutez le script de mise de la BDD : https://github.com/PnX-SI/TaxHub/blob/master/data/update1.5.1to1.6.0.sql * Suivez la procédure habituelle de mise à jour de TaxHub: https://taxhub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application 1.5.1 (2018-10-17) @@ -184,8 +196,7 @@ CHANGELOG **Notes de versions** * Suivez la procédure classique de mise à jour de TaxHub -* Exécutez le script de mise à jour de la BDD TaxHub ``data/update1.5.0to1.5.1.sql`` - +* Exécutez le script de mise à jour de la BDD TaxHub (https://github.com/PnX-SI/TaxHub/blob/master/data/update1.5.0to1.5.1.sql) 1.5.0 (2018-09-19) ------------------ @@ -197,7 +208,6 @@ CHANGELOG * Installation : Ajout de paramètres permettant de mieux définir les données à intégrer et séparation des scripts SQL, notamment pour ne pas imposer d'intégrer toutes les données nécéessaires à GeoNature V1 (attributs et listes) * Mise à jour de Flask (0.11.1 à 1.0.2), Jinja, psycopg2 et Werkzeug - 1.4.1 (2018-08-20) ------------------ @@ -205,7 +215,6 @@ CHANGELOG * Correction de l'enregistrement lors du peuplement d'une liste - 1.4.0 (2018-07-12) ------------------ @@ -222,10 +231,9 @@ CHANGELOG - Ajouter le mode d'authentification dans ``config.py`` (https://github.com/PnX-SI/TaxHub/blob/87fbb11d360488e97eef3a0bb68f566744c54aa6/config.py.sample#L25) - Exécutez les scripts de migration de Taxref 9 à 11 (``data/scripts/update_taxref_v11/``) en suivant les indications de https://github.com/PnX-SI/TaxHub/issues/156 -- Exécutez le script SQL de mise à jour de la BDD ``data/update1.3.2to1.4.0.sql`` +- Exécutez le script SQL de mise à jour de la BDD (https://github.com/PnX-SI/TaxHub/blob/master/data/update1.3.2to1.4.0.sql) - Suivez la procédure générique de mise à jour de l'application - 1.3.2 (2017-12-15) ------------------ @@ -251,7 +259,6 @@ CHANGELOG - Exécutez le script SQL de mise à jour de la BDD ``data/update1.3.1to1.3.2.sql`` - Suivez la procédure générique de mise à jour de l'application - 1.3.1 (2017-09-26) ------------------- @@ -266,7 +273,6 @@ CHANGELOG - Vous pouvez directement passer de la version 1.1.2 à la 1.3.1 mais en suivant les différentes notes de version. - Exécutez le script SQL de mise à jour de la BDD ``data/update1.3.0to1.3.1.sql`` - 1.3.0 (2017-09-20) ------------------- @@ -292,7 +298,6 @@ CHANGELOG - Lancer le script d'installation : ``./install_app.sh`` - Vous pouvez directement passer de la version 1.1.2 à la 1.3.0 mais en suivant les notes de version de la 1.2.0. - 1.2.1 (2017-07-04) ------------------ @@ -305,7 +310,6 @@ CHANGELOG - Vous pouvez directement passer de la version 1.1.2 à la 1.2.1 mais en suivant les notes de version de la 1.2.0. - 1.2.0 (2017-06-21) ------------------ @@ -364,7 +368,6 @@ CHANGELOG L'application doit être disponible à l'adresse http://monserver.ext/taxhub - 1.1.2 (2017-02-23) ------------------ @@ -385,7 +388,6 @@ L'application doit être disponible à l'adresse http://monserver.ext/taxhub - Si vous ne l'avez pas fait côté GeoNature, vous pouvez supprimer l'attribut ``Saisie`` après avoir récupéré les informations dans la nouvelle liste avec ces lignes de SQL : https://github.com/PnEcrins/GeoNature/blob/master/data/update_1.8.2to1.8.3.sql#L307-L314 - Rajoutez le paramètre ``COOKIE_AUTORENEW = True`` dans le fichier ``config.py``. - 1.1.1 (2016-12-14) ------------------ @@ -398,9 +400,9 @@ L'application doit être disponible à l'adresse http://monserver.ext/taxhub - Exécutez la procédure standard de mise à jour de l'application (http://taxhub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) - Mettre à jour la base de données - * Exécuter la commande suivante depuis la racine du projet TaxHub ``unzip data/inpn/LR_FRANCE.zip -d /tmp`` - * Exécuter le fichier ``data/update1.1.0to1.1.1.sql`` + - Exécuter la commande suivante depuis la racine du projet TaxHub ``unzip data/inpn/LR_FRANCE.zip -d /tmp`` + - Exécuter le fichier ``data/update1.1.0to1.1.1.sql`` 1.1.0 (2016-11-17) ------------------ @@ -422,20 +424,18 @@ L'application doit être disponible à l'adresse http://monserver.ext/taxhub - Meilleure articulation et cohérence avec UsersHub, GeoNature et GeoNature-atlas - Amélioration en vue d'une installation simplifiée - 1.0.0 (2016-09-06) ------------------ -Première version fonctionnelle et déployable de Taxhub (Python Flask) +Première version fonctionnelle et déployable de TaxHub (Python Flask) **Fonctionnalités** -- Visualisation de taxref +- Visualisation de Taxref - Gestion du catalogue de noms d'une structure - Association de données attributaires aux taxons d'une structure - Association de médias aux taxons d'une structure - 0.1.0 (2016-05-12) ------------------ @@ -449,7 +449,6 @@ Le MCD a été revu pour se baser sur ``taxonomie.bib_attributs`` et non plus su A suivre : Remplacement du framework Symfony (PHP) par Flask (Python) - https://github.com/PnX-SI/TaxHub/issues/70 - 0.0.1 (2015-04-01) ------------------ diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..8f9a9feb --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,4 @@ +flake8==3.7.9 +pytest==5.4.3 +pytest-flask==1.0.0 +schema==0.7.2 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 02ad5bc6..5a5b4f8c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,13 +1,13 @@ +git+https://github.com/PnX-SI/UsersHub-authentification-module@1.4.4 click==6.6 -Flask==1.1.1 +Flask-Cors==3.0.3 Flask-SQLAlchemy==2.3.2 +Flask==1.1.1 +gunicorn==20.0.4 itsdangerous==0.24 Jinja2==2.11.1 MarkupSafe==0.23 -psycopg2==2.7.5 -SQLAlchemy==1.3.3 -Werkzeug==1.0.0 -gunicorn==20.0.4 -Flask-Cors==3.0.3 -git+https://github.com/PnX-SI/UsersHub-authentification-module@1.4.3 -Pillow==7.0.0 \ No newline at end of file +Pillow==7.0.0 +psycopg2==2.8.5 +SQLAlchemy==1.3.19 +Werkzeug==1.0.0 \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..0e181690 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,2 @@ +import sys +sys.path.insert(0, '../') \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..113c6b2a --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,32 @@ +import os, logging +import pytest +import psycopg2 + +import server + + +def pytest_sessionstart(session): + """ before session.main() is called. """ + app = server.init_app() + app.config["TESTING"] = True + # push the app_context + ctx = app.app_context() + ctx.push() + logging.disable(logging.DEBUG) + + # # setup test data + # execute_script("delete_sample_data.sql") + # execute_script("sample_data.sql") + +@pytest.fixture +def app(): + app = server.init_app() + app.config["TESTING"] = True + app.config["WTF_CSRF_ENABLED"] = False + return app + + +@pytest.fixture +def client(app): + return app.test_client() + diff --git a/tests/test_taxref.py b/tests/test_taxref.py new file mode 100644 index 00000000..4cff1252 --- /dev/null +++ b/tests/test_taxref.py @@ -0,0 +1,113 @@ + +import pytest +from flask import url_for +from .utils import json_of_response +from schema import Schema, Optional, Or + + +@pytest.mark.usefixtures('client_class') +class TestAPITaxref: + schema_allnamebyListe = Schema([{ + "cd_nom": int, + "search_name": str, + "cd_ref": int, + "nom_valide": str, + "nom_vern": Or(None, str), + "lb_nom": str, + "regne": str, + "group2_inpn": str + }]) + + def test_get_allnamebyListe_routes(self): + query_string = {"limit": 10} + response = self.client.get( + url_for("taxref.get_AllTaxrefNameByListe", id_liste=100), + query_string=query_string + ) + assert response.status_code == 200 + data = json_of_response(response) + if data: + assert self.schema_allnamebyListe.is_valid(data) + + def test_get_distinct_routes(self): + response = self.client.get( + url_for("taxref.getDistinctField", field="regne") + ) + assert response.status_code == 200 + + def test_get_hierarchy_routes(self): + + query_string = {"ilike": "pla"} + response = self.client.get( + url_for("taxref.getTaxrefHierarchie", rang="KD"), + query_string=query_string + ) + assert response.status_code == 200 + response = self.client.get( + url_for("taxref.getTaxrefHierarchieBibNoms", rang="FM"), + query_string=query_string + ) + assert response.status_code == 200 + + query_string = {"ilike": "pl", "regne": "Plantae"} + response = self.client.get( + url_for("taxref.getTaxrefHierarchie", rang="FM"), + query_string=query_string + ) + assert response.status_code == 200 + response = self.client.get( + url_for("taxref.getTaxrefHierarchieBibNoms", rang="FM"), + query_string=query_string + ) + assert response.status_code == 200 + + query_string = {"ilike": "pl", "regne": "Plantae"} + + def test_searchfield_routes(self): + + query_string = {"ilike": "pla"} + response = self.client.get( + url_for("taxref.getSearchInField", field="lb_nom", ilike="poa"), + query_string=query_string + ) + assert response.status_code == 200 + + def test_taxrefDetail_routes(self): + response = self.client.get( + url_for("taxref.getTaxrefDetail", id=29708) + ) + assert response.status_code == 200 + + def test_searchTaxref_routes(self): + query_string = { + "ilike-classe": "hex", + "page": 1, + "limit": 10 + } + response = self.client.get( + url_for("taxref.getTaxrefList"), + query_string=query_string + ) + assert response.status_code == 200 + response = self.client.get( + url_for("taxref.getTaxrefBibtaxonList"), + query_string=query_string + ) + assert response.status_code == 200 + + def test_regneGroup2Inpn_routes(self): + response = self.client.get( + url_for("taxref.get_regneGroup2Inpn_taxref") + ) + assert response.status_code == 200 + + def test_bib_routes(self): + response = self.client.get( + url_for("taxref.get_bib_lr") + ) + assert response.status_code == 200 + + response = self.client.get( + url_for("taxref.get_bib_hab") + ) + assert response.status_code == 200 diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 00000000..74ee3ba0 --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,19 @@ +""" + Fonctions utilitaires pour les tests +""" +import json + +def post_json(client, url, json_dict, query_string=None): + """Send dictionary json_dict as a json to the specified url """ + return client.post( + url, + data=json.dumps(json_dict), + content_type="application/json", + query_string=query_string, + ) + + +def json_of_response(response): + """Decode json from response""" + return json.loads(response.data.decode("utf8")) +