Files
nairobi/spec/system/legislation/proposals_spec.rb
Javi Martín 9427f01442 Use system specs instead of feature specs
We get rid of database cleaner, and JavaScript tests are faster because
between tests we now rollback transactions instead of truncating the
database.
2020-04-24 15:43:54 +02:00

213 lines
7.4 KiB
Ruby

require "rails_helper"
require "sessions_helper"
describe "Legislation Proposals" do
let(:user) { create(:user) }
let(:process) { create(:legislation_process) }
let(:proposal) { create(:legislation_proposal) }
context "Concerns" do
it_behaves_like "notifiable in-app", :legislation_proposal
end
scenario "Only one menu element has 'active' CSS selector" do
visit legislation_process_proposal_path(proposal.process, proposal)
within("#navigation_bar") do
expect(page).to have_css(".is-active", count: 1)
end
end
describe "Random pagination" do
let(:per_page) { 4 }
before do
allow(Legislation::Proposal).to receive(:default_per_page).and_return(per_page)
create_list(
:legislation_proposal,
(Legislation::Proposal.default_per_page + 2),
process: process
)
end
context "for several users" do
let(:user2) { create(:user) }
let(:per_page) { 12 }
scenario "Each user has a different and consistent random proposals order", :js do
first_user_proposals_order = nil
second_user_proposals_order = nil
in_browser(:one) do
login_as user
visit legislation_process_proposals_path(process)
first_user_proposals_order = legislation_proposals_order
end
in_browser(:two) do
login_as user2
visit legislation_process_proposals_path(process)
second_user_proposals_order = legislation_proposals_order
end
expect(first_user_proposals_order).not_to eq(second_user_proposals_order)
in_browser(:one) do
visit legislation_process_proposals_path(process)
expect(legislation_proposals_order).to eq(first_user_proposals_order)
end
in_browser(:two) do
visit legislation_process_proposals_path(process)
expect(legislation_proposals_order).to eq(second_user_proposals_order)
end
end
end
scenario "Random order maintained with pagination", :js do
login_as user
visit legislation_process_proposals_path(process)
first_page_proposals_order = legislation_proposals_order
click_link "Next"
expect(page).to have_content "You're on page\n2"
expect(first_page_proposals_order & legislation_proposals_order).to eq([])
click_link "Previous"
expect(page).to have_content "You're on page\n1"
expect(legislation_proposals_order).to eq(first_page_proposals_order)
end
scenario "Does not crash when the seed is not a number" do
login_as user
visit legislation_process_proposals_path(process, random_seed: "Spoof")
expect(page).to have_content "You're on page 1"
end
end
context "Selected filter" do
scenario "apperars even if there are not any selected poposals" do
create(:legislation_proposal, legislation_process_id: process.id)
visit legislation_process_proposals_path(process)
expect(page).to have_content("Selected")
end
scenario "defaults to winners if there are selected proposals" do
create(:legislation_proposal, legislation_process_id: process.id)
create(:legislation_proposal, legislation_process_id: process.id, selected: true)
visit legislation_process_proposals_path(process)
expect(page).to have_link("Random")
expect(page).not_to have_link("Selected")
expect(page).to have_content("Selected")
end
scenario "defaults to random if the current process does not have selected proposals" do
create(:legislation_proposal, legislation_process_id: process.id)
create(:legislation_proposal, selected: true)
visit legislation_process_proposals_path(process)
expect(page).to have_link("Selected")
expect(page).not_to have_link("Random")
expect(page).to have_content("Random")
end
scenario "filters correctly" do
proposal1 = create(:legislation_proposal, legislation_process_id: process.id)
proposal2 = create(:legislation_proposal, legislation_process_id: process.id, selected: true)
visit legislation_process_proposals_path(process, filter: "random")
click_link "Selected"
expect(page).to have_css("div#legislation_proposal_#{proposal2.id}")
expect(page).not_to have_css("div#legislation_proposal_#{proposal1.id}")
end
end
def legislation_proposals_order
all("[id^='legislation_proposal_']").map { |e| e[:id] }
end
scenario "Create a legislation proposal with an image", :js do
create(:legislation_proposal, process: process)
login_as user
visit new_legislation_process_proposal_path(process)
fill_in "Proposal title", with: "Legislation proposal with image"
fill_in "Proposal summary", with: "Including an image on a legislation proposal"
imageable_attach_new_file(create(:image), Rails.root.join("spec/fixtures/files/clippy.jpg"))
check "legislation_proposal_terms_of_service"
click_button "Create proposal"
expect(page).to have_content "Legislation proposal with image"
expect(page).to have_content "Including an image on a legislation proposal"
expect(page).to have_css("img[alt='#{Legislation::Proposal.last.image.title}']")
end
scenario "Show votes score on index and show" do
legislation_proposal_positive = create(:legislation_proposal,
legislation_process_id: process.id,
title: "Legislation proposal positive")
legislation_proposal_zero = create(:legislation_proposal,
legislation_process_id: process.id,
title: "Legislation proposal zero")
legislation_proposal_negative = create(:legislation_proposal,
legislation_process_id: process.id,
title: "Legislation proposal negative")
10.times { create(:vote, votable: legislation_proposal_positive, vote_flag: true) }
3.times { create(:vote, votable: legislation_proposal_positive, vote_flag: false) }
5.times { create(:vote, votable: legislation_proposal_zero, vote_flag: true) }
5.times { create(:vote, votable: legislation_proposal_zero, vote_flag: false) }
6.times { create(:vote, votable: legislation_proposal_negative, vote_flag: false) }
visit legislation_process_proposals_path(process)
within "#legislation_proposal_#{legislation_proposal_positive.id}" do
expect(page).to have_content("7 votes")
end
within "#legislation_proposal_#{legislation_proposal_zero.id}" do
expect(page).to have_content("No votes")
end
within "#legislation_proposal_#{legislation_proposal_negative.id}" do
expect(page).to have_content("-6 votes")
end
visit legislation_process_proposal_path(process, legislation_proposal_positive)
expect(page).to have_content("7 votes")
visit legislation_process_proposal_path(process, legislation_proposal_zero)
expect(page).to have_content("No votes")
visit legislation_process_proposal_path(process, legislation_proposal_negative)
expect(page).to have_content("-6 votes")
end
scenario "Show link to process on show" do
create(:legislation_proposal, legislation_process_id: process.id)
visit legislation_process_proposal_path(proposal.process, proposal)
within(".process-proposal") do
expect(page).to have_content("Collaborative legislation process")
expect(page).to have_link(process.title)
end
end
end