python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
source .venv/bin/activate
deactivate
Pre-commit permet de linter et formatter votre code avant chaque commit. Un code linté selon les mêmes règles est plus simple à comprendre. Par défaut ici, tout est géré par ruff
Pour l'installer :
pre-commit install
Vous pouvez effectuer un premier passage sur tous les fichiers du repo avec :
pre-commit run --all-files
Les tests sont destructifs: ils écrivent dans les bases de données, et détruisent
tout à la fin. Normalement, ils doivent se faire sur des bases de données dédiées
à cet usage (cf. src/conftest.py
, des fixtures créent des bases de données, gèrent les
upgrades, et font les drops à la fin des tests). Si un test est mal écrit (s'il ne
passe pas par la bonne fixture), il aura lieu en se connectant à la base de données
par défaut (celle qui est configurée dans 'config/settings.toml'). C'est pourquoi:
- le fichier
config/settings.toml
contient des URL vers les bases de données qui ne permettent pas de s'y connecter (le mot de passe est volontairement erroné) - les bonnes URLs, pour les bases qui tournent dans le mariadb du docker compose,
doivent être dans un fichier
.env-dev
(utilisé parstart-dev.sh
), pour être utilisées paruvicorn
- les fixtures de test produisent des URLs valides sur les bases qu'elles créent
Et donc, si un test est mal écrit (sans utiliser les bonnes fixtures) il va échouer avec un message d'erreur explicite.
Si on met directement les bonnes URLs dans config/settings.toml
, ou si on charge
le fichier .env-dev
dans le terminal où on fait tourner pytest
, alors un test
mal écrit va se connecter à la base du docker (et non à la base de test) et risque
de tout détruire à cet endroit là.
Ce script se charge de lancer toute l'application dans un environnement correct, à savoir :
- détecter si vous utilisez podman ou docker
- lancer le
docker composer up
(ou équivalent), ce qui va...- lancer un serveur mariadb dans un conteneur
- lancer un serveur open-xchange dans un conteneur
- lancer
uvicorn
avec les bonnes options
Le script va chercher à la racine du dépôt un fichier .env-dev
qui contient les variables
d'environnement utiles pour se connecter (en particulier, il contient les URL de connexions
aux bases de données, ainsi que le secret pour les JWT).
Exemple d'un fichier .env-dev
:
export DIMAIL_JWT_SECRET="Not the default secret"
export DIMAIL_API_DB_URL="mysql+pymysql://api_user:coincoin@localhost:3306/api"
export DIMAIL_IMAP_DB_URL="mysql+pymysql://dovecot:toto@localhost:3306/dovecot"
export DIMAIL_POSTFIX_DB_URL="mysql+pymysql://postfix:toto@localhost:3306/dovecot"
export PYTEST_ADDOPTS="--cov --cov-report=html"
docker compose up -d
alembic revision --autogenerate -m "<votre_message>"
alembic upgrade head
mysql -u dovecot -ptoto -h localhost -P 3306 dovecot
mysql -u api_user -pcoincoin -h localhost -P 3306 api
uvicorn src.main:app --reload
Pour que uvicorn affiche tous les logs (et pas seulement les siens) :
uvicorn src.main:app --reload --log-config logs.yaml
Pour lancer tout le pipeline :
pytest
Pour lancer un test en partculier :
pytest -k <votre_test>
Pour que les tests soient utilisables par la CI de github
,
la librairie testcontainers a été utilisée.
Ainsi, il est possible de lancer les tests localement sans démarrer les containers manuellement.
Il faut pour celà définir une valeur truthy pour la variable d'env DIMAIL_TEST_CONTAINERS
.
exemple :
export DIMAIL_TEST_CONTAINERS="cool c est gentil ca"
On s'appuie sur pytest-cov
pour évaluer notre couverture de test. Il faut donc
l'installer si on veut l'utiliser (ce n'est pas dans dépendances du code, puisque
le code n'en a pas besoin).
pip install pytest-cov
Pour lancer les tests avec un rapport complet en HTML sur la couverture des tests
(toujours, dans le répertoire src
):
pytest --cov --cov-report=html
Ça produit un répertoire coverage
à côté de src
, qui contient toutes les
informations sur ce qui est testé et ce qui ne l'est pas. Le fichier src/.coveragerc
fixe quelques paramètres sur le calcul de la couverture de test (par exemple, ne
pas chercher à tester les tests, ou fixer quelques cas dont on sait qu'ils ne sont
pas couverts et que c'est pas bien grave).