spec/features/management/proposals_spec.rb

Summary

Maintainability
A
50 mins
Test Coverage
require 'rails_helper'

feature 'Proposals' do

  background do
    login_as_manager
  end

  before do
    Setting['feature.map'] = nil
  end

  after do
    Setting['feature.map'] = nil
  end

  context "Create" do

    scenario 'Creating proposals on behalf of someone' do
      user = create(:user, :level_two)
      login_managed_user(user)

      click_link "Create proposal"

      within(".account-info") do
        expect(page).to have_content "Identified as"
        expect(page).to have_content user.username.to_s
        expect(page).to have_content user.email.to_s
        expect(page).to have_content user.document_number.to_s
      end

      fill_in 'proposal_title', with: 'Help refugees'
      fill_in 'proposal_question', with: '¿Would you like to give assistance to war refugees?'
      fill_in 'proposal_summary', with: 'In summary, what we want is...'
      fill_in 'proposal_description', with: 'This is very important because...'
      fill_in 'proposal_external_url', with: 'http://rescue.org/refugees'
      fill_in 'proposal_video_url', with: 'https://www.youtube.com/watch?v=yRYFKcMa_Ek'
      check 'proposal_terms_of_service'

      click_button 'Create proposal'

      expect(page).to have_content 'Proposal created successfully.'

      expect(page).to have_content 'Help refugees'
      expect(page).to have_content '¿Would you like to give assistance to war refugees?'
      expect(page).to have_content 'In summary, what we want is...'
      expect(page).to have_content 'This is very important because...'
      expect(page).to have_content 'http://rescue.org/refugees'
      expect(page).to have_content 'https://www.youtube.com/watch?v=yRYFKcMa_Ek'
      expect(page).to have_content user.name
      expect(page).to have_content I18n.l(Proposal.last.created_at.to_date)

      expect(page).to have_current_path(management_proposal_path(Proposal.last))
    end

    scenario "Should not allow unverified users to create proposals" do
      user = create(:user)
      login_managed_user(user)

      click_link "Create proposal"

      expect(page).to have_content "User is not verified"
    end
  end

  context "Show" do
    scenario 'When path matches the friendly url' do
      proposal = create(:proposal)

      user = create(:user, :level_two)
      login_managed_user(user)

      right_path = management_proposal_path(proposal)
      visit right_path

      expect(page).to have_current_path(right_path)
    end

    scenario 'When path does not match the friendly url' do
      proposal = create(:proposal)

      user = create(:user, :level_two)
      login_managed_user(user)

      right_path = management_proposal_path(proposal)
      old_path = "#{management_proposals_path}/#{proposal.id}-something-else"
      visit old_path

      expect(page).not_to have_current_path(old_path)
      expect(page).to have_current_path(right_path)
    end
  end

  scenario "Searching" do
    proposal1 = create(:proposal, title: "Show me what you got")
    proposal2 = create(:proposal, title: "Get Schwifty")

    user = create(:user, :level_two)
    login_managed_user(user)

    click_link "Support proposals"

    fill_in "search", with: "what you got"
    click_button "Search"

    expect(page).to have_current_path(management_proposals_path, ignore_query: true)

    within(".proposals-list") do
      expect(page).to have_css('.proposal', count: 1)
      expect(page).to have_content(proposal1.title)
      expect(page).to have_content(proposal1.summary)
      expect(page).not_to have_content(proposal2.title)
      expect(page).to have_css("a[href='#{management_proposal_path(proposal1)}']", text: proposal1.title)
    end
  end

  scenario "Listing" do
    proposal1 = create(:proposal, title: "Show me what you got")
    proposal2 = create(:proposal, title: "Get Schwifty")

    user = create(:user, :level_two)
    login_managed_user(user)

    click_link "Support proposals"

    expect(page).to have_current_path(management_proposals_path)

    within(".account-info") do
      expect(page).to have_content "Identified as"
      expect(page).to have_content user.username.to_s
      expect(page).to have_content user.email.to_s
      expect(page).to have_content user.document_number.to_s
    end

    within(".proposals-list") do
      expect(page).to have_css('.proposal', count: 2)
      expect(page).to have_css("a[href='#{management_proposal_path(proposal1)}']", text: proposal1.title)
      expect(page).to have_content(proposal1.summary)
      expect(page).to have_css("a[href='#{management_proposal_path(proposal2)}']", text: proposal2.title)
      expect(page).to have_content(proposal2.summary)
    end
  end

  context "Voting" do

    let!(:proposal) { create(:proposal) }

    scenario 'Voting proposals on behalf of someone in index view', :js do
      user = create(:user, :level_two)
      login_managed_user(user)

      click_link "Support proposals"

      within(".proposals-list") do
        click_link('Support')
        expect(page).to have_content "1 support"
        expect(page).to have_content "You have already supported this proposal. Share it!"
      end

      expect(page).to have_current_path(management_proposals_path)
    end

    scenario 'Voting proposals on behalf of someone in show view', :js do
      user = create(:user, :level_two)
      login_managed_user(user)

      click_link "Support proposals"

      within(".proposals-list") { click_link proposal.title }
      expect(page).to have_content proposal.code
      within("#proposal_#{proposal.id}_votes") { click_link('Support') }

      expect(page).to have_content "1 support"
      expect(page).to have_content "You have already supported this proposal. Share it!"
      expect(page).to have_current_path(management_proposal_path(proposal))
    end

    scenario "Should not allow unverified users to vote proposals" do
      user = create(:user)
      login_managed_user(user)

      click_link "Support proposals"

      expect(page).to have_content "User is not verified"
    end
  end

  context "Printing" do

    scenario 'Printing proposals' do
      6.times { create(:proposal) }

      click_link "Print proposals"

      expect(page).to have_css('.proposal', count: 5)
      expect(page).to have_css("a[href='javascript:window.print();']", text: 'Print')
    end

    scenario "Filtering proposals to be printed", :js do
      worst_proposal = create(:proposal, title: 'Worst proposal')
      worst_proposal.update_column(:confidence_score, 2)
      best_proposal = create(:proposal, title: 'Best proposal')
      best_proposal.update_column(:confidence_score, 10)
      medium_proposal = create(:proposal, title: 'Medium proposal')
      medium_proposal.update_column(:confidence_score, 5)

      user = create(:user, :level_two)
      login_managed_user(user)

      click_link "Print proposals"

      expect(page).to have_selector('.js-order-selector[data-order="confidence_score"]')

      within(".proposals-list") do
        expect(best_proposal.title).to appear_before(medium_proposal.title)
        expect(medium_proposal.title).to appear_before(worst_proposal.title)
      end

      select 'newest', from: 'order-selector'

      expect(page).to have_selector('.js-order-selector[data-order="created_at"]')

      expect(current_url).to include('order=created_at')
      expect(current_url).to include('page=1')

      within(".proposals-list") do
        expect(medium_proposal.title).to appear_before(best_proposal.title)
        expect(best_proposal.title).to appear_before(worst_proposal.title)
      end
    end

  end
end