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 2" expect(first_page_proposals_order & legislation_proposals_order).to eq([]) click_link "Previous" expect(page).to have_content "You're on page 1" 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