Kairo-Jinkendo/backend/tests/test_ap110_entity_fields.py
Lars a6fc86025c
All checks were successful
Deploy Development / deploy (push) Successful in 44s
Test Suite / pytest-backend (push) Successful in 1m54s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 19s
Test Suite / playwright-smoke (push) Successful in 15s
AP1.10b/10c: Entity Field System mit dynamischen Vorhaben-Zusatzfeldern.
EFS-Tabellen, Registry-Sync und Fields-API ermöglichen archetyp-spezifische Felder; Frontend rendert sie im Profil-Modal per FieldRenderer.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 13:53:07 +02:00

117 lines
3.2 KiB
Python

"""Entity Field System (AP1.10b/10c)."""
from __future__ import annotations
from tests.factories import provision_user_in_tenant
from tests.test_initiatives_actions import _auth, _create_initiative, _login
def test_entity_field_registry_sync():
from sync_entity_field_registry import main
assert main() == 0
def test_program_field_definitions(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
res = client.get(
"/api/entity-archetypes/field-definitions"
"?entity_type=initiative&archetype_key=initiative.program",
headers=_auth(token),
)
assert res.status_code == 200
keys = {item["field_key"] for item in res.json()}
assert keys == {"stakeholder_map", "success_criteria"}
def test_initiative_dynamic_fields_roundtrip(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
created = _create_initiative(
client,
token,
title="Programm Nord",
archetype_key="initiative.program",
)
assert created.status_code == 201
initiative_id = created.json()["id"]
defs_res = client.get(
f"/api/initiatives/{initiative_id}/field-definitions",
headers=_auth(token),
)
assert defs_res.status_code == 200
assert len(defs_res.json()) == 2
empty = client.get(
f"/api/initiatives/{initiative_id}/fields",
headers=_auth(token),
)
assert empty.status_code == 200
assert empty.json()["stakeholder_map"] == ""
patched = client.patch(
f"/api/initiatives/{initiative_id}/fields",
json={
"fields": {
"stakeholder_map": "PO: Anna\nTech: Bob",
"success_criteria": "Go-Live Q3",
}
},
headers=_auth(token),
)
assert patched.status_code == 200
body = patched.json()
assert body["stakeholder_map"] == "PO: Anna\nTech: Bob"
assert body["success_criteria"] == "Go-Live Q3"
def test_unknown_dynamic_field_rejected(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
created = _create_initiative(
client,
token,
title="Produkt Beta",
archetype_key="initiative.product",
)
initiative_id = created.json()["id"]
res = client.patch(
f"/api/initiatives/{initiative_id}/fields",
json={"fields": {"unknown_field": "x"}},
headers=_auth(token),
)
assert res.status_code == 400
def test_generic_initiative_has_no_dynamic_fields(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
created = _create_initiative(
client,
token,
title="Generic",
archetype_key="initiative.generic",
)
initiative_id = created.json()["id"]
defs_res = client.get(
f"/api/initiatives/{initiative_id}/field-definitions",
headers=_auth(token),
)
assert defs_res.status_code == 200
assert defs_res.json() == []
fields_res = client.get(
f"/api/initiatives/{initiative_id}/fields",
headers=_auth(token),
)
assert fields_res.status_code == 200
assert fields_res.json() == {}