Merge pull request #2205 from consul/debates-related-content
Debates related content
This commit is contained in:
@@ -23,6 +23,7 @@ class DebatesController < ApplicationController
|
||||
|
||||
def show
|
||||
super
|
||||
@related_contents = Kaminari.paginate_array(@debate.relationed_contents).page(params[:page]).per(5)
|
||||
redirect_to debate_path(@debate), status: :moved_permanently if request.path != debate_path(@debate)
|
||||
end
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
|
||||
<%= render 'shared/tags', taggable: @debate %>
|
||||
|
||||
<%= render 'relationable/related_content', relationable: @debate %>
|
||||
|
||||
<div class="js-moderator-debate-actions margin">
|
||||
<%= render 'actions', debate: @debate %>
|
||||
</div>
|
||||
|
||||
@@ -11,6 +11,7 @@ feature 'Debates' do
|
||||
|
||||
context "Concerns" do
|
||||
it_behaves_like 'notifiable in-app', Debate
|
||||
it_behaves_like 'relationable', Debate
|
||||
end
|
||||
|
||||
scenario 'Index' do
|
||||
|
||||
@@ -11,6 +11,7 @@ feature 'Proposals' do
|
||||
|
||||
context "Concerns" do
|
||||
it_behaves_like 'notifiable in-app', Proposal
|
||||
it_behaves_like 'relationable', Proposal
|
||||
end
|
||||
|
||||
context 'Index' do
|
||||
@@ -142,120 +143,6 @@ feature 'Proposals' do
|
||||
visit proposal_path(proposal)
|
||||
expect(page).not_to have_content "Access the community"
|
||||
end
|
||||
|
||||
scenario 'related contents are listed' do
|
||||
proposal1 = create(:proposal)
|
||||
proposal2 = create(:proposal)
|
||||
related_content = create(:related_content, parent_relationable: proposal1, child_relationable: proposal2)
|
||||
|
||||
visit proposal_path(proposal1)
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(proposal2.title)
|
||||
end
|
||||
|
||||
visit proposal_path(proposal2)
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(proposal1.title)
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'related contents list is not rendered if there are no relations' do
|
||||
proposal = create(:proposal)
|
||||
|
||||
visit proposal_path(proposal)
|
||||
expect(page).to_not have_css("#related-content-list")
|
||||
end
|
||||
|
||||
scenario 'related contents can be added' do
|
||||
proposal1 = create(:proposal)
|
||||
proposal2 = create(:proposal)
|
||||
debate1 = create(:debate)
|
||||
|
||||
visit proposal_path(proposal1)
|
||||
|
||||
expect(page).to have_selector('#related_content', visible: false)
|
||||
click_on("Add related content")
|
||||
expect(page).to have_selector('#related_content', visible: true)
|
||||
|
||||
within("#related_content") do
|
||||
fill_in 'url', with: "#{Setting['url']}/proposals/#{proposal2.to_param}"
|
||||
click_button "Add"
|
||||
end
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(proposal2.title)
|
||||
end
|
||||
|
||||
visit proposal_path(proposal2)
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(proposal1.title)
|
||||
end
|
||||
|
||||
within("#related_content") do
|
||||
fill_in 'url', with: "#{Setting['url']}/debates/#{debate1.to_param}"
|
||||
click_button "Add"
|
||||
end
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(debate1.title)
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'if related content URL is invalid returns error' do
|
||||
proposal1 = create(:proposal)
|
||||
|
||||
visit proposal_path(proposal1)
|
||||
|
||||
click_on("Add related content")
|
||||
|
||||
within("#related_content") do
|
||||
fill_in 'url', with: "http://invalidurl.com"
|
||||
click_button "Add"
|
||||
end
|
||||
|
||||
expect(page).to have_content("Link not valid. Remember to start with #{Setting[:url]}.")
|
||||
end
|
||||
|
||||
scenario 'related content can be flagged', :js do
|
||||
user = create(:user)
|
||||
proposal1 = create(:proposal)
|
||||
proposal2 = create(:proposal)
|
||||
related_content = create(:related_content, parent_relationable: proposal1, child_relationable: proposal2)
|
||||
|
||||
login_as(user)
|
||||
visit proposal_path(proposal1)
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_css("#flag-expand-related-2")
|
||||
find('#flag-expand-related-2').click
|
||||
expect(page).to have_css("#flag-drop-related-2", visible: true)
|
||||
click_link("flag-related-2")
|
||||
|
||||
expect(page).to have_css("#unflag-expand-related-2")
|
||||
end
|
||||
|
||||
expect(related_content.reload.flags_count).to eq(1)
|
||||
expect(related_content.opposite_related_content.flags_count).to eq(1)
|
||||
end
|
||||
|
||||
scenario 'if related content has been flagged more than 5 times it will be hidden', :js do
|
||||
user = create(:user)
|
||||
proposal1 = create(:proposal)
|
||||
proposal2 = create(:proposal)
|
||||
related_content = create(:related_content, parent_relationable: proposal1, child_relationable: proposal2)
|
||||
|
||||
related_content.flags_count = Setting['related_contents_report_threshold'].to_i + 1
|
||||
related_content.opposite_related_content.flags_count = related_content.flags_count
|
||||
|
||||
related_content.save
|
||||
related_content.opposite_related_content.save
|
||||
|
||||
login_as(user)
|
||||
visit proposal_path(proposal1)
|
||||
|
||||
expect(page).to_not have_css("#related-content-list")
|
||||
end
|
||||
end
|
||||
|
||||
context "Embedded video" do
|
||||
|
||||
@@ -2,8 +2,8 @@ require 'rails_helper'
|
||||
|
||||
describe RelatedContent do
|
||||
|
||||
let(:parent_relationable) { create([:proposal, :debate, :budget_investment].sample) }
|
||||
let(:child_relationable) { create([:proposal, :debate, :budget_investment].sample) }
|
||||
let(:parent_relationable) { create([:proposal, :debate].sample) }
|
||||
let(:child_relationable) { create([:proposal, :debate].sample) }
|
||||
|
||||
it "should allow relationables from various classes" do
|
||||
expect(build(:related_content, parent_relationable: parent_relationable, child_relationable: child_relationable)).to be_valid
|
||||
|
||||
105
spec/shared/features/relationable.rb
Normal file
105
spec/shared/features/relationable.rb
Normal file
@@ -0,0 +1,105 @@
|
||||
shared_examples "relationable" do |relationable_model_name|
|
||||
|
||||
let(:relationable) { create(relationable_model_name) }
|
||||
let(:related1) { create([:proposal, :debate].sample) }
|
||||
let(:related2) { create([:proposal, :debate].sample) }
|
||||
let(:user) { create(:user) }
|
||||
|
||||
scenario 'related contents are listed' do
|
||||
related_content = create(:related_content, parent_relationable: relationable, child_relationable: related1)
|
||||
|
||||
visit eval("#{relationable.class.name.downcase}_path(relationable)")
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(related1.title)
|
||||
end
|
||||
|
||||
visit eval("#{related1.class.name.downcase}_path(related1)")
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(relationable.title)
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'related contents list is not rendered if there are no relations' do
|
||||
visit eval("#{relationable.class.name.downcase}_path(relationable)")
|
||||
expect(page).to_not have_css("#related-content-list")
|
||||
end
|
||||
|
||||
scenario 'related contents can be added' do
|
||||
visit eval("#{relationable.class.name.downcase}_path(relationable)")
|
||||
|
||||
expect(page).to have_selector('#related_content', visible: false)
|
||||
click_on("Add related content")
|
||||
expect(page).to have_selector('#related_content', visible: true)
|
||||
|
||||
within("#related_content") do
|
||||
fill_in 'url', with: "#{Setting['url']}/#{related1.class.name.downcase.pluralize}/#{related1.to_param}"
|
||||
click_button "Add"
|
||||
end
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(related1.title)
|
||||
end
|
||||
|
||||
visit eval("#{related1.class.name.downcase}_path(related1)")
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(relationable.title)
|
||||
end
|
||||
|
||||
within("#related_content") do
|
||||
fill_in 'url', with: "#{Setting['url']}/#{related2.class.name.downcase.pluralize}/#{related2.to_param}"
|
||||
click_button "Add"
|
||||
end
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_content(related2.title)
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'if related content URL is invalid returns error' do
|
||||
visit eval("#{relationable.class.name.downcase}_path(relationable)")
|
||||
|
||||
click_on("Add related content")
|
||||
|
||||
within("#related_content") do
|
||||
fill_in 'url', with: "http://invalidurl.com"
|
||||
click_button "Add"
|
||||
end
|
||||
|
||||
expect(page).to have_content("Link not valid. Remember to start with #{Setting[:url]}.")
|
||||
end
|
||||
|
||||
scenario 'related content can be flagged', :js do
|
||||
related_content = create(:related_content, parent_relationable: relationable, child_relationable: related1)
|
||||
|
||||
login_as(user)
|
||||
visit eval("#{relationable.class.name.downcase}_path(relationable)")
|
||||
|
||||
within("#related-content-list") do
|
||||
expect(page).to have_css("#flag-expand-related-#{related_content.opposite_related_content.id}")
|
||||
find("#flag-expand-related-#{related_content.opposite_related_content.id}").click
|
||||
expect(page).to have_css("#flag-drop-related-#{related_content.opposite_related_content.id}", visible: true)
|
||||
click_link("flag-related-#{related_content.opposite_related_content.id}")
|
||||
|
||||
expect(page).to have_css("#unflag-expand-related-#{related_content.opposite_related_content.id}")
|
||||
end
|
||||
|
||||
expect(related_content.reload.flags_count).to eq(1)
|
||||
expect(related_content.opposite_related_content.flags_count).to eq(1)
|
||||
end
|
||||
|
||||
scenario 'if related content has been flagged more than 5 times it will be hidden', :js do
|
||||
related_content = create(:related_content, parent_relationable: relationable, child_relationable: related1)
|
||||
|
||||
related_content.flags_count = Setting['related_contents_report_threshold'].to_i + 1
|
||||
related_content.opposite_related_content.flags_count = related_content.flags_count
|
||||
|
||||
related_content.save
|
||||
related_content.opposite_related_content.save
|
||||
|
||||
login_as(user)
|
||||
visit eval("#{relationable.class.name.downcase}_path(relationable)")
|
||||
|
||||
expect(page).to_not have_css("#related-content-list")
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user