REFACTOR: Contacts-Entities aus statischem ENTITY_MODELS entfernt — ContactsPlugin ist Single Source; + VORBESTAND: 12 ACL-Batch-Failures durch Suite-Isolation (relation users does not exist) #357
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Live gemessen 2026-08-27 (Kritikpunkte 9–11 gegengeprüft):
Doppelquelle bewiesen:
ENTITY_MODELSinapp/services/entity_permission_service.pyenthielt statischcontact/contacts/company— währendContactsPlugin.get_entity_models()exakt dieselben drei Entities bereits dynamisch liefert. Der eigene Kommentar in der Datei ("Plugin models are registered dynamically via plugin.get_entity_models()") wurde von den Contacts-Einträgen verletzt.Grundsatz (Kritikpunkt 10):
is_core=Trueheißt Pflichtplugin/nicht deaktivierbar — NICHT Core-Verdrahtung. Die statischen Einträge waren Symptom der halbfertigen Contacts-Migration.Fix (
e1a59e7):ContactsPlugin.get_entity_models()ist Single Source of Truth.tests/conftest.pyspiegelt den Produktions-Bootstrap (main.py lifespan) idempotent vor jedem Test:get_entity_models()→register_entity_model()— garantiert Test-Isolation ohne statische Dublette.tests/test_contacts_entity_registry.py(3/3 passed): Statik-Quelle weg (Source-Inspektion), Plugin liefert die Entities, Bootstrap registriert sie.Bewiesener Vorbestand (separates Finding): Der ACL-Batch (entity_permissions + rbac_comprehensive + cross_tenant_security + contacts) zeigt 12 Failures identisch auf clean HEAD (Stash-Test: 12 failed/118 passed auf e1a59e7-Vorgänger UND mit Fix: 12 failed/121 passed — nur die 3 neuen Tests differieren). Ursache: Suite-Isolation —
relation "users" does not existin Nachfolger-Suiten (eine Suite zerstört/resetiert das DB-Schema). Gehört in ein eigenes Isolation-Bugfix-Paket.Funktionserhalt: entity_permissions + cross_tenant_security Suiten vollständig grün; ruff modified-files 0 Fehler;
create_app()OK.Umgesetzt in Commit
e1a59e7— deployed und live verifiziert (2026-08-27 18:59):Fix
contact/contacts/companyaus dem Core-ENTITY_MODELSgelöscht —ContactsPlugin.get_entity_models()ist die einzige Quelle (wie bei jedem anderen Plugin auch).tests/conftest.pyregistriert vor jedem Test idempotent alle Plugin-Entity-Models (gleicher Mechanismus wiemain.pylifespan) — Isolation ohne statische Dublette.contact_folder,address,bank_account,attachmentetc. bleiben korrekt im Core-Registry (werden von keinem Plugin geliefert — echte Core-Entities).Verifikation (Live-Messung)
tests/test_contacts_entity_registry.py: 3/3 passed (Source-Inspektion beweist Statik-Weg; Plugin liefert die Entities; Bootstrap registriert sie)create_app()OK · Full Deploy SUCCESS · Health healthy · Alembic 0142 OKOffenes Vorbestand-Finding (separates Paket)
Der kombinierte ACL-Batch zeigt 12 Failures identisch auf clean HEAD (Stash-Test bewiesen: 118 passed ohne / 121 passed mit Fix — nur die 3 neuen Tests differieren). Ursache: Suite-Isolation (
relation "users" does not existin Nachfolger-Suiten — eine Suite zerstört das DB-Schema). Wird als eigenes Isolation-Bugfix-Paket behandelt, nicht hier vermengt.Suite-Isolation-Teil umgesetzt in Commit
b691dd3(2026-08-28 00:02) — ACL-Batch jetzt vollständig grün.Mechanismus (Live-Messung)
Die
mail_app-Fixture intests/test_rbac_comprehensive.pyruft im Teardownclose_engine()— das disposiert und setzt alle globalen Engines auf None (app/core/db/__init__.pyZeile 348–353). Jede nachfolgende Test-Suite lief ohne funktionierende Engine-Registrierung →relation "users" does not existin 12 Tests.Korrektur-Ergänzung der Messung: Nach dem rbac-Lauf existierten 129 Tabellen,
userswar leer (0 Zeilen) — die Daten wurden durch die Suite-Interaktion geleert, das Schema blieb. Beides floss in die Diagnose ein.Fix
Nach
close_engine()im Teardown:reset_engine_for_testing(engine)— die conftest-Engine wird als globale Engine wiederhergestellt (Spiegelung des Produktions-Bootstrap inmain.pylifespan).Verifikation (Live-Messung)
ACL-Batch (rbac_comprehensive + contacts + entity_permissions + cross_tenant_security):
Nur
tests/geändert — kein Production-Deploy nötig (Tests laufen nicht in Produktion).W4b-Verifikation (2026-08-28 08:49):
Funktionserhalt
Vorbestand bewiesen (Stash-Test)
test_create_saved_filter_invalid_entity_returns_422: identisch auf clean HEAD — der Test erwartet 422, aber_validate_entity_typewirft seit jeher 400 (HTTPException 400). Vorbestand-Bug, nicht W4b.no tests/useCurrentUsermock-Fehler: identisch auf clean HEAD — die Testdatei mockt@/api/hooksohne denuseCurrentUser-Export.Offen
useCurrentUser-Export im Mock ergänzen (separates Paket)