refactor(#11-Kritik): Contacts-Entities aus statischem Core-Registry entfernt — ContactsPlugin.get_entity_models() ist Single Source (contact/contacts/company); conftest spiegelt Produktions-Bootstrap idempotent (autouse-Fixture); Regressionstests beweisen Plugin-Registrierung; 12 ACL-Batch-Failures per Stash-Test als Vorbestand bewiesen (Suite-Isolation, identisch auf clean HEAD)

This commit is contained in:
Agent Zero
2026-08-27 18:53:12 +02:00
parent ad5601eb7d
commit e1a59e759f
3 changed files with 77 additions and 7 deletions
+47
View File
@@ -0,0 +1,47 @@
"""Contacts-Entity-Registry: single source of truth (Kritikpunkt 11).
Beweist, dass die Contacts-Entities (contact/contacts/company) NICHT mehr
statisch im Core-Registry stehen, sondern ausschliesslich vom ContactsPlugin
ueber get_entity_models() + register_entity_model() kommen — wie jedes
andere Plugin auch. is_core=True heisst Pflichtplugin, nicht Core-Verdrahtung.
"""
from __future__ import annotations
from app.models.contact import Contact
from app.plugins.builtins.contacts.plugin import ContactsPlugin
from app.services.entity_permission_service import ENTITY_MODELS
def test_core_registry_source_has_no_static_contacts_entries():
"""The core registry SOURCE must not hardcode contacts entities anymore.
(After bootstrap ENTITY_MODELS legitimately contains them — registered
via the plugin. This test proves the duplicate static source is gone.)
"""
from pathlib import Path
module_path = Path(__file__).parent.parent / "app" / "services" / "entity_permission_service.py"
text = module_path.read_text(encoding="utf-8")
assert '"contact": Contact' not in text, "statischer contact-Eintrag noch im Core!"
assert '"contacts": Contact' not in text, "statischer contacts-Eintrag noch im Core!"
assert '"company": Contact' not in text, "statischer company-Eintrag noch im Core!"
def test_contacts_plugin_is_single_source_for_its_entities():
"""ContactsPlugin.get_entity_models() defines contact/contacts/company."""
plugin_models = ContactsPlugin().get_entity_models()
assert plugin_models == {
"contact": Contact,
"contacts": Contact,
"company": Contact,
}
def test_bootstrap_registers_contacts_entities_via_plugin():
"""After the real bootstrap path (conftest mirrors main.py lifespan:
every plugin's get_entity_models() is registered), contacts entities
are present — via the plugin, not via the core registry."""
assert ENTITY_MODELS["contact"] is Contact
assert ENTITY_MODELS["contacts"] is Contact
assert ENTITY_MODELS["company"] is Contact