-
- <%= t("welcome.proposal.title") %>
- <%= t("welcome.proposal.description") %>
-
+
+
+
+
<%= t("welcome.debates.title") %>
+
<%= t("welcome.debates.description") %>
+
+
+
<%= t("welcome.proposal.title") %>
+
<%= t("welcome.proposal.description") %>
+
+
+
<%= t("welcome.decide.title") %>
+
<%= t("welcome.decide.description") %>
+
+
+
<%= t("welcome.do.title") %>
+
<%= t("welcome.do.description") %>
+
-
-
-
- <%= t("welcome.decide.title") %>
- <%= t("welcome.decide.description") %>
-
-
-
-
- <%= t("welcome.do.title") %>
- <%= t("welcome.do.description") %>
-
-
-
<% end %>
diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml
index 290e1a278..29c81c074 100644
--- a/config/locales/en/general.yml
+++ b/config/locales/en/general.yml
@@ -109,6 +109,10 @@ en:
hot_score: most active
most_commented: most commented
relevance: relevance
+ recommendations: recommendations
+ recommendations:
+ without_results: There are not debates related to your interests
+ without_interests: Follow proposals so we can give you recommendations
search_form:
button: Search
placeholder: Search debates...
@@ -348,6 +352,10 @@ en:
most_commented: most commented
relevance: relevance
archival_date: Archived
+ recommendations: recommendations
+ recommendations:
+ without_results: There are not proposals related to your interests
+ without_interests: Follow proposals so we can give you recommendations
retired_proposals: Retired proposals
retired_proposals_link: "Proposals retired by the author"
retired_links:
@@ -753,6 +761,16 @@ en:
proposal:
description: Open space for citizen proposals about the kind of city we want to live in.
title: You propose
+ recommended:
+ title: Recommendations that may interest you
+ debates:
+ title: Recommended debates
+ btn_text_link: All recommended debates
+ proposals:
+ title: Recommended proposals
+ btn_text_link: All recommended proposals
+ budget_investments:
+ title: Recommended investments
verification:
i_dont_have_an_account: I don't have an account
i_have_an_account: I already have an account
diff --git a/config/locales/en/settings.yml b/config/locales/en/settings.yml
index eaf610f4d..44e767a6e 100644
--- a/config/locales/en/settings.yml
+++ b/config/locales/en/settings.yml
@@ -39,6 +39,8 @@ en:
spending_proposal_features:
voting_allowed: Voting on investment projects
legislation: Legislation
+ user:
+ recommendations: Recommendeds
community: Community on proposals and investments
map: Proposals and budget investments geolocation
map_latitude: Latitude
diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml
index 722c0dabb..c5322c84c 100644
--- a/config/locales/es/general.yml
+++ b/config/locales/es/general.yml
@@ -109,6 +109,10 @@ es:
hot_score: Más activos hoy
most_commented: Más comentados
relevance: Más relevantes
+ recommendations: Recomendaciones
+ recommendations:
+ without_results: No existen debates relacionados con tus intereses
+ without_interests: Sigue propuestas para que podamos darte recomendaciones
search_form:
button: Buscar
placeholder: Buscar debates...
@@ -348,6 +352,10 @@ es:
most_commented: Más comentadas
relevance: Más relevantes
archival_date: Archivadas
+ recommendations: Recomendaciones
+ recommendations:
+ without_results: No existen propuestas relacionadas con tus intereses
+ without_interests: Sigue propuestas para que podamos darte recomendaciones
retired_proposals: Propuestas retiradas
retired_proposals_link: "Propuestas retiradas por sus autores"
retired_links:
@@ -753,6 +761,16 @@ es:
proposal:
description: Espacio abierto para propuestas ciudadanas sobre el tipo de ciudad en el que queremos vivir.
title: Propones
+ recommended:
+ title: Recomendaciones que te pueden interesar
+ debates:
+ title: Debates recomendados
+ btn_text_link: Todos los debates recomendados
+ proposals:
+ title: Propuestas recomendadas
+ btn_text_link: Todas las propuestas recomendadas
+ budget_investments:
+ title: Presupuestos recomendados
verification:
i_dont_have_an_account: No tengo cuenta, quiero crear una y verificarla
i_have_an_account: Ya tengo una cuenta que quiero verificar
diff --git a/config/locales/es/settings.yml b/config/locales/es/settings.yml
index b23c6e688..fcf2eb1db 100644
--- a/config/locales/es/settings.yml
+++ b/config/locales/es/settings.yml
@@ -39,6 +39,8 @@ es:
spending_proposal_features:
voting_allowed: Votaciones sobre propuestas de inversión
legislation: Legislación
+ user:
+ recommendations: Recomendaciones
community: Comunidad en propuestas y proyectos de inversión
map: Geolocalización de propuestas y proyectos de inversión
map_latitude: Latitud
diff --git a/db/dev_seeds.rb b/db/dev_seeds.rb
index fcd86c44a..b151a45cf 100644
--- a/db/dev_seeds.rb
+++ b/db/dev_seeds.rb
@@ -36,6 +36,7 @@ Setting.create(key: 'feature.facebook_login', value: "true")
Setting.create(key: 'feature.google_login', value: "true")
Setting.create(key: 'feature.signature_sheets', value: "true")
Setting.create(key: 'feature.legislation', value: "true")
+Setting.create(key: 'feature.user.recommendations', value: "true")
Setting.create(key: 'feature.community', value: "true")
Setting.create(key: 'feature.map', value: "true")
Setting.create(key: 'per_page_code_head', value: "")
diff --git a/db/seeds.rb b/db/seeds.rb
index ee444bd91..fcfa6340c 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -79,6 +79,7 @@ Setting['feature.public_stats'] = true
Setting['feature.budgets'] = true
Setting['feature.signature_sheets'] = true
Setting['feature.legislation'] = true
+Setting['feature.user.recommendations'] = true
Setting['feature.community'] = true
Setting['feature.map'] = nil
diff --git a/spec/features/admin_spec.rb b/spec/features/admin_spec.rb
index 9ea2c2390..f2374f183 100644
--- a/spec/features/admin_spec.rb
+++ b/spec/features/admin_spec.rb
@@ -12,7 +12,7 @@ feature 'Admin' do
visit admin_root_path
expect(current_path).not_to eq(admin_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -22,7 +22,7 @@ feature 'Admin' do
visit admin_root_path
expect(current_path).not_to eq(admin_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -32,7 +32,7 @@ feature 'Admin' do
visit admin_root_path
expect(current_path).not_to eq(admin_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -42,7 +42,7 @@ feature 'Admin' do
visit admin_root_path
expect(current_path).not_to eq(admin_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -52,7 +52,7 @@ feature 'Admin' do
visit admin_root_path
expect(current_path).not_to eq(admin_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb
index 61210df6e..3d7c6acf8 100644
--- a/spec/features/debates_spec.rb
+++ b/spec/features/debates_spec.rb
@@ -219,7 +219,7 @@ feature 'Debates' do
visit edit_debate_path(debate)
expect(current_path).not_to eq(edit_debate_path(debate))
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to carry out the action 'edit' on debate."
end
@@ -234,7 +234,7 @@ feature 'Debates' do
visit edit_debate_path(debate)
expect(current_path).not_to eq(edit_debate_path(debate))
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content 'You do not have permission to'
end
@@ -351,6 +351,69 @@ 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, tag_list: "Sport")
+ create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: "Sport")
+ create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: "Sport")
+ 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 'Should display text when there are not recommendeds results', :js do
+ user = create(:user)
+ proposal = create(:proposal, tag_list: "Distinct_to_sport")
+ create(:follow, followable: proposal, user: user)
+ login_as(user)
+ visit debates_path
+
+ click_link 'recommendations'
+
+ expect(page).to have_content "There are not debates related to your interests"
+ end
+
+ scenario 'Should display text when user has not related interests', :js do
+ user = create(:user)
+ login_as(user)
+ visit debates_path
+
+ click_link 'recommendations'
+
+ expect(page).to have_content "Follow proposals so we can give you recommendations"
+ end
+
+ scenario 'Debates are ordered by recommendations when there is a user logged', :js do
+ proposal = create(:proposal, tag_list: "Sport" )
+ user = create(:user)
+ create(:follow, followable: proposal, user: 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 +822,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 4deed36bb..8b9cf3e4e 100644
--- a/spec/features/home_spec.rb
+++ b/spec/features/home_spec.rb
@@ -3,20 +3,143 @@ 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 section' 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
+ # user = create(:user)
+ # login_as(user)
end
+
+ feature "Recommended" do
+
+ background do
+ Setting['feature.user.recommendations'] = true
+ user = create(:user)
+ proposal = create(:proposal, tag_list: "Sport" )
+ create(:follow, followable: proposal, user: user)
+ login_as(user)
+ end
+
+ after do
+ Setting['feature.user.recommendations'] = nil
+ end
+
+ scenario 'Display recommended section' do
+ debate = create(:debate, tag_list: "Sport")
+ visit root_path
+ expect(page).to have_content "Recommendations that may interest you"
+ end
+
+ scenario 'Display recommended section when feature flag recommended is active' do
+ debate = create(:debate, tag_list: "Sport")
+ visit root_path
+ expect(page).to have_content "Recommendations that may interest you"
+ end
+
+ scenario 'Not display recommended section when feature flag recommended is not active' do
+ debate = create(:debate, tag_list: "Sport")
+ Setting['feature.user.recommendations'] = false
+
+ visit root_path
+
+ expect(page).not_to have_content "Recommendations that may interest you"
+ end
+
+ scenario 'Display debates' do
+ debate = create(:debate, tag_list: "Sport")
+
+ visit root_path
+
+ expect(page).to have_content debate.title
+ expect(page).to have_content debate.description
+ end
+
+ scenario 'Display all recommended debates link' do
+ debate = create(:debate, tag_list: "Sport")
+ visit root_path
+ expect(page).to have_link("All recommended debates", href: debates_path(order: "recommendations"))
+ end
+
+ scenario 'Display proposal' do
+ proposal = create(:proposal, tag_list: "Sport")
+
+ visit root_path
+
+ expect(page).to have_content proposal.title
+ expect(page).to have_content proposal.description
+ end
+
+ scenario 'Display all recommended proposals link' do
+ debate = create(:proposal, tag_list: "Sport")
+ visit root_path
+ expect(page).to have_link("All recommended proposals", href: proposals_path(order: "recommendations"))
+ end
+
+ scenario 'Display orbit carrousel' do
+ create_list(:debate, 3, tag_list: "Sport")
+
+ 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
+
+ scenario 'Display recommended show when click on carousel' do
+ debate = create(:debate, tag_list: "Sport")
+
+ visit root_path
+ click_on debate.title
+
+ expect(current_path).to eq debate_path(debate)
+ end
+
+ scenario 'Do not display recommended section when there are not debates and proposals' do
+ visit root_path
+ expect(page).not_to have_content "Recommendations that may interest you"
+ end
+
+ feature 'Carousel size' do
+
+ scenario 'Display debates centered when there are no proposals' do
+ debate = create(:debate, tag_list: "Sport")
+ visit root_path
+ expect(page).to have_selector('.medium-centered.large-centered')
+ end
+
+ scenario 'Correct display debates and proposals' do
+ proposal = create(:proposal, tag_list: "Sport")
+ debates = create(:debate, tag_list: "Sport")
+
+ visit root_path
+
+ expect(page).to have_selector('.debates.medium-offset-2.large-offset-2')
+ expect(page).not_to have_selector('.proposals.medium-offset-2.large-offset-2')
+ expect(page).not_to have_selector('.debates.end')
+ expect(page).to have_selector('.proposals.end')
+ expect(page).not_to have_selector('.medium-centered.large-centered')
+ end
+
+ end
+ end
+
end
feature 'IE alert' do
diff --git a/spec/features/moderation_spec.rb b/spec/features/moderation_spec.rb
index fedcb105d..ad4042425 100644
--- a/spec/features/moderation_spec.rb
+++ b/spec/features/moderation_spec.rb
@@ -11,7 +11,7 @@ feature 'Moderation' do
visit moderation_root_path
expect(current_path).not_to eq(moderation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -25,7 +25,7 @@ feature 'Moderation' do
visit moderation_root_path
expect(current_path).not_to eq(moderation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -39,7 +39,7 @@ feature 'Moderation' do
visit moderation_root_path
expect(current_path).not_to eq(moderation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -53,7 +53,7 @@ feature 'Moderation' do
visit moderation_root_path
expect(current_path).not_to eq(moderation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
diff --git a/spec/features/notifications_spec.rb b/spec/features/notifications_spec.rb
index 7b044e18a..9925b0d56 100644
--- a/spec/features/notifications_spec.rb
+++ b/spec/features/notifications_spec.rb
@@ -15,16 +15,7 @@ feature "Notifications" do
let(:legislation_annotation) { create(:legislation_annotation, author: author) }
scenario "User commented on my debate", :js do
- login_as user
- visit debate_path debate
-
- fill_in "comment-body-debate_#{debate.id}", with: "I commented on your debate"
- click_button "Publish comment"
- within "#comments" do
- expect(page).to have_content "I commented on your debate"
- end
-
- logout
+ create(:notification, notifiable: debate, user: author)
login_as author
visit root_path
@@ -37,17 +28,7 @@ feature "Notifications" do
end
scenario "User commented on my legislation question", :js do
- verified_user = create(:user, :level_two)
- login_as verified_user
- visit legislation_process_question_path legislation_question.process, legislation_question
-
- fill_in "comment-body-legislation_question_#{legislation_question.id}", with: "I answered your question"
- click_button "Publish answer"
- within "#comments" do
- expect(page).to have_content "I answered your question"
- end
-
- logout
+ create(:notification, notifiable: legislation_question, user: administrator)
login_as administrator
visit root_path
@@ -82,6 +63,7 @@ feature "Notifications" do
logout
login_as author
visit root_path
+ visit root_path
find(".icon-notification").click
@@ -107,8 +89,10 @@ feature "Notifications" do
end
logout
+
login_as author
visit root_path
+ visit root_path
find(".icon-notification").click
@@ -137,6 +121,7 @@ feature "Notifications" do
login_as author
visit root_path
+ visit root_path
find(".icon-notification").click
@@ -208,6 +193,7 @@ feature "Notifications" do
logout
login_as user1
visit root_path
+ visit root_path
find(".icon-notification").click
@@ -219,6 +205,7 @@ feature "Notifications" do
logout
login_as user2
visit root_path
+ visit root_path
find(".icon-notification").click
@@ -230,6 +217,7 @@ feature "Notifications" do
logout
login_as user3
visit root_path
+ visit root_path
find(".icon-no-notification").click
diff --git a/spec/features/officing_spec.rb b/spec/features/officing_spec.rb
index d4cb416a1..aff3eac4e 100644
--- a/spec/features/officing_spec.rb
+++ b/spec/features/officing_spec.rb
@@ -11,7 +11,7 @@ feature 'Poll Officing' do
visit officing_root_path
expect(current_path).not_to eq(officing_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -24,7 +24,7 @@ feature 'Poll Officing' do
visit officing_root_path
expect(current_path).not_to eq(officing_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -37,7 +37,7 @@ feature 'Poll Officing' do
visit officing_root_path
expect(current_path).not_to eq(officing_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -50,7 +50,7 @@ feature 'Poll Officing' do
visit officing_root_path
expect(current_path).not_to eq(officing_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
diff --git a/spec/features/proposal_notifications_spec.rb b/spec/features/proposal_notifications_spec.rb
index 4756a1903..1e93f7e13 100644
--- a/spec/features/proposal_notifications_spec.rb
+++ b/spec/features/proposal_notifications_spec.rb
@@ -189,7 +189,7 @@ feature 'Proposal Notifications' do
login_as(user)
visit new_proposal_notification_path(proposal_id: proposal.id)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content("You do not have permission to carry out the action")
end
diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb
index f0e50c7eb..81f7fb998 100644
--- a/spec/features/proposals_spec.rb
+++ b/spec/features/proposals_spec.rb
@@ -556,7 +556,7 @@ feature 'Proposals' do
visit edit_proposal_path(proposal)
expect(current_path).not_to eq(edit_proposal_path(proposal))
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content 'You do not have permission'
end
@@ -571,7 +571,7 @@ feature 'Proposals' do
visit edit_proposal_path(proposal)
expect(current_path).not_to eq(edit_proposal_path(proposal))
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content 'You do not have permission'
Setting["max_votes_for_proposal_edit"] = 1000
end
@@ -663,6 +663,69 @@ feature 'Proposals' do
expect(current_url).to include('order=created_at')
expect(current_url).to include('page=1')
end
+
+ context 'Recommendations' do
+
+ before do
+ Setting['feature.user.recommendations'] = true
+ create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: "Sport")
+ create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: "Sport")
+ create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: "Sport")
+ 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 'Should display text when there are not recommendeds results', :js do
+ user = create(:user)
+ proposal = create(:proposal, tag_list: "Distinct_to_sport")
+ create(:follow, followable: proposal, user: user)
+ login_as(user)
+ visit proposals_path
+
+ click_link 'recommendations'
+
+ expect(page).to have_content "There are not proposals related to your interests"
+ end
+
+ scenario 'Should display text when user has not related interests', :js do
+ user = create(:user)
+ login_as(user)
+ visit proposals_path
+
+ click_link 'recommendations'
+
+ expect(page).to have_content "Follow proposals so we can give you recommendations"
+ end
+
+ scenario 'Proposals are ordered by recommendations when there is an user logged', :js do
+ user = create(:user)
+ proposal = create(:proposal, tag_list: "Sport")
+ create(:follow, followable: proposal, user: user)
+ login_as(user)
+
+ visit proposals_path
+
+ click_link 'recommendations'
+
+ expect(page).to have_selector('a.active', text: 'recommendations')
+
+ within '#proposals-list' 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
@@ -1198,6 +1261,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/features/valuation_spec.rb b/spec/features/valuation_spec.rb
index 5b6cc961c..9e74d9341 100644
--- a/spec/features/valuation_spec.rb
+++ b/spec/features/valuation_spec.rb
@@ -21,7 +21,7 @@ feature 'Valuation' do
visit valuation_root_path
expect(current_path).not_to eq(valuation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -34,7 +34,7 @@ feature 'Valuation' do
visit valuation_root_path
expect(current_path).not_to eq(valuation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -47,7 +47,7 @@ feature 'Valuation' do
visit valuation_root_path
expect(current_path).not_to eq(valuation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
@@ -60,7 +60,7 @@ feature 'Valuation' do
visit valuation_root_path
expect(current_path).not_to eq(valuation_root_path)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
expect(page).to have_content "You do not have permission to access this page"
end
diff --git a/spec/features/welcome_spec.rb b/spec/features/welcome_spec.rb
index ce06befcc..245a9923e 100644
--- a/spec/features/welcome_spec.rb
+++ b/spec/features/welcome_spec.rb
@@ -33,7 +33,7 @@ feature "Welcome screen" do
login_through_form_as(user)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
end
scenario 'is not shown to organizations' do
@@ -41,7 +41,7 @@ feature "Welcome screen" do
login_through_form_as(organization.user)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
end
scenario 'it is not shown to level-2 users' do
@@ -49,7 +49,7 @@ feature "Welcome screen" do
login_through_form_as(user)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
end
scenario 'it is not shown to level-3 users' do
@@ -57,7 +57,7 @@ feature "Welcome screen" do
login_through_form_as(user)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
end
scenario 'is not shown to administrators' do
@@ -65,7 +65,7 @@ feature "Welcome screen" do
login_through_form_as(administrator.user)
- expect(current_path).to eq(proposals_path)
+ expect(current_path).to eq(root_path)
end
end
diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb
index 5ab801cd0..64dbf729f 100644
--- a/spec/models/debate_spec.rb
+++ b/spec/models/debate_spec.rb
@@ -714,4 +714,53 @@ describe Debate do
end
end
+ describe "#recommendations" do
+
+ let(:user) { create(:user) }
+
+ it "Should not return any debates when user has not interests" do
+ create(:debate)
+
+ expect(Debate.recommendations(user).size).to eq 0
+ end
+
+ it "Should return debates ordered by cached_votes_total" do
+ debate1 = create(:debate, cached_votes_total: 1, tag_list: "Sport" )
+ debate2 = create(:debate, cached_votes_total: 5, tag_list: "Sport" )
+ debate3 = create(:debate, cached_votes_total: 10, tag_list: "Sport" )
+ proposal = create(:proposal, tag_list: "Sport" )
+ create(:follow, followable: proposal, user: user)
+
+ 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, tag_list: "Sport")
+ debate2 = create(:debate, tag_list: "Sport")
+ proposal = create(:proposal, tag_list: "Sport" )
+ create(:follow, followable: proposal, user: user)
+
+ 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 83c19edde..588bd4057 100644
--- a/spec/models/proposal_spec.rb
+++ b/spec/models/proposal_spec.rb
@@ -891,4 +891,63 @@ describe Proposal do
end
end
+
+ describe "#recommendations" do
+
+ let(:user) { create(:user) }
+
+ it "Should not return any proposals when user has not interests" do
+ create(:proposal)
+
+ expect(Proposal.recommendations(user).size).to eq 0
+ end
+
+ it "Should return proposals ordered by cached_votes_up" do
+ proposal1 = create(:proposal, cached_votes_up: 1, tag_list: "Sport" )
+ proposal2 = create(:proposal, cached_votes_up: 5, tag_list: "Sport" )
+ proposal3 = create(:proposal, cached_votes_up: 10, tag_list: "Sport" )
+ proposal4 = create(:proposal, tag_list: "Sport" )
+ create(:follow, followable: proposal4, user: user)
+
+ 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, tag_list: "Sport")
+ proposal2 = create(:proposal, tag_list: "Sport")
+ proposal3 = create(:proposal, tag_list: "Sport")
+ create(:follow, followable: proposal3, user: user)
+
+ result = Proposal.recommendations(user)
+
+ expect(result.size).to eq 1
+ expect(result).to eq [proposal2]
+ end
+
+ end
end
diff --git a/spec/views/welcome/index.html.erb_spec.rb b/spec/views/welcome/index.html.erb_spec.rb
new file mode 100644
index 000000000..d8738f42b
--- /dev/null
+++ b/spec/views/welcome/index.html.erb_spec.rb
@@ -0,0 +1,43 @@
+require "rails_helper"
+
+RSpec.describe "welcome/index" do
+
+ it 'Display images on orbit carrousel when we have defined image_default' do
+ debate = create(:debate)
+
+ render template: "welcome/_recommended_carousel.html.erb",
+ locals: { key: "debates",
+ recommendeds: [debate],
+ image_field: nil,
+ image_version: nil,
+ image_default: "https://dummyimage.com/600x400/000/fff",
+ carousel_size: "medium-6 large-6 medium-centered large-centered",
+ btn_text_link: t("welcome.recommended.debates.btn_text_link"),
+ btn_path_link: debates_path(order: "recommendations")}
+
+ within 'li[data-slide="0"] .card' do
+ expect(page).to have_selector("img")
+ end
+
+ end
+
+ it 'Not display images on orbit carrousel when we have not defined image_default' do
+ debate = create(:debate)
+
+ render template: "welcome/_recommended_carousel.html.erb",
+ locals: { key: "debates",
+ recommendeds: [debate],
+ image_field: nil,
+ image_version: nil,
+ image_default: nil,
+ carousel_size: "medium-6 large-6 medium-centered large-centered",
+ btn_text_link: t("welcome.recommended.debates.btn_text_link"),
+ btn_path_link: debates_path(order: "recommendations")}
+
+ within 'li[data-slide="0"] .card' do
+ expect(page).not_to have_selector("img")
+ end
+
+ end
+
+end