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
86115func 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