require 'rails_helper' feature 'Spending proposals' do let(:author) { create(:user, :level_two, username: 'Isabel') } background do Setting["feature.spending_proposals"] = true Setting['feature.spending_proposal_features.voting_allowed'] = true end scenario 'Index' do spending_proposals = [create(:spending_proposal), create(:spending_proposal), create(:spending_proposal, feasible: true)] unfeasible_spending_proposal = create(:spending_proposal, feasible: false) visit spending_proposals_path expect(page).to have_selector('#investment-projects .investment-project', count: 3) spending_proposals.each do |spending_proposal| within('#investment-projects') do expect(page).to have_content spending_proposal.title expect(page).to have_css("a[href='#{spending_proposal_path(spending_proposal)}']", text: spending_proposal.title) expect(page).to_not have_content(unfeasible_spending_proposal.title) end end end context("Search") do scenario 'Search by text' do spending_proposal1 = create(:spending_proposal, title: "Get Schwifty") spending_proposal2 = create(:spending_proposal, title: "Schwifty Hello") spending_proposal3 = create(:spending_proposal, title: "Do not show me") visit spending_proposals_path within(".expanded #search_form") do fill_in "search", with: "Schwifty" click_button "Search" end within("#investment-projects") do expect(page).to have_css('.investment-project', count: 2) expect(page).to have_content(spending_proposal1.title) expect(page).to have_content(spending_proposal2.title) expect(page).to_not have_content(spending_proposal3.title) end end end context("Filters") do scenario 'by geozone' do geozone1 = create(:geozone) spending_proposal1 = create(:spending_proposal, geozone: geozone1) spending_proposal2 = create(:spending_proposal, geozone: create(:geozone)) spending_proposal3 = create(:spending_proposal, geozone: geozone1) spending_proposal4 = create(:spending_proposal) visit spending_proposals_path within(".geozone") do click_link geozone1.name end within("#investment-projects") do expect(page).to have_css('.investment-project', count: 2) expect(page).to have_content(spending_proposal1.title) expect(page).to have_content(spending_proposal3.title) expect(page).to_not have_content(spending_proposal2.title) expect(page).to_not have_content(spending_proposal4.title) end end scenario 'by unfeasibility' do geozone1 = create(:geozone) spending_proposal1 = create(:spending_proposal, feasible: false) spending_proposal2 = create(:spending_proposal, feasible: true) spending_proposal3 = create(:spending_proposal) visit spending_proposals_path within("#sidebar") do click_link "Unfeasible" end within("#investment-projects") do expect(page).to have_css('.investment-project', count: 1) expect(page).to have_content(spending_proposal1.title) expect(page).to_not have_content(spending_proposal2.title) expect(page).to_not have_content(spending_proposal3.title) end end end scenario 'Create' do login_as(author) visit new_spending_proposal_path fill_in 'spending_proposal_title', with: 'Build a skyscraper' fill_in 'spending_proposal_description', with: 'I want to live in a high tower over the clouds' fill_in 'spending_proposal_external_url', with: 'http://http://skyscraperpage.com/' fill_in 'spending_proposal_association_name', with: 'People of the neighbourhood' select 'All city', from: 'spending_proposal_geozone_id' check 'spending_proposal_terms_of_service' click_button 'Create' expect(page).to have_content 'Spending proposal created successfully' expect(page).to have_content('Build a skyscraper') expect(page).to have_content('I want to live in a high tower over the clouds') expect(page).to have_content('Isabel') expect(page).to have_content('People of the neighbourhood') expect(page).to have_content('All city') end scenario 'Create with invisible_captcha honeypot field' do login_as(author) visit new_spending_proposal_path fill_in 'spending_proposal_title', with: 'I am a bot' fill_in 'spending_proposal_subtitle', with: 'This is the honeypot' fill_in 'spending_proposal_description', with: 'This is the description' select 'All city', from: 'spending_proposal_geozone_id' check 'spending_proposal_terms_of_service' click_button 'Create' expect(page.status_code).to eq(200) expect(page.html).to be_empty expect(current_path).to eq(spending_proposals_path) end scenario 'Create spending proposal too fast' do allow(InvisibleCaptcha).to receive(:timestamp_threshold).and_return(Float::INFINITY) login_as(author) visit new_spending_proposal_path fill_in 'spending_proposal_title', with: 'I am a bot' fill_in 'spending_proposal_description', with: 'This is the description' select 'All city', from: 'spending_proposal_geozone_id' check 'spending_proposal_terms_of_service' click_button 'Create' expect(page).to have_content 'Sorry, that was too quick! Please resubmit' expect(current_path).to eq(new_spending_proposal_path) end scenario 'Create notice' do login_as(author) visit new_spending_proposal_path fill_in 'spending_proposal_title', with: 'Build a skyscraper' fill_in 'spending_proposal_description', with: 'I want to live in a high tower over the clouds' fill_in 'spending_proposal_external_url', with: 'http://http://skyscraperpage.com/' fill_in 'spending_proposal_association_name', with: 'People of the neighbourhood' select 'All city', from: 'spending_proposal_geozone_id' check 'spending_proposal_terms_of_service' click_button 'Create' expect(page).to have_content 'Spending proposal created successfully' expect(page).to have_content 'You can access it from My activity' end scenario 'Errors on create' do login_as(author) visit new_spending_proposal_path click_button 'Create' expect(page).to have_content error_message end scenario "Show" do spending_proposal = create(:spending_proposal, geozone: create(:geozone), association_name: 'People of the neighbourhood') visit spending_proposal_path(spending_proposal) expect(page).to have_content(spending_proposal.title) expect(page).to have_content(spending_proposal.description) expect(page).to have_content(spending_proposal.author.name) expect(page).to have_content(spending_proposal.association_name) expect(page).to have_content(spending_proposal.geozone.name) within("#spending_proposal_code") do expect(page).to have_content(spending_proposal.id) end end end