As mentioned in commits likea586ba806,a7664ad81,006128da5,b41fbfa52andc480cdd91, accessing the database after starting the browser with the `visit` method sometimes results in database corruption and failing tests on our CI due to the process running the test accessing the database after the process running the browser has started. In these cases, there's no need to check the database; we're already checking the application behavior that shows that the voters have been correctly created.
267 lines
7.9 KiB
Ruby
267 lines
7.9 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Voter" do
|
|
context "Origin", :with_frozen_time do
|
|
let(:poll) { create(:poll) }
|
|
let!(:question) { create(:poll_question, :yes_no, poll: poll) }
|
|
let(:booth) { create(:poll_booth) }
|
|
let(:officer) { create(:poll_officer) }
|
|
let(:admin) { create(:administrator) }
|
|
|
|
before do
|
|
create(:geozone, :in_census)
|
|
create(:poll_shift, officer: officer, booth: booth, date: Date.current, task: :vote_collection)
|
|
create(:poll_officer_assignment, officer: officer, poll: poll, booth: booth)
|
|
end
|
|
|
|
scenario "Voting via web - Standard" do
|
|
user = create(:user, :level_two)
|
|
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
within("#poll_question_#{question.id}_options") do
|
|
click_button "Vote Yes"
|
|
|
|
expect(page).to have_button("You have voted Yes")
|
|
expect(page).not_to have_button("Vote Yes")
|
|
end
|
|
|
|
refresh
|
|
|
|
expect(page).to have_content("You have already participated in this poll.")
|
|
expect(page).to have_content("If you vote again it will be overwritten")
|
|
end
|
|
|
|
scenario "Remove vote via web - Standard" do
|
|
user = create(:user, :level_two)
|
|
create(:poll_answer, question: question, author: user, answer: "Yes")
|
|
create(:poll_voter, poll: poll, user: user)
|
|
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_content("You have already participated in this poll.")
|
|
expect(page).to have_content("If you vote again it will be overwritten")
|
|
|
|
within("#poll_question_#{question.id}_options") do
|
|
click_button "You have voted Yes"
|
|
|
|
expect(page).to have_button("Vote Yes")
|
|
expect(page).to have_button("Vote No")
|
|
end
|
|
|
|
refresh
|
|
|
|
expect(page).not_to have_content("You have already participated in this poll.")
|
|
expect(page).not_to have_content("If you vote again it will be overwritten")
|
|
end
|
|
|
|
scenario "Voting via web as unverified user" do
|
|
user = create(:user, :incomplete_verification)
|
|
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
within("#poll_question_#{question.id}_options") do
|
|
expect(page).to have_link("Yes", href: verification_path)
|
|
expect(page).to have_link("No", href: verification_path)
|
|
end
|
|
|
|
expect(page).to have_content "You must verify your account in order to answer"
|
|
expect(page).not_to have_content "You have already participated in this poll. " \
|
|
"If you vote again it will be overwritten"
|
|
end
|
|
|
|
scenario "Voting in booth" do
|
|
login_through_form_as_officer(officer)
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
expect(page).to have_content poll.name
|
|
|
|
within("#poll_#{poll.id}") do
|
|
click_button("Confirm vote")
|
|
expect(page).not_to have_button("Confirm vote")
|
|
expect(page).to have_content("Vote introduced!")
|
|
end
|
|
|
|
logout
|
|
login_as(admin.user)
|
|
visit admin_poll_recounts_path(poll)
|
|
|
|
within("#total_system") do
|
|
expect(page).to have_content "1"
|
|
end
|
|
|
|
within "tr", text: booth.name do
|
|
expect(page).to have_content "1"
|
|
end
|
|
end
|
|
|
|
context "The person has decided not to vote at this time" do
|
|
before { create(:user, :in_census) }
|
|
|
|
scenario "Show not to vote at this time button" do
|
|
login_through_form_as_officer(officer)
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
expect(page).to have_content poll.name
|
|
expect(page).to have_button "Confirm vote"
|
|
expect(page).to have_content "Can vote"
|
|
expect(page).to have_link "The person has decided not to vote at this time"
|
|
end
|
|
|
|
scenario "Hides not to vote at this time button if already voted" do
|
|
login_through_form_as_officer(officer)
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
within("#poll_#{poll.id}") do
|
|
click_button("Confirm vote")
|
|
expect(page).not_to have_button("Confirm vote")
|
|
expect(page).to have_content "Vote introduced!"
|
|
expect(page).not_to have_content "The person has decided not to vote at this time"
|
|
end
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
expect(page).to have_content "Has already participated in this poll"
|
|
expect(page).not_to have_content "The person has decided not to vote at this time"
|
|
end
|
|
end
|
|
|
|
context "Trying to vote the same poll in booth and web" do
|
|
let!(:user) { create(:user, :in_census) }
|
|
|
|
scenario "Trying to vote in web and then in booth" do
|
|
login_as user
|
|
vote_for_poll_via_web(poll, question, "Yes")
|
|
|
|
logout
|
|
login_through_form_as_officer(officer)
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
expect(page).to have_content poll.name
|
|
expect(page).not_to have_button "Confirm vote"
|
|
expect(page).to have_content "Has already participated in this poll"
|
|
end
|
|
|
|
scenario "Trying to vote in booth and then in web" do
|
|
login_through_form_as_officer(officer)
|
|
|
|
vote_for_poll_via_booth
|
|
|
|
logout
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
within("#poll_question_#{question.id}_options") do
|
|
expect(page).not_to have_button("Yes")
|
|
end
|
|
expect(page).to have_content "You have already participated in a physical booth. " \
|
|
"You can not participate again."
|
|
|
|
logout
|
|
login_as(admin.user)
|
|
visit admin_poll_recounts_path(poll)
|
|
|
|
within("#total_system") do
|
|
expect(page).to have_content "1"
|
|
end
|
|
|
|
within "tr", text: booth.name do
|
|
expect(page).to have_content "1"
|
|
end
|
|
end
|
|
end
|
|
|
|
scenario "Voting in poll and then verifiying account" do
|
|
allow_any_instance_of(Verification::Sms).to receive(:generate_confirmation_code).and_return("1357")
|
|
user = create(:user)
|
|
|
|
login_through_form_as_officer(officer)
|
|
vote_for_poll_via_booth
|
|
|
|
logout
|
|
login_as user
|
|
visit account_path
|
|
click_link "Verify my account"
|
|
|
|
verify_residence
|
|
confirm_phone(code: "1357")
|
|
|
|
visit poll_path(poll)
|
|
|
|
within("#poll_question_#{question.id}_options") do
|
|
expect(page).not_to have_button("Yes")
|
|
end
|
|
|
|
expect(page).to have_content "You have already participated in a physical booth. " \
|
|
"You can not participate again."
|
|
|
|
logout
|
|
login_as(admin.user)
|
|
visit admin_poll_recounts_path(poll)
|
|
|
|
within("#total_system") do
|
|
expect(page).to have_content "1"
|
|
end
|
|
|
|
within "tr", text: booth.name do
|
|
expect(page).to have_content "1"
|
|
end
|
|
end
|
|
|
|
context "Side menu" do
|
|
scenario "'Validate document' menu item with votable polls" do
|
|
login_through_form_as_officer(officer)
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
expect(page).to have_content poll.name
|
|
|
|
within("#side_menu") do
|
|
expect(page).not_to have_content("Validate document")
|
|
end
|
|
|
|
within("#poll_#{poll.id}") do
|
|
click_button("Confirm vote")
|
|
expect(page).to have_content "Vote introduced!"
|
|
end
|
|
|
|
within("#side_menu") do
|
|
expect(page).to have_content("Validate document")
|
|
end
|
|
end
|
|
|
|
scenario "'Validate document' menu item without votable polls" do
|
|
create(:poll_voter, poll: poll, user: create(:user, :in_census))
|
|
|
|
login_through_form_as_officer(officer)
|
|
|
|
visit new_officing_residence_path
|
|
officing_verify_residence
|
|
|
|
expect(page).to have_content poll.name
|
|
|
|
within("#poll_#{poll.id}") do
|
|
expect(page).to have_content "Has already participated in this poll"
|
|
end
|
|
|
|
within("#side_menu") do
|
|
expect(page).to have_content("Validate document")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|