spec/features/communities_spec.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'rails_helper'

feature 'Communities' do

  background do
    Setting['feature.community'] = true
  end

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

  context 'Show' do

    scenario 'Should display default content' do
      proposal = create(:proposal)
      community = proposal.community
      user = create(:user)
      login_as(user)

      visit community_path(community)

      expect(page).to have_content "Proposal community"
      expect(page).to have_content proposal.title
      expect(page).to have_content "Participate in the community of this proposal"
      expect(page).to have_link("Create topic", href: new_community_topic_path(community))
    end

    scenario 'Should display without_topics_text and participants when there are not topics' do
      proposal = create(:proposal)
      community = proposal.community

      visit community_path(community)

      expect(page).to have_content "Create the first community topic"
      expect(page).to have_content "Participants (1)"
    end

    scenario 'Should display order selector and topic content when there are topics' do
      proposal = create(:proposal)
      community = proposal.community
      topic = create(:topic, community: community)
      create(:comment, commentable: topic)

      visit community_path(community)

      expect(page).to have_selector ".wide-order-selector"
      within "#topic_#{topic.id}" do
        expect(page).to have_content topic.title
        expect(page).to have_content "#{topic.comments_count} comment"
        expect(page).to have_content I18n.l(topic.created_at.to_date)
        expect(page).to have_content topic.author.name
      end
    end

    scenario "Topic order" do
      proposal = create(:proposal)
      community = proposal.community
      topic1 = create(:topic, community: community)
      topic2 = create(:topic, community: community)
      topic2_comment = create(:comment, :with_confidence_score, commentable: topic2)
      topic3 = create(:topic, community: community)
      topic3_comment = create(:comment, :with_confidence_score, commentable: topic3)
      topic3_comment = create(:comment, :with_confidence_score, commentable: topic3)

      visit community_path(community, order: :most_commented)

      expect(topic3.title).to appear_before(topic2.title)
      expect(topic2.title).to appear_before(topic1.title)

      visit community_path(community, order: :oldest)

      expect(topic1.title).to appear_before(topic2.title)
      expect(topic2.title).to appear_before(topic3.title)

      visit community_path(community, order: :newest)

      expect(topic3.title).to appear_before(topic2.title)
      expect(topic2.title).to appear_before(topic1.title)
    end

    scenario "Should order by newest when order param is invalid" do
      proposal = create(:proposal)
      community = proposal.community
      topic1 = create(:topic, community: community)
      topic2 = create(:topic, community: community)

      visit community_path(community, order: "invalid_param")

      expect(topic2.title).to appear_before(topic1.title)
    end

    scenario 'Should display topic edit button on topic show when author is logged' do
      proposal = create(:proposal)
      community = proposal.community
      user = create(:user)
      topic1 = create(:topic, community: community, author: user)
      topic2 = create(:topic, community: community)
      login_as(user)

      visit community_topic_path(community, topic1)
      expect(page).to have_link("Edit topic", href: edit_community_topic_path(community, topic1))

      visit community_topic_path(community, topic2)
      expect(page).not_to have_link("Edit topic", href: edit_community_topic_path(community, topic2))
    end

    scenario 'Should display participant when there is topics' do
      proposal = create(:proposal)
      community = proposal.community
      topic = create(:topic, community: community)

      visit community_path(community)

      within ".communities-participant" do
        expect(page).to have_content "Participants (2)"
        expect(page).to have_content topic.author.name
        expect(page).to have_content proposal.author.name
      end
    end

    scenario 'Should display participants when there are topics and comments' do
      proposal = create(:proposal)
      community = proposal.community
      topic = create(:topic, community: community)
      comment = create(:comment, commentable: topic)

      visit community_path(community)

      within ".communities-participant" do
        expect(page).to have_content "Participants (3)"
        expect(page).to have_content topic.author.name
        expect(page).to have_content comment.author.name
        expect(page).to have_content proposal.author.name
      end
    end

    scenario 'Should redirect root path when communities are disabled' do
      Setting['feature.community'] = nil
      proposal = create(:proposal)
      community = proposal.community

      visit community_path(community)

      expect(page).to have_current_path(root_path)
    end

    scenario "Accesing a community without associated communitable" do
      proposal = create(:proposal)
      community = proposal.community
      proposal.really_destroy!
      community.reload

      expect { visit community_path(community) }.to raise_error(ActionController::RoutingError)
    end
  end

end