From 361e153b9f20d11275d153a1cec454b29f64e516 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Mon, 31 Aug 2026 10:25:45 +0200 Subject: [PATCH 1/2] fix(e2e): seed the five Goals goals-pages.spec.ts asserts on `Goals: index lists all five seeded goals` failed on getByText('Duurzame omzetgroei 2028') -> element(s) not found. The five goals it names were never created on CI. The spec's docblock points at lib/Settings/register.d/66-organisation-goals.json, but that file declares only the Goal SCHEMA. The five objects live in three different profile files -- association.json (1), corporate.json (2), municipality.json (2) -- so no single `example_profile` yields all five, and the seed deliberately picks `none` to keep a whole demo dataset out of the lists other specs assert on. The spec was written against the older behaviour where installing planted everything. Measured on development 67e0f6c1: E2E 4 failed / 139 passed, this among them. Seeded in the governance fixture, beside the objects the other specs need: - No SEED_TAG prefix. The titles ARE the assertion and are matched with { exact: true }, so prefixing them the way the sibling objects are prefixed would break the test this exists to fix. - Titles, descriptions, horizons, deadlines and statuses copied verbatim from the profiles, so the fixture and the shipped example sets cannot drift into disagreeing about what a Goal looks like. - `body` repointed at this run's governance body. The profiles reference their own bodies by slug (gemeenteraad-amsterdam, ledenraad-vng, raad-van-bestuur-acme-bv), none of which exist here; a dangling reference would seed an object the index cannot resolve. `owner` is dropped for the same reason -- femke-halsema is not a user on this instance, and the field is not required. - 'goal': 5 added to the readability verifier, for the reason that block exists: a create that answered 2xx but is not listable would leave the spec failing on "element(s) not found", which reads as a missing feature rather than a seed that did not land. This fixes ONE of decidiq's four E2E failures. The other three are not seeding gaps and are left alone deliberately -- see the PR body. --- tests/e2e/ci-seed.sh | 68 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/e2e/ci-seed.sh b/tests/e2e/ci-seed.sh index 249bccece..197e5d504 100755 --- a/tests/e2e/ci-seed.sh +++ b/tests/e2e/ci-seed.sh @@ -619,6 +619,68 @@ else # lib/Migration/MigrateActionItemsToDeckLeaf.php is an explicit no-op.) # Action items are seeded per-spec through decidiq's own endpoint, # POST /apps/decidiq/api/action-items → ActionItemWriter → TaskService. + # ── The five Goals `goals-pages.spec.ts` asserts on ──────────────────────── + # + # 🔴 THESE TITLES ARE THE ASSERTION, SO THEY CARRY NO ${SEED_TAG} PREFIX. + # `SEEDED_GOAL_TITLES` matches with `{ exact: true }`; prefixing them the way + # the objects above are prefixed would break the very test this seeds for. + # + # WHY THEY HAVE TO BE SEEDED HERE AT ALL. The spec's docblock points at + # lib/Settings/register.d/66-organisation-goals.json, but that file declares + # only the `Goal` SCHEMA. The five objects live in three different profile + # files — association.json (1), corporate.json (2), municipality.json (2) — + # so NO single `example_profile` produces all five, and CI picks `none` + # (see the setup/config call below) precisely to keep a whole demo dataset + # out of the lists other specs assert on. The spec was written against the + # older behaviour where installing planted everything. + # + # Measured on development 2026-08-31: E2E 4 failed / 139 passed, one of them + # `Goals: index lists all five seeded goals` failing on + # `getByText('Duurzame omzetgroei 2028')` → element(s) not found. + # + # Titles, descriptions, horizons, deadlines and statuses are copied verbatim + # from those profiles so the fixture and the shipped example sets cannot + # drift into disagreeing about what a Goal looks like. + # + # `body` is repointed at THIS run's governance body. The profiles reference + # their own bodies by slug (`gemeenteraad-amsterdam`, `ledenraad-vng`, + # `raad-van-bestuur-acme-bv`), none of which exist here — a dangling + # reference would seed an object the Goals index cannot resolve or render. + # `owner` is dropped for the same reason: `femke-halsema` is not a user on + # this instance, and it is not a required field. + seed_goal() { + # $1 = title, $2 = description, $3 = horizon, $4 = startDate, + # $5 = deadline, $6 = status, $7 = extra JSON fields (may be empty) + local id + id="$(seed_object goal \ + "{\"title\":\"$1\",\"description\":\"$2\",\"horizon\":\"$3\",\"body\":\"${BODY_ID}\",\"startDate\":\"$4\",\"deadline\":\"$5\",\"status\":\"$6\"$7}" \ + "the Goal \"$1\"")" + echo "[ci-seed] goal ${id} $1" + } + + seed_goal 'Duurzame omzetgroei 2028' \ + 'Structurele omzetgroei realiseren binnen de duurzaamheidsdoelstellingen van de organisatie.' \ + 'multi-year' '2026-01-01' '2028-12-31' 'active' \ + ',"targetValue":20,"currentValue":6,"unit":"% omzetgroei"' + + seed_goal 'Operationele effectiviteit 2026' \ + 'Procesdoorlooptijden binnen norm brengen als uitvoering van de groeidoelstelling.' \ + 'annual' '2026-01-01' '2026-12-31' 'active' \ + ',"targetValue":90,"currentValue":78,"unit":"% doorlooptijd binnen norm"' + + seed_goal 'Amsterdam klimaatneutraal' \ + 'Netto CO2-uitstoot van de gemeentelijke organisatie naar nul in 2050.' \ + 'multi-year' '2026-01-01' '2050-01-01' 'active' \ + ',"targetValue":100,"currentValue":42,"unit":"% CO2-reductie behaald"' + + seed_goal 'Herzien parkeerbeleid vastgesteld' \ + 'Vaststellen van het herziene parkeerbeleid binnenstad.' \ + 'quarterly' '2026-04-01' '2026-09-30' 'at-risk' '' + + seed_goal 'Digitale dienstverlening leden' \ + 'Alle leden kunnen digitaal diensten afnemen bij de vereniging.' \ + 'annual' '2026-01-01' '2026-12-31' 'draft' '' + echo "[ci-seed] governance fixture seeded." fi @@ -637,6 +699,12 @@ required = { 'agenda-item': 3, 'decision': 3, 'minutes': 1, + # goals-pages.spec.ts asserts all FIVE by exact title, so five is the floor. + # Listed here for the reason this whole block exists: a create that answered + # 2xx but is not listable would leave the spec failing on "element(s) not + # found", which reads as a missing feature rather than a seed that did not + # land. + 'goal': 5, # NOT action-item: CalDAV-backed and read-only through this API (see above). } From f07527558b79e4fe483867e0f3c9864d6a3606de Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Mon, 31 Aug 2026 10:34:56 +0200 Subject: [PATCH 2/2] fix(e2e): seed one built-in ProcessTemplate so the list is not empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Template list shows built-in templates as read-only` failed at expect(page.locator('[data-testid="process-template-list"]')).toBeVisible() Received: hidden not because the list is missing but because it is EMPTY. ProcessTemplates.vue renders `