Skip to content

E2E: #957 left 3 failures on development — VotingRound has no link to a Motion #969

Description

@rubenvdlinde

quality / E2E Tests (Playwright) is red on development. The run at 13:48 (33255969802) was green; the run at 15:09 (33259463878) is red, and 140a7ad4 feat(types): introduce the configurable type layer (#957) is the only commit between them — it landed 5 seconds before the failing run started.

4 failed, 141 passed. One is fixed in #967 (the gov/assoc MODE_LABELS unification). These three are for the #957 workstream, because fixing them means deciding a data model that #957 is actively changing.


1 + 2. voting-rules.spec.ts:222 and :281 — the panel shows another motion's round

⚠️ This is a product defect, not only a test one.

VotingRoundPanel.fetchCurrentRound() scopes by:

this.objectStore.fetchCollection('voting-round', { 'relations.motion': this.motionId })

But VotingRound declares no motion property and no relations property. From lib/Settings/decidesk_register.json:

VotingRound -> votingMethod, isSecret, openedAt, closedAt, quorumWith, result,
               votesFor, votesAgainst, votesAbstain, votingDeadline,
               deadlineReminderSentAt, voteThreshold, abstentionHandling,
               tieBreakRule, chairCastingVote, revoteOfRound, voteBase,
               decisionStage

Its only declared link is decisionStage. The spec seeds the other side of the same non-existent shape:

relations: [{ register: 'decidiq', schema: 'motion', id: motionId }]

So neither side ever established the link. LiveMeeting.vue:560 already documents the dialect and warns against exactly this — a query key that is not a real schema property is classified as an object-field filter, and applyObjectFilters() appends 1 = 0.

Why it passed until now: the filter was inert, so fetchCurrentRound() effectively saw every voting-round in the register — and the test's own round was the only row. #957's register.d/70-configurable-types.json seeds three voting-rounds, so open || recent now selects a seeded one:

Expected substring: "Qualified majority (3/4)"        ← the test's seed, base 10
Received string:    "Rules: Simple majority (50%+1) · Abstentions excluded
                     from base · Tie: chair decides — base: 0"

That received string is the seed data (voteThreshold: simple-majority, no votes → base 0), not a component default — the rules paragraph only renders when currentRound is truthy. :222 is the same cause: its result-voting-rules block never renders because the round it finds is not the closed one it seeded.

The decision needed: how should a VotingRound be scoped to a Motion — through decisionStage, or by adding a real motion property? Once that is settled, the panel filter, the two seeds and the assertions all follow. I did not guess at it.

3. crud-persistence.spec.ts:405 — meeting edit does not persist

Expected: "e2e-1788018432457-5433-meeting-editbug-edited"
Received: "e2e-1788018432457-5433-meeting-editbug"

The dialog closes, but the object keeps its old title. #957 also touched the meeting surfaces (MeetingCalendarView.vue, MeetingViewToggle.vue, UpcomingMeetingsListWidget.vue) and added meeting-type configurable types, so this is most likely the same change — but I did not trace it to a specific mechanism and it should not be assumed.


cc the #957 author — the diagnosis above is also in #967's description.

Metadata

Metadata

Assignees

Labels

triageAwaiting triage

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions