The following code: ``` <span class="show-for-sr">You're on page</span> 1 ``` Will generate an element with `position: absolute`. When reading the contents, it's not clear whether this element is supposed to be in the same paragraph or in a different one. Currently Capybara treats it as if it were part of a different paragraph. Since this could be the way screen readers read the text, I'm changing the test to reflect this fact. We might change our minds in the future.
213 lines
7.4 KiB
Ruby
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
|