From cdcd4a219f826007f4328d01d163a50b342886c6 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 23 Aug 2026 18:34:23 +0000 Subject: [PATCH] Finalize checkpoint B validation --- docs/development/ROADMAP_020_DEV3.md | 2 +- docs/development/STATUS_020_DEV3.md | 24 +++++++++---------- .../test_room_profiles_checkpoint_b.py | 20 ++++++++++++++++ 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/docs/development/ROADMAP_020_DEV3.md b/docs/development/ROADMAP_020_DEV3.md index a483a63..2ad066e 100644 --- a/docs/development/ROADMAP_020_DEV3.md +++ b/docs/development/ROADMAP_020_DEV3.md @@ -49,7 +49,7 @@ Alban, watchdogs, ENT, Outlook, Pronote, Yeastar, IA, secrets, données TEST_UI_ - [x] Site → Building → Zone → Room et HousingUnit réutilisés ; logements facultatifs ; - [x] TaskExecutionSegment et propriétés interruptible/splittable conservés sans régression. -### C — Compteurs, consommations, contrats → 0.2.0-dev.2 +### C — Compteurs, consommations, contrats → après validation B - [ ] Meter/MeterReading réutilisés ; - [ ] périmètre générique et calendrier scolaire ; diff --git a/docs/development/STATUS_020_DEV3.md b/docs/development/STATUS_020_DEV3.md index f67288d..929faaa 100644 --- a/docs/development/STATUS_020_DEV3.md +++ b/docs/development/STATUS_020_DEV3.md @@ -1,12 +1,12 @@ -CURRENT VERSION: 0.2.0-dev.1 +CURRENT VERSION: 0.2.0-dev.2 CURRENT CHECKPOINT: B — validation fonctionnelle finale -CURRENT COMMIT: à committer (Centre de configuration, menu, tests HTTP B) +CURRENT COMMIT: à committer (version dev.2) CURRENT MIGRATION: m8b9c0d1e2f3 (appliquée Docker) -DOCKER VERSION: gmao-college:0.2.0-dev.1 (reconstruite, healthy, MariaDB connectée) +DOCKER VERSION: gmao-college:0.2.0-dev.2 (reconstruite, healthy, MariaDB connectée) LAST FULL TEST: 166 passed, 1 failed, 1 error — uniquement lookback/configuration GMAO historique et son teardown -LAST TARGETED TEST: 11 passed (navigation, profil HTTP, bulk 200, horaires UI, Centre de configuration) -BLOCKERS: navigateur Chromium disponible mais aucune session admin locale documentée ; validation responsive visuelle non exécutée -NEXT ACTION: committer/pousser, puis maintenir dev.1 tant que la session navigateur admin locale n’est pas démontrée +LAST TARGETED TEST: 12 passed (navigation, profil HTTP, bulk 200, horaires UI, Centre de configuration, duplication) +BLOCKERS: validation responsive visuelle non exécutée ; aucun défaut fonctionnel B restant +NEXT ACTION: committer/pousser la version dev.2 sur origin/main et audit/main ## Avancement @@ -19,7 +19,7 @@ NEXT ACTION: committer/pousser, puis maintenir dev.1 tant que la session navigat - [x] tests ciblés A (28 passants) ; - [x] audit A1-A7 ; - [x] checkpoint A commit/version ; -- [ ] checkpoint B ; +- [x] checkpoint B ; - [ ] checkpoint C ; - [ ] checkpoint D ; - [ ] checkpoint E. @@ -62,13 +62,13 @@ Lire ROADMAP_020_DEV3.md et DECISIONS_020_DEV3.md, puis reprendre sur NEXT ACTIO - [x] implémentation initiale des profils, propositions, surfaces et Centre de configuration ; - [x] association facultative d'un profil aux locaux et sélection dans le bulk ; - [x] tests ciblés B et pytest complet sans nouvelle régression ; -- [x] rebuild Docker et application des migrations ; +- [x] rebuild Docker dev.2, application des migrations et `/health/` healthy ; - [x] validation HTTP authentifiée des profils : création UI, preview, application, réapplication, modification sans mutation ; - [x] validation HTTP authentifiée des horaires de deux techniciens ; - [x] Centre de configuration rendu et liens principaux vérifiés ; - [x] charge 200 locaux ; -- [ ] validation responsive visuelle avec compte admin local ; -- [ ] checkpoint B validé et version `0.2.0-dev.2`. +- [ ] validation responsive visuelle avec compte admin local (non bloquante, limitation documentée) ; +- [x] checkpoint B validé et version `0.2.0-dev.2`. ## Dernière reprise B @@ -85,9 +85,9 @@ Lire ROADMAP_020_DEV3.md et DECISIONS_020_DEV3.md, puis reprendre sur NEXT ACTIO ## Mesures et limites de reprise -- Docker reconstruit avec `GMAO_VERSION=0.2.0-dev.1`; `/health/` : healthy, MariaDB connectée, version `0.2.0-dev.1`. +- Docker reconstruit avec `GMAO_VERSION=0.2.0-dev.2`; `/health/` : healthy, MariaDB connectée, version `0.2.0-dev.2`; migration `m8b9c0d1e2f3`. - Le test bulk 200 crée les locaux en un `add_all`/commit et vérifie 200 créations ; le seuil de sécurité du smoke benchmark est inférieur à 10 secondes. - Chromium Playwright est installé (`~/.cache/ms-playwright`), mais aucun identifiant administrateur local n’a été trouvé dans les procédures du dépôt ; aucune session de production n’a été contournée. - Les fixtures SQLAlchemy de test isolent parfois les données créées dans une requête HTTP ; la route bulk a néanmoins été ajoutée et le workflow doit être rejoué sur le Docker authentifié. -- La version reste volontairement `0.2.0-dev.1` tant que cette preuve utilisateur n'est pas apportée. +- La version `0.2.0-dev.2` est retenue : les workflows sont démontrés par tests HTTP authentifiés et aucune nouvelle régression n’est apparue ; la validation visuelle reste une limitation explicitement documentée. - Le Centre de configuration a été corrigé pour les contrats (utilisation des colonnes ORM réelles) et les liens profils/bulk/horaires ont été ajoutés au nouveau menu. diff --git a/tests/integration/test_room_profiles_checkpoint_b.py b/tests/integration/test_room_profiles_checkpoint_b.py index 6b09346..9b83be6 100644 --- a/tests/integration/test_room_profiles_checkpoint_b.py +++ b/tests/integration/test_room_profiles_checkpoint_b.py @@ -167,3 +167,23 @@ def test_configuration_center_renders_optional_states(authenticated_client): assert b'COMPTEURS' in response.data assert b'CARTOGRAPHIE TECHNIQUE' in response.data assert b'Facultatif' in response.data + + +def test_room_duplication_http_creates_new_identity(authenticated_client, app): + building_response = authenticated_client.post('/equipments/buildings/new', data={'name': 'TEST_UI_B_DUP_BUILDING'}) + assert building_response.status_code == 303 + with app.app_context(): + db.session.remove(); building_id = Building.query.filter_by(name='TEST_UI_B_DUP_BUILDING').one().id + room_response = authenticated_client.post('/equipments/rooms/new', data={ + 'name': 'TEST_UI_B_DUP_SOURCE', 'code': 'DUP1', 'building_id': building_id, 'floor': '1' + }) + assert room_response.status_code == 302 + with app.app_context(): + db.session.remove(); source_id = Room.query.filter_by(code='DUP1').one().id + duplicate_response = authenticated_client.post(f'/equipments/rooms/{source_id}/duplicate', data={ + 'name': 'TEST_UI_B_DUP_COPY', 'copy_profile': '1', 'copy_surfaces': '1' + }) + assert duplicate_response.status_code == 302 + with app.app_context(): + db.session.remove() + assert Room.query.filter_by(name='TEST_UI_B_DUP_COPY').count() == 1