From f87ed3bb6893ea8d772ee6b97bb2548a25348a57 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 27 Jul 2024 13:28:06 +0200 Subject: [PATCH] Script test interactif API --- tests/api/api_shell.py | 40 ++++++++ tests/api/exemple-api-scodoc7.py | 170 ------------------------------- 2 files changed, 40 insertions(+), 170 deletions(-) create mode 100644 tests/api/api_shell.py delete mode 100644 tests/api/exemple-api-scodoc7.py diff --git a/tests/api/api_shell.py b/tests/api/api_shell.py new file mode 100644 index 00000000..560a1b09 --- /dev/null +++ b/tests/api/api_shell.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +"""Script pour tester l'API en mode interactif + +Utilisation: +```py +python -i tests/api/api_shell.py +``` + +""" + +import pdb +from pprint import pprint as pp + +from setup_test_api import ( + API_PASSWORD, + API_URL, + API_USER, + APIError, + CHECK_CERTIFICATE, + get_auth_headers, + GET, + POST, + SCODOC_URL, + set_headers, +) + +set_headers(get_auth_headers("admin_api", "admin_api")) + +print( + """ +Connecté au serveur ScoDoc. Vous pouvez utiliser: +GET( route ) +POST( route, data ) +Exemple avec pretty print: +pp(GET("/departements")[0]) +""" +) + +pp(GET("/departements")[0]) diff --git a/tests/api/exemple-api-scodoc7.py b/tests/api/exemple-api-scodoc7.py deleted file mode 100644 index a73a36ce..00000000 --- a/tests/api/exemple-api-scodoc7.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 -# -*- mode: python -*- -# -*- coding: utf-8 -*- - -# OBSOLETE - NE PLUS UTILISER CETTE API -# VOIR https://scodoc.org/ScoDoc9API/ - -"""Exemple connexion sur ScoDoc 9 et utilisation de l'ancienne API ScoDoc 7 -à la mode "PHP": les gens passaient directement __ac_name et __ac_password -dans chaque requête, en POST ou en GET. - -Cela n'a jamais été documenté mais était implicitement supporté. C'est "deprecated" -et ne sera plus supporté à partir de juillet 2022. - -Ce script va tester: -- Liste semestres -- Liste modules -- Creation d'une évaluation -- Saisie d'une note - -Utilisation: créer les variables d'environnement: (indiquer les valeurs -pour le serveur ScoDoc que vous voulez interroger) - -export SCODOC_URL="https://scodoc.xxx.net/" -export SCODOC_USER="xxx" -export SCODOC_PASSWD="xxx" -export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide - -(on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). -""" - -from dotenv import load_dotenv -import json -import os -import pdb -import requests -import urllib3 -from pprint import pprint as pp - -# --- Lecture configuration (variables d'env ou .env) -BASEDIR = os.path.abspath(os.path.dirname(__file__)) -load_dotenv(os.path.join(BASEDIR, ".env")) -CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) -SCODOC_URL = os.environ["SCODOC_URL"] -SCODOC_DEPT = os.environ["SCODOC_DEPT"] -DEPT_URL = SCODOC_URL + "/ScoDoc/" + SCODOC_DEPT + "/Scolarite" -SCODOC_USER = os.environ["SCODOC_USER"] -SCODOC_PASSWORD = os.environ["SCODOC_PASSWD"] -print(f"SCODOC_URL={SCODOC_URL}") - -# --- -if not CHECK_CERTIFICATE: - urllib3.disable_warnings() - - -class ScoError(Exception): - pass - - -def GET(path: str, params=None, errmsg=None): - """Get and returns as JSON""" - # ajoute auth - params["__ac_name"] = SCODOC_USER - params["__ac_password"] = SCODOC_PASSWORD - r = requests.get( - DEPT_URL + "/" + path, params=params, verify=CHECK_CERTIFICATE, timeout=10 - ) - if r.status_code != 200: - raise ScoError(errmsg or "erreur !") - return r.json() # decode la reponse JSON - - -def POST(path: str, data: dict, errmsg=None): - """Post""" - data["__ac_name"] = data.get("__ac_name", SCODOC_USER) - data["__ac_password"] = data.get("__ac_password", SCODOC_PASSWORD) - r = requests.post( - DEPT_URL + "/" + path, data=data, verify=CHECK_CERTIFICATE, timeout=10 - ) - return r - - -# --- -# pas besoin d'ouvrir une session, on y va directement: - -# --- Recupere la liste de tous les semestres: -sems = GET("Notes/formsemestre_list", params={"fmt": "json"}) - -# sems est une liste de semestres (dictionnaires) -for sem in sems: - if sem["etat"]: - break - -if sem["etat"] == "0": - raise ScoError("Aucun semestre non verrouillé !") - -# Affiche le semestre trouvé: -pp(sem) - -# Liste des étudiants dans le 1er semestre non verrouillé: -group_list = GET( - "groups_view", - params={ - "formsemestre_id": sem["formsemestre_id"], - "with_codes": 1, - "fmt": "json", - }, -) -if not group_list: - # config inadaptée pour les tests... - raise ScoError("aucun étudiant inscrit dans le semestre") - -etud = group_list[0] # le premier étudiant inscrit ici -# test un POST -r = POST( - "Absences/AddBilletAbsence", - { - "begin": "2021-10-25", - "end": "2021-10-26", - "description": "test API scodoc7", - "etudid": etud["etudid"], - }, -) -assert r.status_code == 200 -assert r.text.startswith('') -assert "billet_id" in r.text -# Essai avec un compte invalide -r_invalid = POST( - "Absences/AddBilletAbsence", - { - "__ac_name": "xxx", - "begin": "2021-10-25", - "end": "2021-10-26", - "description": "test API scodoc7", - "etudid": etud["etudid"], - }, -) -assert r_invalid.status_code == 403 # compte invalide => not authorized - -# AddBilletAbsence en json -r = POST( - "Absences/AddBilletAbsence", - { - "begin": "2021-10-25", - "end": "2021-10-26", - "description": "test API scodoc7", - "etudid": etud["etudid"], - "xml_reply": 0, - }, -) -assert r.status_code == 200 -assert isinstance(json.loads(r.text)[0]["billet_id"], int) - -# Les fonctions ci-dessous ne fonctionnent plus en ScoDoc 9 -# Voir https://scodoc.org/git/viennet/ScoDoc/issues/149 - -# # ---- Liste les modules et prend le premier -# mods = GET("/Notes/moduleimpl_list", params={"formsemestre_id": sem["formsemestre_id"]}) -# print(f"{len(mods)} modules dans le semestre {sem['titre']}") - -# mod = mods[0] - -# # ---- Etudiants inscrits dans ce module -# inscrits = GET( -# "Notes/do_moduleimpl_inscription_list", -# params={"moduleimpl_id": mod["moduleimpl_id"]}, -# ) -# print(f"{len(inscrits)} inscrits dans ce module") -# # prend le premier inscrit, au hasard: -# etudid = inscrits[0]["etudid"]