We make the tests considerably faster, we make them more robust against changes in the number of records shown per page, and we generate enough records so the chance of randomly getting the same results twice in a row is extremely low.
149 lines
4.9 KiB
Ruby
149 lines
4.9 KiB
Ruby
require 'rails_helper'
|
|
require 'sessions_helper'
|
|
|
|
feature 'Legislation Proposals' do
|
|
|
|
let(:user) { create(:user) }
|
|
let(:user2) { 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
|
|
|
|
feature "Random pagination" do
|
|
before do
|
|
allow(Legislation::Proposal).to receive(:default_per_page).and_return(12)
|
|
|
|
create_list(
|
|
:legislation_proposal,
|
|
(Legislation::Proposal.default_per_page + 2),
|
|
process: process
|
|
)
|
|
end
|
|
|
|
scenario "Each user has a different and consistent random proposals order", :js do
|
|
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
|
|
|
|
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_']").collect { |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
|
|
end
|