diff --git a/app/models/user.rb b/app/models/user.rb index 973d46d2f..c9c3f2e1d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -314,18 +314,23 @@ class User < ActiveRecord::Base end def recommended_debates - Debate.tagged_with(interests, any: true). - where("author_id != ?", self). - order("cached_votes_total DESC").limit(3) + debates_list = [] + + if interests.any? + debates_list = Debate.tagged_with(interests, any: true).where("author_id != ?", self) + else + debates_list = Debate.where("author_id != ?", self) + end + + debates_list.order("cached_votes_total DESC").limit(3) end def recommended_proposals - already_followed_proposals_ids = Proposal.joins(:follows).where("follows.user_id = ?", id).pluck(:id) proposals_list = [] - if already_followed_proposals_ids.any? - proposals_list = Proposal.tagged_with(interests, any: true). - where("author_id != ? AND id NOT IN (?)", id, already_followed_proposals_ids) + if interests.any? + already_followed_proposals_ids = Proposal.joins(:follows).where("follows.user_id = ?", id).pluck(:id) + proposals_list = Proposal.tagged_with(interests, any: true).where("author_id != ? AND id NOT IN (?)", id, already_followed_proposals_ids) else proposals_list = Proposal.where("author_id != ?", id) end @@ -334,11 +339,11 @@ class User < ActiveRecord::Base end def recommended_budget_investments - already_followed_investments_ids = Budget::Investment.joins(:follows).where("follows.user_id = ?", id).pluck(:id) investments_list = [] - if already_followed_investments_ids.any? - investments_list = Budget::Investment.tagged_with(interests, any: true). - where("author_id != ? AND id NOT IN (?)", id, already_followed_investments_ids) + + if interests.any? + already_followed_investments_ids = Budget::Investment.joins(:follows).where("follows.user_id = ?", id).pluck(:id) + investments_list = Budget::Investment.tagged_with(interests, any: true).where("author_id != ? AND id NOT IN (?)", id, already_followed_investments_ids) else investments_list = Budget::Investment.where("author_id != ?", id) end diff --git a/spec/features/home_spec.rb b/spec/features/home_spec.rb index 4deed36bb..63c4adb9e 100644 --- a/spec/features/home_spec.rb +++ b/spec/features/home_spec.rb @@ -3,20 +3,78 @@ require 'rails_helper' feature "Home" do feature "For not logged users" do + scenario 'Welcome message' do visit root_path expect(page).to have_content "Love the city, and it will become a city you love" end + + scenario 'Not display recommended text' do + debate = create(:debate) + + visit root_path + + expect(page).not_to have_content "Recommendations that may interest you" + end + end feature "For signed in users" do - scenario 'Redirect to proposals' do - login_as(create(:user)) - visit root_path - expect(current_path).to eq proposals_path + before do + login_as(create(:user)) end + + feature "Recommended" do + + scenario 'Display recommended text' do + debate = create(:debate) + + visit root_path + + expect(page).to have_content "Recommendations that may interest you" + end + + scenario 'Display debates' do + debate = create(:debate) + + visit root_path + + expect(page).to have_content debate.title + expect(page).to have_content debate.description + end + + scenario 'Display proposal' do + proposal = create(:proposal) + + visit root_path + + expect(page).to have_content proposal.title + expect(page).to have_content proposal.description + end + + scenario 'Display investments' do + budget_investment = create(:budget_investment) + + visit root_path + + expect(page).to have_content budget_investment.title + expect(page).to have_content budget_investment.description + end + + scenario 'Display orbit carrousel' do + debate = create_list(:debate, 3) + + visit root_path + + expect(page).to have_selector('li[data-slide="0"]') + expect(page).to have_selector('li[data-slide="1"]', visible: false) + expect(page).to have_selector('li[data-slide="2"]', visible: false) + end + + end + end feature 'IE alert' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 7246fc1bb..e51c9a32c 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -680,4 +680,160 @@ describe User do end end + + describe "#recommended_debates" do + + let(:user) { create(:user) } + + it "Should return up to 3 debates" do + create_list(:debate, 4) + + expect(user.recommended_debates.size).to eq 3 + end + + it "Should return debates ordered by cached_votes_total" do + debate1 = create(:debate, cached_votes_total: 1 ) + debate2 = create(:debate, cached_votes_total: 5 ) + debate3 = create(:debate, cached_votes_total: 10 ) + + result = user.recommended_debates + + expect(result.first).to eq debate3 + expect(result.second).to eq debate2 + expect(result.third).to eq debate1 + end + + it "Should return debates related with user interests" do + debate1 = create(:debate, tag_list: "Sport") + debate2 = create(:debate, tag_list: "Politics") + proposal1 = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal1, user: user) + + result = user.recommended_debates + + expect(result.size).to eq 1 + expect(result).to eq [debate1] + end + + it "Should not return debates when user is an author" do + debate1 = create(:debate, author: user) + debate2 = create(:debate) + + result = user.recommended_debates + + expect(result.size).to eq 1 + expect(result).to eq [debate2] + end + + end + + describe "#recommended_proposals" do + + let(:user) { create(:user) } + + it "Should return up to 3 debates" do + create_list(:proposal, 4) + + expect(user.recommended_proposals.size).to eq 3 + end + + it "Should return proposals ordered by cached_votes_up" do + proposal1 = create(:proposal, cached_votes_up: 1 ) + proposal2 = create(:proposal, cached_votes_up: 5 ) + proposal3 = create(:proposal, cached_votes_up: 10 ) + + result = user.recommended_proposals + + expect(result.first).to eq proposal3 + expect(result.second).to eq proposal2 + expect(result.third).to eq proposal1 + end + + it "Should return proposals related with user interests" do + proposal1 = create(:proposal, tag_list: "Sport") + proposal2 = create(:proposal, tag_list: "Sport") + proposal3 = create(:proposal, tag_list: "Politics") + create(:follow, followable: proposal1, user: user) + + result = user.recommended_proposals + + expect(result.size).to eq 1 + expect(result).to eq [proposal2] + end + + it "Should not return proposals when user is follower" do + proposal1 = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal1, user: user) + + result = user.recommended_proposals + + expect(result.size).to eq 0 + end + + it "Should not return proposals when user is an author" do + proposal1 = create(:proposal, author: user) + proposal2 = create(:proposal) + + result = user.recommended_proposals + + expect(result.size).to eq 1 + expect(result).to eq [proposal2] + end + + end + + describe "#recommended_budget_investments" do + + let(:user) { create(:user) } + + it "Should return up to 3 debates" do + create_list(:budget_investment, 4) + + expect(user.recommended_budget_investments.size).to eq 3 + end + + it "Should return budget_investments ordered by cached_votes_up" do + budget_investment1 = create(:budget_investment, cached_votes_up: 1 ) + budget_investment2 = create(:budget_investment, cached_votes_up: 5 ) + budget_investment3 = create(:budget_investment, cached_votes_up: 10 ) + + result = user.recommended_budget_investments + + expect(result.first).to eq budget_investment3 + expect(result.second).to eq budget_investment2 + expect(result.third).to eq budget_investment1 + end + + it "Should return budget_investments related with user interests" do + budget_investment1 = create(:budget_investment, tag_list: "Sport") + budget_investment2 = create(:budget_investment, tag_list: "Sport") + budget_investment3 = create(:budget_investment, tag_list: "Politics") + create(:follow, followable: budget_investment1, user: user) + + result = user.recommended_budget_investments + + expect(result.size).to eq 1 + expect(result).to eq [budget_investment2] + end + + it "Should not return budget_investments when user is follower" do + budget_investment1 = create(:budget_investment, tag_list: "Sport") + create(:follow, followable: budget_investment1, user: user) + + result = user.recommended_budget_investments + + expect(result.size).to eq 0 + end + + it "Should not return budget_investments when user is an author" do + budget_investment1 = create(:budget_investment, author: user) + budget_investment2 = create(:budget_investment) + + result = user.recommended_budget_investments + + expect(result.size).to eq 1 + expect(result).to eq [budget_investment2] + end + + end end