Test — CI Injector (4K-39)¶
Prérequis¶
- Stack CNP démarrée (
./start.sh) .envcontientGITLAB_BOT_TOKEN,GITLAB_BOT_NAMESPACE=4k-cnp-2027,CNP_API_BASE_URL- Un repo de test vide créé sur GitLab :
https://gitlab.com/4k-cnp-2027/cnp-apps/cnp-test - Le bot a accès en écriture à ce repo
0. Login¶
TOKEN=$(curl -s -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@cnp.local","password":"admin"}' \
| jq -r '.access_token')
1. Vérifier la génération du template (sans GitLab)¶
docker-compose exec backend python -c "
from backend.ci.templates import generate_gitlab_ci
print(generate_gitlab_ci('mon-app', 42, 'python'))
"
Résultat attendu : un YAML avec include: project: 4k-cnp-2027/cnp-ci-modules.
2. Repo inexistant → doit fail avec 422¶
curl -s -X POST http://localhost:8000/api/v1/apps/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "repo-inexistant",
"owner": "victor",
"origin": "scaffolded",
"repo_url": "https://gitlab.com/4k-cnp-2027/cnp-apps/ce-repo-nexiste-pas"
}' | jq .
Résultat attendu :
3. Scaffolded → push direct sur main¶
curl -s -X POST http://localhost:8000/api/v1/apps/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "cnp-test",
"owner": "victor",
"origin": "scaffolded",
"repo_url": "https://gitlab.com/4k-cnp-2027/cnp-apps/cnp-test"
}' | jq '{id, framework, ci_injected, status}'
Résultat attendu :
Vérifier sur GitLab que .gitlab-ci.yml est apparu sur main.
4. Scaffolded → CI déjà présente → doit fail proprement¶
Relancer la même commande qu'au test 3 (.gitlab-ci.yml existe déjà sur main).
Résultat attendu :
L'app est créée mais ci_injected: false signale que l'injection a été bloquée.
5. Imported → MR ouverte¶
Supprimer d'abord le .gitlab-ci.yml du repo de test (ou utiliser un autre repo vide), puis :
curl -s -X POST http://localhost:8000/api/v1/apps/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "cnp-test-imported",
"owner": "victor",
"origin": "imported",
"repo_url": "https://gitlab.com/4k-cnp-2027/cnp-apps/cnp-test"
}' | jq '{id, framework, ci_injected, status}'
Résultat attendu :
Vérifier sur GitLab qu'une MR cnp/inject-ci-YYYYMMDDHHMMSS → main est ouverte.
6. Détection framework Python¶
Ajouter un requirements.txt à la racine du repo de test sur GitLab, puis créer une nouvelle app :
curl -s -X POST http://localhost:8000/api/v1/apps/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "cnp-test-python",
"owner": "victor",
"origin": "scaffolded",
"repo_url": "https://gitlab.com/4k-cnp-2027/cnp-apps/cnp-test"
}' | jq '{id, framework, ci_injected}'
Résultat attendu : "framework": "python".
7. Suppression d'app (4K-59)¶
7a. App scaffoldée → supprime GitOps + projet GitLab + BDD¶
Vérifier : - cnp-gitops : argocd/<app>/ et apps/<app>/ supprimés - GitLab : le projet 4k-cnp-2027/cnp-apps/<app> est supprimé - L'app n'apparaît plus dans GET /api/v1/apps/
7b. App importée → supprime GitOps uniquement, préserve le repo GitLab¶
Même commande avec une app dont origin = "imported".
Vérifier : - cnp-gitops : manifestes supprimés - GitLab : le repo source n'est pas supprimé