JavaScript is used by about 98% of web users, so by testing without it enabled, we're only testing that the application works for a very reduced number of users. We proceeded this way in the past because CONSUL started using Rails 4.2 and truncating the database between JavaScript tests with database cleaner, which made these tests terribly slow. When we upgraded to Rails 5.1 and introduced system tests, we started using database transactions in JavaScript tests, making these tests much faster. So now we can use JavaScript tests everywhere without critically slowing down our test suite.
240 lines
8.3 KiB
Ruby
240 lines
8.3 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
|
|
it_behaves_like "flaggable", :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" 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" 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 "Random"
|
|
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" 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
|
|
|
|
scenario "Shows proposal tags as proposals filter" do
|
|
create(:legislation_proposal, process: process, tag_list: "Culture", title: "Open concert")
|
|
create(:legislation_proposal, process: process, tag_list: "Sports", title: "Baseball field")
|
|
|
|
visit legislation_process_proposals_path(process)
|
|
|
|
expect(page).to have_content "Open concert"
|
|
expect(page).to have_content "Baseball field"
|
|
|
|
click_link "Culture"
|
|
|
|
expect(page).not_to have_content "Baseball field"
|
|
expect(page).to have_content "Open concert"
|
|
end
|
|
|
|
scenario "Show proposal tags on show when SDG is enabled" do
|
|
Setting["feature.sdg"] = true
|
|
Setting["sdg.process.legislation"] = true
|
|
|
|
proposal = create(:legislation_proposal, process: process, tag_list: "Culture")
|
|
|
|
visit legislation_process_proposal_path(proposal.process, proposal)
|
|
|
|
expect(page).to have_link("Culture")
|
|
end
|
|
end
|