From 3836b73482c22fcc4d1c8ad49cf2ce219388ae11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Mon, 18 Dec 2017 23:56:32 +0100 Subject: [PATCH 1/2] Added related contents to debates --- app/controllers/debates_controller.rb | 1 + app/views/debates/show.html.erb | 2 ++ 2 files changed, 3 insertions(+) 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 %>
From 4192860a738c77b779949f32699bf32325c3d7a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Mon, 18 Dec 2017 23:56:44 +0100 Subject: [PATCH 2/2] Added and improved related content tests --- spec/features/debates_spec.rb | 1 + spec/features/proposals_spec.rb | 115 +-------------------------- spec/models/relation_spec.rb | 4 +- spec/shared/features/relationable.rb | 105 ++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 116 deletions(-) create mode 100644 spec/shared/features/relationable.rb 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