Skip to content

Commit 5f84de2

Browse files
committed
elections: support multi-question ballots
1 parent 60c9717 commit 5f84de2

6 files changed

Lines changed: 1106 additions & 560 deletions

File tree

e2e/elections_test.go

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"net/http"
55
"testing"
66

7+
"github.com/playwright-community/playwright-go"
78
"github.com/stretchr/testify/require"
89
)
910

@@ -22,11 +23,17 @@ func TestElections_AdminSettingsWorkflowAndMemberVoting(t *testing.T) {
2223

2324
require.NoError(t, adminPage.Locator("a:has-text('New election')").First().Click())
2425
require.NoError(t, adminPage.Locator("#title").Fill("Board Seat 2026"))
25-
require.NoError(t, adminPage.Locator("#question").Fill("Who should represent members?"))
2626
require.NoError(t, adminPage.Locator("#description").Fill("Choose the candidate you trust most."))
27-
optionInputs := adminPage.Locator("input[name='option_label']")
27+
questionInputs := adminPage.Locator("input[name='question_text']")
28+
require.NoError(t, questionInputs.Nth(0).Fill("Who should represent members?"))
29+
optionInputs := adminPage.Locator("input[name='option_label_0']")
2830
require.NoError(t, optionInputs.Nth(0).Fill("Ada Lovelace"))
2931
require.NoError(t, optionInputs.Nth(1).Fill("Grace Hopper"))
32+
require.NoError(t, adminPage.Locator("button:has-text('Add question')").Click())
33+
require.NoError(t, questionInputs.Nth(1).Fill("Which budget priority matters most?"))
34+
secondQuestionOptions := adminPage.Locator(".question-card").Nth(1).Locator("input.option-label")
35+
require.NoError(t, secondQuestionOptions.Nth(0).Fill("Tools"))
36+
require.NoError(t, secondQuestionOptions.Nth(1).Fill("Classes"))
3037
require.NoError(t, adminPage.Locator("button:has-text('Save draft')").Click())
3138
require.NoError(t, adminPage.WaitForURL("**/admin/config/elections/*"))
3239
expect(t).Locator(adminPage.GetByText("Private voting link")).ToBeVisible()
@@ -53,9 +60,17 @@ func TestElections_AdminSettingsWorkflowAndMemberVoting(t *testing.T) {
5360
require.NoError(t, err)
5461
expect(t).Locator(memberPage.GetByText("Board Seat 2026")).ToBeVisible()
5562
require.NoError(t, memberPage.Locator("label:has-text('Ada Lovelace') input").Check())
63+
require.NoError(t, memberPage.Locator("label:has-text('Tools') input").Check())
5664
require.NoError(t, memberPage.Locator("button:has-text('Submit vote')").Click())
5765
require.NoError(t, memberPage.WaitForURL("**/elections/*?voted=1"))
5866
expect(t).Locator(memberPage.GetByText("Your vote is recorded")).ToBeVisible()
67+
expect(t).Locator(memberPage.Locator("button:has-text('Vote submitted')")).ToBeVisible()
68+
expect(t).Locator(memberPage.Locator("button:has-text('Submit vote')")).ToHaveCount(0)
69+
resp, err = memberPage.Goto(shareURL)
70+
require.NoError(t, err)
71+
require.Equal(t, http.StatusOK, resp.Status())
72+
expect(t).Locator(memberPage.GetByText("Your vote is recorded and cannot be changed.")).ToBeVisible()
73+
expect(t).Locator(memberPage.Locator("button:has-text('Submit vote')")).ToHaveCount(0)
5974

6075
var voteCount, logCount int
6176
require.NoError(t, env.db.QueryRow(`SELECT COUNT(*) FROM election_votes WHERE election_id = ?`, electionID).Scan(&voteCount))
@@ -66,12 +81,14 @@ func TestElections_AdminSettingsWorkflowAndMemberVoting(t *testing.T) {
6681
_, err = adminPage.Goto(env.baseURL + "/admin/config/elections/" + electionID + "/results")
6782
require.NoError(t, err)
6883
expect(t).Locator(adminPage.GetByText("Ada Lovelace")).ToBeVisible()
84+
expect(t).Locator(adminPage.GetByText("Tools")).ToBeVisible()
6985
expect(t).Locator(adminPage.GetByText("1 votes")).ToBeVisible()
7086

7187
_, err = adminPage.Goto(env.baseURL + "/admin/config/elections/" + electionID + "/votes")
7288
require.NoError(t, err)
7389
expect(t).Locator(adminPage.GetByText("elections-voter@example.com")).ToBeVisible()
7490
expect(t).Locator(adminPage.GetByText("Ada Lovelace")).ToBeVisible()
91+
expect(t).Locator(adminPage.GetByText("Tools")).ToBeVisible()
7592

7693
_, err = adminPage.Goto(env.baseURL + "/admin/config/elections/" + electionID)
7794
require.NoError(t, err)
@@ -80,7 +97,19 @@ func TestElections_AdminSettingsWorkflowAndMemberVoting(t *testing.T) {
8097
_, err = memberPage.Goto(shareURL)
8198
require.NoError(t, err)
8299
expect(t).Locator(memberPage.GetByText("This election is closed")).ToBeVisible()
83-
expect(t).Locator(memberPage.Locator("button:has-text('Voting closed')")).ToBeVisible()
100+
expect(t).Locator(memberPage.Locator("button:has-text('Vote submitted')")).ToBeVisible()
101+
102+
_, err = adminPage.Goto(env.baseURL + "/admin/config/elections/" + electionID)
103+
require.NoError(t, err)
104+
adminPage.OnDialog(func(dialog playwright.Dialog) {
105+
require.Equal(t, "confirm", dialog.Type())
106+
require.NoError(t, dialog.Accept())
107+
})
108+
require.NoError(t, adminPage.Locator("button:has-text('Delete')").Click())
109+
require.NoError(t, adminPage.WaitForURL("**/admin/config/elections"))
110+
resp, err = memberPage.Goto(shareURL)
111+
require.NoError(t, err)
112+
require.Equal(t, http.StatusNotFound, resp.Status())
84113
}
85114

86115
func TestElections_OnlyActiveMembersCanVote(t *testing.T) {
@@ -104,7 +133,10 @@ func seedOpenElection(t *testing.T, env *TestEnv, adminID int64) string {
104133
VALUES ('11111111-1111-4111-8111-111111111111', ?, 'Seed Election', 'Pick one', 'open', 1)
105134
RETURNING id`, adminID).Scan(&id)
106135
require.NoError(t, err)
107-
_, err = env.db.Exec(`INSERT INTO election_options (election_id, position, label) VALUES (?, 1, 'One'), (?, 2, 'Two')`, id, id)
136+
var questionID int64
137+
err = env.db.QueryRow(`INSERT INTO election_questions (election_id, position, question, max_choices) VALUES (?, 1, 'Pick one', 1) RETURNING id`, id).Scan(&questionID)
138+
require.NoError(t, err)
139+
_, err = env.db.Exec(`INSERT INTO election_options (election_id, question_id, position, label) VALUES (?, ?, 1, 'One'), (?, ?, 2, 'Two')`, id, questionID, id, questionID)
108140
require.NoError(t, err)
109141
return id
110142
}

0 commit comments

Comments
 (0)