diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 09970f3a4..c88df92f5 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -351,6 +351,45 @@ feature 'Debates' do expect(current_url).to include('order=created_at') expect(current_url).to include('page=1') end + + context 'Recommendations' do + + background do + Setting['feature.user.recommendations'] = true + create(:debate, title: 'Best', cached_votes_total: 10) + create(:debate, title: 'Medium', cached_votes_total: 5) + create(:debate, title: 'Worst', cached_votes_total: 1) + end + + after do + Setting['feature.user.recommendations'] = nil + end + + scenario 'Debates can not ordered by recommendations when there is not an user logged', :js do + visit debates_path + + expect(page).not_to have_selector('a', text: 'recommendations') + end + + scenario 'Debates are ordered by recommendations when there is an user logged', :js do + user = create(:user) + login_as(user) + + visit debates_path + + click_link 'recommendations' + + expect(page).to have_selector('a.active', text: 'recommendations') + + within '#debates' do + expect('Best').to appear_before('Medium') + expect('Medium').to appear_before('Worst') + end + + expect(current_url).to include('order=recommendations') + expect(current_url).to include('page=1') + end + end end context "Search" do @@ -759,6 +798,32 @@ feature 'Debates' do end end + scenario "Reorder by recommendations results maintaing search", :js do + Setting['feature.user.recommendations'] = true + user = create(:user) + login_as(user) + debate1 = create(:debate, title: "Show you got", cached_votes_total: 10, tag_list: "Sport") + debate2 = create(:debate, title: "Show what you got", cached_votes_total: 1, tag_list: "Sport") + debate3 = create(:debate, title: "Do not display with same tag", cached_votes_total: 100, tag_list: "Sport") + debate4 = create(:debate, title: "Do not display", cached_votes_total: 1) + proposal1 = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal1, user: user) + + visit debates_path + fill_in "search", with: "Show you got" + click_button "Search" + click_link 'recommendations' + expect(page).to have_selector("a.active", text: "recommendations") + + within("#debates") do + expect(all(".debate")[0].text).to match "Show you got" + expect(all(".debate")[1].text).to match "Show what you got" + expect(page).to_not have_content "Do not display with same tag" + expect(page).to_not have_content "Do not display" + end + Setting['feature.user.recommendations'] = nil + end + scenario 'After a search do not show featured debates' do featured_debates = create_featured_debates debate = create(:debate, title: "Abcdefghi") diff --git a/spec/features/home_spec.rb b/spec/features/home_spec.rb index 611bcb932..b175d3176 100644 --- a/spec/features/home_spec.rb +++ b/spec/features/home_spec.rb @@ -70,6 +70,14 @@ feature "Home" do expect(page).to have_content debate.description end + scenario 'Display all recommended debates link' do + debate = create(:debate) + + visit root_path + + expect(page).to have_link("All recommended debates", href: debates_path(order: "recommendations")) + end + scenario 'Display proposal' do proposal = create(:proposal) @@ -79,6 +87,14 @@ feature "Home" do expect(page).to have_content proposal.description end + scenario 'Display all recommended proposals link' do + debate = create(:proposal) + + visit root_path + + expect(page).to have_link("All recommended proposals", href: proposals_path(order: "recommendations")) + end + scenario 'Display orbit carrousel' do debate = create_list(:debate, 3) diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index e6e46c011..7aeb20c1c 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -629,6 +629,45 @@ feature 'Proposals' do expect(current_url).to include('order=created_at') expect(current_url).to include('page=1') end + + context 'Recommendations' do + + background do + Setting['feature.user.recommendations'] = true + create(:proposal, title: 'Best', cached_votes_up: 10) + create(:proposal, title: 'Medium', cached_votes_up: 5) + create(:proposal, title: 'Worst', cached_votes_up: 1) + end + + after do + Setting['feature.user.recommendations'] = nil + end + + scenario 'Proposals can not ordered by recommendations when there is not an user logged', :js do + visit proposals_path + + expect(page).not_to have_selector('a', text: 'recommendations') + end + + scenario 'Proposals are ordered by recommendations when there is an user logged', :js do + user = create(:user) + login_as(user) + + visit proposals_path + + click_link 'recommendations' + + expect(page).to have_selector('a.active', text: 'recommendations') + + within '#proposals' do + expect('Best').to appear_before('Medium') + expect('Medium').to appear_before('Worst') + end + + expect(current_url).to include('order=recommendations') + expect(current_url).to include('page=1') + end + end end feature 'Archived proposals' do @@ -1164,6 +1203,32 @@ feature 'Proposals' do end end + scenario "Reorder by recommendations results maintaing search", :js do + Setting['feature.user.recommendations'] = true + user = create(:user) + login_as(user) + proposal1 = create(:proposal, title: "Show you got", cached_votes_up: 10, tag_list: "Sport") + proposal2 = create(:proposal, title: "Show what you got", cached_votes_up: 1, tag_list: "Sport") + proposal3 = create(:proposal, title: "Do not display with same tag", cached_votes_up: 100, tag_list: "Sport") + proposal4 = create(:proposal, title: "Do not display", cached_votes_up: 1) + proposal5 = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal5, user: user) + + visit proposals_path + fill_in "search", with: "Show you got" + click_button "Search" + click_link 'recommendations' + expect(page).to have_selector("a.active", text: "recommendations") + + within("#proposals") do + expect(all(".proposal")[0].text).to match "Show you got" + expect(all(".proposal")[1].text).to match "Show what you got" + expect(page).to_not have_content "Do not display with same tag" + expect(page).to_not have_content "Do not display" + end + Setting['feature.user.recommendations'] = nil + end + scenario 'After a search do not show featured proposals' do featured_proposals = create_featured_proposals proposal = create(:proposal, title: "Abcdefghi") diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index 8d24f9945..f32a19cad 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -714,4 +714,49 @@ describe Debate do end end + describe "#recommendations" do + + let(:user) { create(:user) } + + it "Should return up to 4 debates" do + create_list(:debate, 4) + + expect(Debate.recommendations(user).size).to eq 4 + 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 = Debate.recommendations(user).sort_by_recommendations + + 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 = Debate.recommendations(user) + + expect(result.size).to eq 1 + expect(result).to eq [debate1] + end + + it "Should not return debates when user is the author" do + debate1 = create(:debate, author: user) + debate2 = create(:debate) + + result = Debate.recommendations(user) + + expect(result.size).to eq 1 + expect(result).to eq [debate2] + end + + end end diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb index 5bf6d90e1..5587dbb87 100644 --- a/spec/models/proposal_spec.rb +++ b/spec/models/proposal_spec.rb @@ -879,4 +879,59 @@ describe Proposal do end end + + describe "#recommendations" do + + let(:user) { create(:user) } + + it "Should return up to 4 proposals" do + create_list(:proposal, 4) + + expect(Proposal.recommendations(user).size).to eq 4 + 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 = Proposal.recommendations(user).sort_by_recommendations + + 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 = Proposal.recommendations(user) + + 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 = Proposal.recommendations(user) + + expect(result.size).to eq 0 + end + + it "Should not return proposals when user is the author" do + proposal1 = create(:proposal, author: user) + proposal2 = create(:proposal) + + result = Proposal.recommendations(user) + + expect(result.size).to eq 1 + expect(result).to eq [proposal2] + end + + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a8b26eaca..6db1a2a25 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -681,105 +681,4 @@ describe User do 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 the 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 proposals" 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 the 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 - end