forked from ScoDoc/ScoDoc
Script test interactif API
This commit is contained in:
parent
0a7bb35604
commit
f87ed3bb68
40
tests/api/api_shell.py
Normal file
40
tests/api/api_shell.py
Normal file
@ -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])
|
@ -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('<?xml version="1.0" encoding="utf-8"?>')
|
|
||||||
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"]
|
|
Loading…
Reference in New Issue
Block a user