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
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>
117 lines
3.2 KiB
Python
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() == {}
|