|
| 1 | +# Docurba |
| 2 | + |
| 3 | +Cette documentation est en cours de création. Merci de l'agrémenter selon vos besoins. |
| 4 | + |
| 5 | +## Architecture |
| 6 | + |
| 7 | +(à faire) |
| 8 | + |
| 9 | +### Base de données |
| 10 | + |
| 11 | +La base de données est gérée par [Supabase](https://supabase.com/docs). En local, la CLI supabase permet de créer une base de données et un environnement local équivalent à la production. Malheureusement, Supabase ne permet pas de travailler avec plusieurs bases de données localement. Pourtant, il nous faut bien deux bases de données pour faire tourner les tests. |
| 12 | +Jusqu'à maintenant, la base de données de test était créée par Pytest et utilisait donc l'URL `DATABASE_URL` configurée localement. Une nouvelle base était créée mais elle ne contenait pas : |
| 13 | +- les spécificités de Supabase : roles, schémas, fonctions et extensions (notamment). |
| 14 | +- la structure de la base de données de production qui est bien plus complet que les modèles Django. Il y a les tables mais aussi des fonctions, des déclencheurs et autres réjouissances créées en clic-clic-clic et non documentées. |
| 15 | + |
| 16 | +Cela devient un véritable problème depuis que nous utilisons les migrations Django pour gérer les changements de structure. En effet, ceux-ci se basent sur des tables qui existent bien en production mais pas dans l'environnement de test. |
| 17 | + |
| 18 | +Une première solution avait été de créer les tables manquantes dans un `conftest.py`. Puis via des signaux spécifiques à chaque application Django mais tout cela était incomplet. Maintenant, il est temps d'utiliser la structure complète de la base de données pour travailler sereinement. |
| 19 | + |
| 20 | +#### Locale |
| 21 | + |
| 22 | +Voir `supabase start`. |
| 23 | + |
| 24 | +#### Test |
| 25 | + |
| 26 | +En résumé : |
| 27 | +- Docker compose expose une base de test qui s'appuie sur l'image officielle de Supabase. |
| 28 | +- Le schéma de production est injecté dans la base de test lorsqu'elle est disponible. |
| 29 | +- Les migrations Django sont exécutées ensuite. |
| 30 | +- Puis Pytest peut tourner gentiment sans râler. |
| 31 | +La tâche `mise start:tests` permet de lancer l'ensemble automatiquement. Elle est utilisée dans la CI et peut être lancée localement. |
| 32 | + |
| 33 | +##### Docker compose à la rescousse |
| 34 | +La base de données de test utilise l'image officielle de Supabase qui est documentée dans la partie « [self-hosting with Docker](https://supabase.com/docs/guides/self-hosting/docker) ». Elle s'appuie sur les valeurs d'environnement `PG*`. |
| 35 | +Les scripts spécifiques sont dans le dossier `docker`. |
| 36 | +La structure spécifique à Supabase est ainsi créée par l'image mais aussi par des scripts qui ont été écrits par eux (voir le dossier `docker/test_db/supabase_seeds`) et qui viennent du dépôt officiel. |
| 37 | + |
| 38 | +##### Schéma de production |
| 39 | + |
| 40 | +Voir `docker/test_db/prod_schema_before_django_migrations.sql`. |
| 41 | +Le schéma de production a été créé avec `pg_dump` puis nettoyé et adapté. Il contient les tables, les fonctions, les extensions, certains déclencheurs et les permissions. |
| 42 | +Plus les modèles Django refléteront la structure de la base, moins nous aurons besoin de ce fichier. In fine, il pourra être supprimé lorsque tout aura été « traduit » dans Django. |
| 43 | + |
| 44 | +## Environnement local |
| 45 | + |
| 46 | +- Installez [Mise en place](https://mise.jdx.dev/getting-started.html) |
| 47 | +- Installez [la CLI Supabase](https://supabase.com/docs/guides/local-development/cli/getting-started). |
| 48 | +- Clônez [le dépôt Nuxt 3](https://github.com/betagouv/docurba-nuxt3/) et vérifiez que le serveur local se lance correctement (`$ mise start`). |
| 49 | +- Renseignez les variables d'environnement nécessaires à Nuxt et Django. Voir `django/.env.example` et `nuxt/.env.example`. |
| 50 | +Vous pouvez utiliser [dotenv](https://pypi.org/project/python-dotenv/), un utilitaire Python qui automatise l'usage des variables d'environnement (entre autre). |
| 51 | +- Utilisez la commande `mise start` pour lancer les serveurs suivants : Nuxt, Django, Nuxt3 et base de test (voir docker-compose.yml) |
0 commit comments