500 lines
15 KiB
Ruby
500 lines
15 KiB
Ruby
require "rails_helper"
|
|
|
|
feature "Admin polls" do
|
|
|
|
background do
|
|
admin = create(:administrator)
|
|
login_as(admin.user)
|
|
end
|
|
|
|
it_behaves_like "translatable",
|
|
"poll",
|
|
"edit_admin_poll_path",
|
|
%w[name summary description]
|
|
|
|
scenario "Index empty", :js do
|
|
visit admin_root_path
|
|
|
|
click_link "Polls"
|
|
|
|
expect(page).to have_content "There are no polls"
|
|
end
|
|
|
|
scenario "Index show polls list order by starts at date", :js do
|
|
poll_1 = create(:poll, name: "Poll first", starts_at: 15.days.ago)
|
|
poll_2 = create(:poll, name: "Poll second", starts_at: 1.month.ago)
|
|
poll_3 = create(:poll, name: "Poll third", starts_at: 2.days.ago)
|
|
|
|
visit admin_root_path
|
|
|
|
click_link "Polls"
|
|
|
|
expect(page).to have_content "List of polls"
|
|
expect(page).to have_css ".poll", count: 3
|
|
|
|
polls = Poll.all
|
|
polls.each do |poll|
|
|
within("#poll_#{poll.id}") do
|
|
expect(page).to have_content poll.name
|
|
end
|
|
end
|
|
|
|
expect(poll_3.name).to appear_before(poll_1.name)
|
|
expect(poll_1.name).to appear_before(poll_2.name)
|
|
expect(page).not_to have_content "There are no polls"
|
|
end
|
|
|
|
scenario "Show" do
|
|
poll = create(:poll)
|
|
|
|
visit admin_polls_path
|
|
click_link poll.name
|
|
|
|
expect(page).to have_content poll.name
|
|
end
|
|
|
|
scenario "Create" do
|
|
visit admin_polls_path
|
|
click_link "Create poll"
|
|
|
|
start_date = 1.week.from_now
|
|
end_date = 2.weeks.from_now
|
|
|
|
fill_in "Name", with: "Upcoming poll"
|
|
fill_in "poll_starts_at", with: start_date.strftime("%d/%m/%Y")
|
|
fill_in "poll_ends_at", with: end_date.strftime("%d/%m/%Y")
|
|
fill_in "Summary", with: "Upcoming poll's summary. This poll..."
|
|
fill_in "Description", with: "Upcomming poll's description. This poll..."
|
|
|
|
expect(page).not_to have_css("#poll_results_enabled")
|
|
expect(page).not_to have_css("#poll_stats_enabled")
|
|
|
|
click_button "Create poll"
|
|
|
|
expect(page).to have_content "Poll created successfully"
|
|
expect(page).to have_content "Upcoming poll"
|
|
expect(page).to have_content I18n.l(start_date.to_date)
|
|
expect(page).to have_content I18n.l(end_date.to_date)
|
|
end
|
|
|
|
scenario "Edit" do
|
|
poll = create(:poll)
|
|
create(:image, imageable: poll)
|
|
|
|
visit admin_poll_path(poll)
|
|
click_link "Edit poll"
|
|
|
|
end_date = 1.year.from_now
|
|
|
|
expect(page).to have_css("img[alt='#{poll.image.title}']")
|
|
|
|
fill_in "Name", with: "Next Poll"
|
|
fill_in "poll_ends_at", with: end_date.strftime("%d/%m/%Y")
|
|
|
|
click_button "Update poll"
|
|
|
|
expect(page).to have_content "Poll updated successfully"
|
|
expect(page).to have_content "Next Poll"
|
|
expect(page).to have_content I18n.l(end_date.to_date)
|
|
end
|
|
|
|
scenario "Edit from index" do
|
|
poll = create(:poll)
|
|
visit admin_polls_path
|
|
|
|
within("#poll_#{poll.id}") do
|
|
click_link "Edit"
|
|
end
|
|
|
|
expect(page).to have_current_path(edit_admin_poll_path(poll))
|
|
end
|
|
|
|
context "Destroy" do
|
|
|
|
scenario "Can destroy poll without questions", :js do
|
|
poll = create(:poll)
|
|
|
|
visit admin_polls_path
|
|
|
|
within("#poll_#{poll.id}") do
|
|
accept_confirm { click_link "Delete" }
|
|
end
|
|
|
|
expect(page).to have_content("Poll deleted successfully")
|
|
expect(page).to have_content("There are no polls.")
|
|
end
|
|
|
|
scenario "Can destroy poll with questions and answers", :js do
|
|
poll = create(:poll)
|
|
question = create(:poll_question, poll: poll)
|
|
create(:poll_question_answer, question: question, title: "Yes")
|
|
create(:poll_question_answer, question: question, title: "No")
|
|
|
|
visit admin_polls_path
|
|
|
|
within("#poll_#{poll.id}") do
|
|
accept_confirm { click_link "Delete" }
|
|
end
|
|
|
|
expect(page).to have_content("Poll deleted successfully")
|
|
expect(page).not_to have_content(poll.name)
|
|
expect(Poll::Question.count).to eq(0)
|
|
expect(Poll::Question::Answer.count). to eq(0)
|
|
end
|
|
|
|
scenario "Can't destroy poll with votes", :js do
|
|
poll = create(:poll)
|
|
create(:poll_question, poll: poll)
|
|
create(:poll_voter, :from_booth, :valid_document, poll: poll)
|
|
|
|
visit admin_polls_path
|
|
|
|
within("#poll_#{poll.id}") do
|
|
accept_confirm { click_link "Delete" }
|
|
end
|
|
|
|
expect(page).to have_content("You cannot delete a poll that has votes")
|
|
expect(page).to have_content(poll.name)
|
|
end
|
|
end
|
|
|
|
context "Booths" do
|
|
|
|
context "Poll show" do
|
|
|
|
scenario "No booths" do
|
|
poll = create(:poll)
|
|
visit admin_poll_path(poll)
|
|
click_link "Booths (0)"
|
|
|
|
expect(page).to have_content "There are no booths assigned to this poll."
|
|
end
|
|
|
|
scenario "Booth list" do
|
|
poll = create(:poll)
|
|
3.times { create(:poll_booth, polls: [poll]) }
|
|
|
|
visit admin_poll_path(poll)
|
|
click_link "Booths (3)"
|
|
|
|
expect(page).to have_css ".booth", count: 3
|
|
|
|
poll.booth_assignments.each do |ba|
|
|
within("#poll_booth_assignment_#{ba.id}") do
|
|
expect(page).to have_content ba.booth.name
|
|
expect(page).to have_content ba.booth.location
|
|
end
|
|
end
|
|
expect(page).not_to have_content "There are no booths assigned to this poll."
|
|
end
|
|
end
|
|
end
|
|
|
|
context "Officers" do
|
|
|
|
context "Poll show" do
|
|
|
|
scenario "No officers", :js do
|
|
poll = create(:poll)
|
|
visit admin_poll_path(poll)
|
|
click_link "Officers (0)"
|
|
|
|
expect(page).to have_content "There are no officers assigned to this poll"
|
|
end
|
|
|
|
scenario "Officer list", :js do
|
|
poll = create(:poll)
|
|
booth = create(:poll_booth, polls: [poll])
|
|
|
|
booth.booth_assignments.each do |booth_assignment|
|
|
3.times {create(:poll_officer_assignment, booth_assignment: booth_assignment) }
|
|
end
|
|
|
|
visit admin_poll_path(poll)
|
|
|
|
click_link "Officers (3)"
|
|
|
|
expect(page).to have_css ".officer", count: 3
|
|
|
|
officers = Poll::Officer.all
|
|
officers.each do |officer|
|
|
within("#officer_#{officer.id}") do
|
|
expect(page).to have_content officer.name
|
|
expect(page).to have_content officer.email
|
|
end
|
|
end
|
|
expect(page).not_to have_content "There are no officers assigned to this poll"
|
|
end
|
|
end
|
|
end
|
|
|
|
context "Questions" do
|
|
|
|
context "Poll show" do
|
|
|
|
scenario "Question list", :js do
|
|
poll = create(:poll)
|
|
question = create(:poll_question, poll: poll)
|
|
other_question = create(:poll_question)
|
|
|
|
visit admin_poll_path(poll)
|
|
|
|
expect(page).to have_content "Questions (1)"
|
|
expect(page).to have_content question.title
|
|
expect(page).not_to have_content other_question.title
|
|
expect(page).not_to have_content "There are no questions assigned to this poll"
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
context "Recounting" do
|
|
context "Poll show" do
|
|
scenario "No recounts", :js do
|
|
poll = create(:poll)
|
|
visit admin_poll_path(poll)
|
|
click_link "Recounting"
|
|
|
|
expect(page).to have_content "There is nothing to be recounted"
|
|
end
|
|
|
|
scenario "Recounts list", :js do
|
|
poll = create(:poll)
|
|
booth_assignment = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment_recounted = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment_final_recounted = create(:poll_booth_assignment, poll: poll)
|
|
|
|
3.times do |i|
|
|
create(:poll_recount,
|
|
booth_assignment: booth_assignment,
|
|
date: poll.starts_at + i.days,
|
|
total_amount: 21)
|
|
end
|
|
|
|
2.times do
|
|
create(:poll_voter, poll: poll, booth_assignment: booth_assignment_final_recounted)
|
|
end
|
|
|
|
create(:poll_recount,
|
|
booth_assignment: booth_assignment_final_recounted,
|
|
date: poll.ends_at,
|
|
total_amount: 55555)
|
|
|
|
visit admin_poll_path(poll)
|
|
|
|
click_link "Recounting"
|
|
|
|
within("#totals") do
|
|
within("#total_final") do
|
|
expect(page).to have_content("#{55555 + 63}")
|
|
end
|
|
|
|
within("#total_system") do
|
|
expect(page).to have_content("2")
|
|
end
|
|
end
|
|
|
|
expect(page).to have_css ".booth_recounts", count: 3
|
|
|
|
within("#poll_booth_assignment_#{booth_assignment.id}_recounts") do
|
|
expect(page).to have_content(booth_assignment.booth.name)
|
|
expect(page).to have_content("63")
|
|
end
|
|
|
|
within("#poll_booth_assignment_#{booth_assignment_recounted.id}_recounts") do
|
|
expect(page).to have_content(booth_assignment_recounted.booth.name)
|
|
expect(page).to have_content("-")
|
|
end
|
|
|
|
within("#poll_booth_assignment_#{booth_assignment_final_recounted.id}_recounts") do
|
|
expect(page).to have_content(booth_assignment_final_recounted.booth.name)
|
|
expect(page).to have_content("55555")
|
|
expect(page).to have_content("2")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "Results" do
|
|
context "Poll show" do
|
|
scenario "No results", :js do
|
|
poll = create(:poll)
|
|
visit admin_poll_path(poll)
|
|
click_link "Results"
|
|
|
|
expect(page).to have_content "There are no results"
|
|
end
|
|
|
|
scenario "Show partial results" do
|
|
poll = create(:poll)
|
|
|
|
booth_assignment_1 = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment_2 = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment_3 = create(:poll_booth_assignment, poll: poll)
|
|
|
|
question_1 = create(:poll_question, poll: poll)
|
|
create(:poll_question_answer, title: "Oui", question: question_1)
|
|
create(:poll_question_answer, title: "Non", question: question_1)
|
|
|
|
question_2 = create(:poll_question, poll: poll)
|
|
create(:poll_question_answer, title: "Aujourd'hui", question: question_2)
|
|
create(:poll_question_answer, title: "Demain", question: question_2)
|
|
|
|
[booth_assignment_1, booth_assignment_2, booth_assignment_3].each do |ba|
|
|
create(:poll_partial_result,
|
|
booth_assignment: ba,
|
|
question: question_1,
|
|
answer: "Oui",
|
|
amount: 11)
|
|
|
|
create(:poll_partial_result,
|
|
booth_assignment: ba,
|
|
question: question_2,
|
|
answer: "Demain",
|
|
amount: 5)
|
|
end
|
|
|
|
create(:poll_recount,
|
|
booth_assignment: booth_assignment_1,
|
|
white_amount: 21,
|
|
null_amount: 44,
|
|
total_amount: 66)
|
|
|
|
visit admin_poll_results_path(poll)
|
|
|
|
expect(page).to have_content "Results by booth"
|
|
end
|
|
|
|
scenario "Enable stats and results for booth polls" do
|
|
unvoted_poll = create(:poll)
|
|
|
|
voted_poll = create(:poll)
|
|
create(:poll_voter, :from_booth, :valid_document, poll: voted_poll)
|
|
|
|
visit admin_poll_results_path(unvoted_poll)
|
|
|
|
expect(page).to have_content "There are no results"
|
|
expect(page).not_to have_content "Show results and stats"
|
|
|
|
visit admin_poll_results_path(voted_poll)
|
|
|
|
expect(page).to have_content "Show results and stats"
|
|
expect(page).not_to have_content "There are no results"
|
|
end
|
|
|
|
scenario "Enable stats and results for online polls" do
|
|
unvoted_poll = create(:poll)
|
|
|
|
voted_poll = create(:poll)
|
|
create(:poll_voter, poll: voted_poll)
|
|
|
|
visit admin_poll_results_path(unvoted_poll)
|
|
|
|
expect(page).to have_content "There are no results"
|
|
expect(page).not_to have_content "Show results and stats"
|
|
|
|
visit admin_poll_results_path(voted_poll)
|
|
|
|
expect(page).to have_content "Show results and stats"
|
|
expect(page).not_to have_content "There are no results"
|
|
expect(page).not_to have_content "Results by booth"
|
|
end
|
|
|
|
scenario "Results by answer", :js do
|
|
poll = create(:poll)
|
|
booth_assignment_1 = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment_2 = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment_3 = create(:poll_booth_assignment, poll: poll)
|
|
|
|
question_1 = create(:poll_question, poll: poll)
|
|
create(:poll_question_answer, title: "Yes", question: question_1)
|
|
create(:poll_question_answer, title: "No", question: question_1)
|
|
|
|
question_2 = create(:poll_question, poll: poll)
|
|
create(:poll_question_answer, title: "Today", question: question_2)
|
|
create(:poll_question_answer, title: "Tomorrow", question: question_2)
|
|
|
|
[booth_assignment_1, booth_assignment_2, booth_assignment_3].each do |ba|
|
|
create(:poll_partial_result,
|
|
booth_assignment: ba,
|
|
question: question_1,
|
|
answer: "Yes",
|
|
amount: 11)
|
|
create(:poll_partial_result,
|
|
booth_assignment: ba,
|
|
question: question_2,
|
|
answer: "Tomorrow",
|
|
amount: 5)
|
|
end
|
|
create(:poll_recount,
|
|
booth_assignment: booth_assignment_1,
|
|
white_amount: 21,
|
|
null_amount: 44,
|
|
total_amount: 66)
|
|
|
|
visit admin_poll_path(poll)
|
|
|
|
click_link "Results"
|
|
|
|
expect(page).to have_content(question_1.title)
|
|
question_1.question_answers.each_with_index do |answer, i|
|
|
within("#question_#{question_1.id}_#{i}_result") do
|
|
expect(page).to have_content(answer.title)
|
|
expect(page).to have_content([33, 0][i])
|
|
end
|
|
end
|
|
|
|
expect(page).to have_content(question_2.title)
|
|
question_2.question_answers.each_with_index do |answer, i|
|
|
within("#question_#{question_2.id}_#{i}_result") do
|
|
expect(page).to have_content(answer.title)
|
|
expect(page).to have_content([0, 15][i])
|
|
end
|
|
end
|
|
|
|
within("#white_results") { expect(page).to have_content("21") }
|
|
within("#null_results") { expect(page).to have_content("44") }
|
|
within("#total_results") { expect(page).to have_content("66") }
|
|
end
|
|
|
|
scenario "Link to results by booth" do
|
|
poll = create(:poll)
|
|
booth_assignment1 = create(:poll_booth_assignment, poll: poll)
|
|
booth_assignment2 = create(:poll_booth_assignment, poll: poll)
|
|
|
|
question = create(:poll_question, poll: poll)
|
|
create(:poll_question_answer, title: "Yes", question: question)
|
|
create(:poll_question_answer, title: "No", question: question)
|
|
|
|
create(:poll_partial_result,
|
|
booth_assignment: booth_assignment1,
|
|
question: question,
|
|
answer: "Yes",
|
|
amount: 5)
|
|
|
|
create(:poll_partial_result,
|
|
booth_assignment: booth_assignment2,
|
|
question: question,
|
|
answer: "Yes",
|
|
amount: 6)
|
|
|
|
visit admin_poll_path(poll)
|
|
|
|
click_link "Results"
|
|
|
|
expect(page).to have_link("See results", count: 2)
|
|
|
|
within("#booth_assignment_#{booth_assignment1.id}_result") do
|
|
click_link "See results"
|
|
end
|
|
|
|
expect(page).to have_content booth_assignment1.booth.name
|
|
expect(page).to have_content "Results"
|
|
expect(page).to have_content "Yes"
|
|
expect(page).to have_content "5"
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|