From b836aaa91f5290d9f264f074a07172b04efa6369 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 23 Aug 2026 23:11:07 +0000 Subject: [PATCH] test(meters): cover checkpoint C1 fix workflows --- tests/integration/test_meter_checkpoint_c1.py | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/tests/integration/test_meter_checkpoint_c1.py b/tests/integration/test_meter_checkpoint_c1.py index 51aaa19..2c5ad40 100644 --- a/tests/integration/test_meter_checkpoint_c1.py +++ b/tests/integration/test_meter_checkpoint_c1.py @@ -84,3 +84,105 @@ def test_replacement_keeps_old_history_and_links_new_meter(app, admin_user): assert old.is_active is False assert new.replaces_meter_id == old.id assert MeterReading.query.filter_by(meter_id=old.id).count() == 1 + + +def _edit_payload(meter, building, **extra): + payload = { + "name": meter.name, + "meter_type": meter.meter_type, + "unit": meter.unit, + "scope_type": "building", + "scope_id": str(building.id), + "parent_id": "", + } + payload.update(extra) + return payload + + +def test_meter_edit_http_changes_and_removes_parent(app, authenticated_client): + with app.app_context(): + _, building, _ = _equipment() + root = create_meter(name="TEST_UI_C1_FIX_ROOT", building_id=building.id) + child = create_meter(name="TEST_UI_C1_FIX_CHILD", building_id=building.id) + response = authenticated_client.get(f"/meters/{child.id}/edit") + assert response.status_code == 200 + assert b"Compteur parent" in response.data + + response = authenticated_client.post( + f"/meters/{child.id}/edit", + data=_edit_payload(child, building, parent_id=str(root.id)), + ) + assert response.status_code == 302 + db.session.refresh(child) + assert child.parent_id == root.id + + response = authenticated_client.post( + f"/meters/{child.id}/edit", + data=_edit_payload(child, building, parent_id=""), + ) + assert response.status_code == 302 + db.session.refresh(child) + assert child.parent_id is None + + +def test_meter_edit_http_rejects_self_parent_and_deep_cycle(app, authenticated_client): + with app.app_context(): + _, building, _ = _equipment() + root = create_meter(name="TEST_UI_C1_FIX_CYCLE_ROOT", building_id=building.id) + child = create_meter(name="TEST_UI_C1_FIX_CYCLE_CHILD", building_id=building.id, parent=root) + grandchild = create_meter(name="TEST_UI_C1_FIX_CYCLE_GRANDCHILD", building_id=building.id, parent=child) + + response = authenticated_client.post( + f"/meters/{root.id}/edit", + data=_edit_payload(root, building, parent_id=str(root.id)), + ) + assert response.status_code == 302 + db.session.expire_all() + assert db.session.get(Meter, root.id).parent_id is None + + response = authenticated_client.post( + f"/meters/{root.id}/edit", + data=_edit_payload(root, building, parent_id=str(grandchild.id)), + ) + assert response.status_code == 302 + db.session.expire_all() + assert db.session.get(Meter, root.id).parent_id is None + + +def test_meter_edit_http_types_status_replacement_and_c2_wording(app, authenticated_client, admin_user): + with app.app_context(): + _, building, _ = _equipment() + old = create_meter(name="TEST_UI_C1_FIX_OLD", meter_type="eau", unit="m³", building_id=building.id) + new = replace_meter(old_meter=old, name="TEST_UI_C1_FIX_NEW", user_id=admin_user["id"]) + + response = authenticated_client.get(f"/meters/{old.id}") + assert response.status_code == 200 + assert "État du compteur".encode() in response.data + assert "Remplacé".encode() in response.data + assert "Remplacé par".encode() in response.data + assert new.name.encode() in response.data + + response = authenticated_client.get(f"/meters/{new.id}") + assert response.status_code == 200 + assert "Remplace".encode() in response.data + assert old.name.encode() in response.data + + response = authenticated_client.get(f"/meters/{old.id}/edit") + assert response.status_code == 200 + for label in ("Eau", "Gaz", "Électricité", "Photocopieur", "Heures", "Cycles", "Distance"): + assert label.encode() in response.data + assert b"Le syst\xc3\xa8me vous rappellera" not in response.data + assert b"planification automatique des \xc3\xa9ch\xc3\xa9ances" in response.data + + response = authenticated_client.post( + f"/meters/{old.id}/edit", + data=_edit_payload(old, building, meter_type="eau"), + ) + assert response.status_code == 302 + db.session.expire_all() + assert db.session.get(Meter, old.id).meter_type == "eau" + + unknown = create_meter(name="TEST_UI_C1_FIX_UNKNOWN", meter_type="future_type", building_id=building.id) + response = authenticated_client.get(f"/meters/{unknown.id}/edit") + assert response.status_code == 200 + assert b"Autre \xe2\x80\x94 future_type" in response.data