diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb
index cd113d486..4fec96c63 100644
--- a/app/controllers/debates_controller.rb
+++ b/app/controllers/debates_controller.rb
@@ -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
diff --git a/app/views/debates/show.html.erb b/app/views/debates/show.html.erb
index 5f6d6b50f..e369a6056 100644
--- a/app/views/debates/show.html.erb
+++ b/app/views/debates/show.html.erb
@@ -34,6 +34,8 @@
<%= render 'shared/tags', taggable: @debate %>
+ <%= render 'relationable/related_content', relationable: @debate %>
+
<%= render 'actions', debate: @debate %>
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb
index 0fff1aaa3..de7b3f716 100644
--- a/spec/features/debates_spec.rb
+++ b/spec/features/debates_spec.rb
@@ -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
diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb
index baf788c93..57be4dd49 100644
--- a/spec/features/proposals_spec.rb
+++ b/spec/features/proposals_spec.rb
@@ -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
diff --git a/spec/models/relation_spec.rb b/spec/models/relation_spec.rb
index c2411a158..1e65b9341 100644
--- a/spec/models/relation_spec.rb
+++ b/spec/models/relation_spec.rb
@@ -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
diff --git a/spec/shared/features/relationable.rb b/spec/shared/features/relationable.rb
new file mode 100644
index 000000000..ba3862235
--- /dev/null
+++ b/spec/shared/features/relationable.rb
@@ -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