We lose some variety in our answers, though, but on the plus side, we reduce the risk of trademark issues :P.
253 lines
7.0 KiB
Ruby
253 lines
7.0 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Polls" do
|
|
let!(:proposal) { create(:proposal, :draft) }
|
|
|
|
before do
|
|
login_as(proposal.author)
|
|
visit proposal_dashboard_path(proposal)
|
|
end
|
|
|
|
scenario "Has a link to polls feature" do
|
|
expect(page).to have_link("Polls")
|
|
end
|
|
|
|
scenario "Create a poll", :js do
|
|
click_link "Polls"
|
|
click_link "Create poll"
|
|
|
|
start_date = 1.week.from_now
|
|
end_date = 2.weeks.from_now
|
|
|
|
fill_in "poll_name", with: "Proposal 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 "poll_description", with: "Proposal's poll description. This poll..."
|
|
|
|
expect(page).not_to have_css("#poll_results_enabled")
|
|
expect(page).not_to have_css("#poll_stats_enabled")
|
|
|
|
click_link "Add question"
|
|
|
|
fill_in "Question", with: "First question"
|
|
|
|
click_link "Add answer"
|
|
|
|
fill_in "Answer", with: "First answer"
|
|
|
|
click_button "Create poll"
|
|
expect(page).to have_content "Poll created successfully"
|
|
expect(page).to have_content "Proposal poll"
|
|
expect(page).to have_content I18n.l(start_date.to_date)
|
|
end
|
|
|
|
scenario "Create a poll redirects back to form when invalid data", js: true do
|
|
click_link "Polls"
|
|
click_link "Create poll"
|
|
|
|
click_button "Create poll"
|
|
|
|
expect(page).to have_content("New poll")
|
|
end
|
|
|
|
scenario "Edit poll is allowed for upcoming polls" do
|
|
poll = create(:poll, related: proposal, starts_at: 1.week.from_now)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).to have_content("Edit survey")
|
|
|
|
click_link "Edit survey"
|
|
end
|
|
|
|
click_button "Update poll"
|
|
|
|
expect(page).to have_content "Poll updated successfully"
|
|
end
|
|
|
|
scenario "Edit poll redirects back when invalid data", js: true do
|
|
poll = create(:poll, related: proposal, starts_at: 1.week.from_now)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).to have_content("Edit survey")
|
|
|
|
click_link "Edit survey"
|
|
end
|
|
|
|
fill_in "poll_name", with: ""
|
|
|
|
click_button "Update poll"
|
|
|
|
expect(page).to have_content("Edit poll")
|
|
end
|
|
|
|
scenario "Edit poll is not allowed for current polls" do
|
|
poll = create(:poll, :current, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).not_to have_content("Edit survey")
|
|
end
|
|
end
|
|
|
|
scenario "Edit poll is not allowed for expired polls" do
|
|
poll = create(:poll, :expired, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).not_to have_content("Edit survey")
|
|
end
|
|
end
|
|
|
|
scenario "Edit poll should allow to remove questions", :js do
|
|
poll = create(:poll, related: proposal, starts_at: 1.week.from_now)
|
|
create(:poll_question, poll: poll)
|
|
create(:poll_question, poll: poll)
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
within "div#poll_#{poll.id}" do
|
|
click_link "Edit survey"
|
|
end
|
|
|
|
within ".js-questions" do
|
|
expect(page).to have_css ".nested-fields", count: 2
|
|
within first(".nested-fields") do
|
|
find("a.delete").click
|
|
end
|
|
expect(page).to have_css ".nested-fields", count: 1
|
|
end
|
|
|
|
click_button "Update poll"
|
|
visit edit_proposal_dashboard_poll_path(proposal, poll)
|
|
|
|
expect(page).to have_css ".nested-fields", count: 1
|
|
end
|
|
|
|
scenario "Edit poll should allow to remove answers", :js do
|
|
poll = create(:poll, related: proposal, starts_at: 1.week.from_now)
|
|
create(:poll_question, :yes_no, poll: poll)
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
within "div#poll_#{poll.id}" do
|
|
click_link "Edit survey"
|
|
end
|
|
|
|
within ".js-questions .js-answers" do
|
|
expect(page).to have_css ".nested-fields", count: 2
|
|
within first(".nested-fields") do
|
|
find("a.delete").click
|
|
end
|
|
expect(page).to have_css ".nested-fields", count: 1
|
|
end
|
|
|
|
click_button "Update poll"
|
|
visit edit_proposal_dashboard_poll_path(proposal, poll)
|
|
|
|
within ".js-questions .js-answers" do
|
|
expect(page).to have_css ".nested-fields", count: 1
|
|
end
|
|
end
|
|
|
|
scenario "Can destroy poll without responses", :js do
|
|
poll = create(:poll, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within("#poll_#{poll.id}") do
|
|
accept_confirm { click_link "Delete survey" }
|
|
end
|
|
|
|
expect(page).to have_content("Survey deleted successfully")
|
|
expect(page).not_to have_content(poll.name)
|
|
end
|
|
|
|
scenario "Can't destroy poll with responses", :js do
|
|
poll = create(:poll, related: proposal)
|
|
create(:poll_question, poll: poll)
|
|
create(:poll_voter, poll: poll)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within("#poll_#{poll.id}") do
|
|
accept_confirm { click_link "Delete survey" }
|
|
end
|
|
|
|
expect(page).to have_content("You cannot destroy a survey that has responses")
|
|
expect(page).to have_content(poll.name)
|
|
end
|
|
|
|
scenario "View results not available for upcoming polls" do
|
|
poll = create(:poll, related: proposal, starts_at: 1.week.from_now)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).not_to have_content("View results")
|
|
end
|
|
end
|
|
|
|
scenario "View results available for current polls" do
|
|
poll = create(:poll, :current, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).to have_content("View results")
|
|
end
|
|
end
|
|
|
|
scenario "View results available for expired polls" do
|
|
poll = create(:poll, :expired, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).to have_content("View results")
|
|
end
|
|
end
|
|
|
|
scenario "View results redirects to results in public zone", js: true do
|
|
poll = create(:poll, :expired, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
click_link "View results"
|
|
end
|
|
|
|
page.driver.browser.switch_to.window page.driver.browser.window_handles.last do
|
|
expect(page).to have_current_path(results_proposal_poll_path(proposal, poll))
|
|
end
|
|
end
|
|
|
|
scenario "Enable and disable results", :js do
|
|
create(:poll, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
check "Show results"
|
|
|
|
expect(find_field("Show results")).to be_checked
|
|
|
|
uncheck "Show results"
|
|
|
|
expect(find_field("Show results")).not_to be_checked
|
|
end
|
|
|
|
scenario "Poll card" do
|
|
poll = create(:poll, :expired, related: proposal)
|
|
|
|
visit proposal_dashboard_polls_path(proposal)
|
|
|
|
within "div#poll_#{poll.id}" do
|
|
expect(page).to have_content(I18n.l(poll.starts_at.to_date))
|
|
expect(page).to have_content(I18n.l(poll.ends_at.to_date))
|
|
expect(page).to have_link(poll.title)
|
|
expect(page).to have_link(poll.title, href: proposal_poll_path(proposal, poll))
|
|
expect(page).to have_link("View results", href: results_proposal_poll_path(proposal, poll))
|
|
end
|
|
end
|
|
end
|