In the officing tests, we were accessing `admin.user` after starting the browser with a `visit`. However, since `admin` is a method with a `let` block, the administrator isn't created in the database until we referenced the variable, meaning we were creating the database record in the middle of the test. Referencing the variable at the beginning of the test solves the issue. We were also creating records to call the `login_as` method in the users tests, so we're moving the code to create them before the first call to `visit`. In the notifiable test, we were doing a loop consisting of "create()" -> "visit" -> "create()" -> "visit!" -> (...), meaning we were creating the second user after the first `visit`. Creating every user before the first `visit` solves the issue.
270 lines
8.0 KiB
Ruby
270 lines
8.0 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
|
|
admin_user = admin.user
|
|
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
|
|
admin_user = admin.user
|
|
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)
|
|
admin_user = admin.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
|