Merge pull request #2760 from wairbut-m2c/backport/user-recommendations

Debates and proposals recommendations for users
This commit is contained in:
Alberto
2018-07-16 13:54:54 +02:00
committed by GitHub
30 changed files with 462 additions and 44 deletions

View File

@@ -18,7 +18,7 @@
// 16. Flags
// 17. Activity
// 18. Banners
// 19. Recommended Section Home
// 19. Recommendations
// 20. Documents
// 21. Related content
// 22. Images
@@ -2261,8 +2261,8 @@ table {
}
}
// 19. Recommended Section Home
// ----------------------------
// 19. Recommendations
// -------------------
.section-recommended {
background: #fafafa;
@@ -2404,6 +2404,54 @@ table {
}
}
.recommended-index {
background: #fafafa;
border-bottom: 1px solid #eee;
margin-bottom: $line-height;
margin-top: rem-calc(-25);
padding: $line-height 0 $line-height / 2;
@include breakpoint(medium) {
padding-top: 0;
}
h2 {
font-size: $small-font-size;
text-transform: uppercase;
}
h3 {
font-size: $base-font-size;
margin-bottom: 0;
}
a {
&:hover {
text-decoration: none;
}
}
.recommendation {
background: #fff;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);
display: block;
margin-bottom: $line-height / 4;
padding: $line-height / 2;
&:hover {
box-shadow: 0 4px 6px 0 rgba(0, 0, 0, 0.15);
}
}
}
.hide-recommendations {
color: $text-light;
position: absolute;
right: 12px;
top: -18px;
}
// 20. Documents
// -------------

View File

@@ -28,7 +28,7 @@ class AccountController < ApplicationController
else
[:username, :public_activity, :public_interests, :email_on_comment,
:email_on_comment_reply, :email_on_direct_message, :email_digest, :newsletter,
:official_position_badge]
:official_position_badge, :recommended_debates, :recommended_proposals]
end
params.require(:account).permit(*attributes)
end

View File

@@ -6,6 +6,7 @@ class DebatesController < ApplicationController
before_action :parse_tag_filter, only: :index
before_action :authenticate_user!, except: [:index, :show, :map]
before_action :set_view, only: :index
before_action :debates_recommendations, only: :index, if: :current_user
feature_flag :debates
@@ -43,6 +44,14 @@ class DebatesController < ApplicationController
redirect_to request.query_parameters.merge(action: :index)
end
def disable_recommendations
if current_user.update(recommended_debates: false)
redirect_to debates_path, notice: t('debates.index.recommendations.actions.success')
else
redirect_to debates_path, error: t('debates.index.recommendations.actions.error')
end
end
private
def debate_params
@@ -57,4 +66,10 @@ class DebatesController < ApplicationController
@view = (params[:view] == "minimal") ? "minimal" : "default"
end
def debates_recommendations
if Setting['feature.user.recommendations_on_debates'] && current_user.recommended_debates
@recommended_debates = Debate.recommendations(current_user).sort_by_random.limit(3)
end
end
end

View File

@@ -9,6 +9,7 @@ class ProposalsController < ApplicationController
before_action :authenticate_user!, except: [:index, :show, :map, :summary]
before_action :destroy_map_location_association, only: :update
before_action :set_view, only: :index
before_action :proposals_recommendations, only: :index, if: :current_user
feature_flag :proposals
@@ -79,6 +80,14 @@ class ProposalsController < ApplicationController
@tag_cloud = tag_cloud
end
def disable_recommendations
if current_user.update(recommended_proposals: false)
redirect_to proposals_path, notice: t('proposals.index.recommendations.actions.success')
else
redirect_to proposals_path, error: t('proposals.index.recommendations.actions.error')
end
end
private
def proposal_params
@@ -144,4 +153,10 @@ class ProposalsController < ApplicationController
end
end
def proposals_recommendations
if Setting['feature.user.recommendations_on_proposals'] && current_user.recommended_proposals
@recommended_proposals = Proposal.recommendations(current_user).sort_by_random.limit(3)
end
end
end

View File

@@ -94,6 +94,8 @@ module Abilities
can [:create], Topic
can [:update, :destroy], Topic, author_id: user.id
can :disable_recommendations, [Debate, Proposal]
end
end
end

View File

@@ -151,7 +151,7 @@ class Debate < ActiveRecord::Base
def self.debates_orders(user)
orders = %w{hot_score confidence_score created_at relevance}
orders << "recommendations" if user.present?
orders
orders << "recommendations" if Setting['feature.user.recommendations_on_debates'] && user&.recommended_debates
return orders
end
end

View File

@@ -210,8 +210,8 @@ class Proposal < ActiveRecord::Base
def self.proposals_orders(user)
orders = %w{hot_score confidence_score created_at relevance archival_date}
orders << "recommendations" if user.present?
orders
orders << "recommendations" if Setting['feature.user.recommendations_on_proposals'] && user&.recommended_proposals
return orders
end
protected

View File

@@ -112,6 +112,32 @@
</div>
<% end %>
<% if feature?("user.recommendations") %>
<h2><%= t("account.show.recommendations") %></h2>
<% if feature?("user.recommendations_on_debates") %>
<div>
<%= f.label :recommended_debates do %>
<%= f.check_box :recommended_debates, title: t("account.show.show_debates_recommendations"), label: false %>
<span class="checkbox">
<%= t("account.show.show_debates_recommendations") %>
</span>
<% end %>
</div>
<% end %>
<% if feature?("user.recommendations_on_proposals") %>
<div>
<%= f.label :recommended_proposals do %>
<%= f.check_box :recommended_proposals, title: t("account.show.show_proposals_recommendations"), label: false %>
<span class="checkbox">
<%= t("account.show.show_proposals_recommendations") %>
</span>
<% end %>
</div>
<% end %>
<% end %>
<%= f.submit t("account.show.save_changes_submit"), class: "button margin-top" %>
</div>

View File

@@ -35,6 +35,12 @@
<%= render "shared/section_header", i18n_namespace: "debates.index.section_header", image: "debates" %>
<% end %>
<% if feature?('user.recommendations') && @recommended_debates.present? %>
<%= render "shared/recommended_index", recommended: @recommended_debates,
disable_recommendations_path: recommendations_disable_debates_path,
namespace: "debates" %>
<% end %>
<div class="row">
<div id="debates" class="debates-list small-12 medium-9 column">

View File

@@ -37,6 +37,12 @@
<%= render "shared/section_header", i18n_namespace: "proposals.index.section_header", image: "proposals" %>
<% end %>
<% if feature?('user.recommendations') && @recommended_proposals.present? %>
<%= render "shared/recommended_index", recommended: @recommended_proposals,
disable_recommendations_path: recommendations_disable_proposals_path,
namespace: "proposals" %>
<% end %>
<div class="row">
<div id="proposals" class="proposals-list small-12 medium-9 column">

View File

@@ -0,0 +1,36 @@
<div class="recommended-index">
<div class="row relative" data-equalizer data-equalizer-on="medium">
<div class="small-12 column">
<h2 class="show-for-sr"><%= t("shared.recommended_index.title") %></h2>
</div>
<div id="recommendations" data-toggler=".hide">
<%= link_to disable_recommendations_path, title: t("shared.recommended_index.hide"),
class: "float-right-medium small hide-recommendations",
data: {
toggle: "recommendations",
confirm: t("#{namespace}.index.recommendations.disable")
},
method: :put do %>
<span class="icon-x"></span>
<span class="show-for-sr"><%= t("shared.recommended_index.hide") %></span>
<% end %>
<% recommended.each_with_index do |recommended, index| %>
<div class="small-12 medium-6 large-4 column end">
<%= link_to recommended_path(recommended) do %>
<div class="recommendation" data-equalizer-watch>
<h3><%= recommended.title %></h3>
</div>
<% end %>
</div>
<% end %>
<div class="small-12 column">
<%= link_to t("shared.recommended_index.see_more"),
current_path_with_query_params(order: "recommendations"),
class: "float-right-medium small" %>
</div>
</div>
</div>
</div>

View File

@@ -3,7 +3,9 @@
<div class="small-12 column" data-magellan>
<%= image_tag "help/help_icon_#{image}.png", alt: t("#{i18n_namespace}.icon_alt"), class: "align-top" %>
<h1 class="inline-block"><%= t("#{i18n_namespace}.title") %></h1>
<%= link_to t("#{i18n_namespace}.help"), "#section_help", class: "float-right" %>
<div class="float-right-medium">
<%= link_to t("#{i18n_namespace}.help"), "#section_help" %>
</div>
</div>
</div>
</div>

View File

@@ -20,6 +20,9 @@ en:
email_on_direct_message_label: Receive emails about direct messages
email_digest_label: Receive a summary of proposal notifications
official_position_badge_label: Show official position badge
recommendations: Recommendations
show_debates_recommendations: Show debates recommendations
show_proposals_recommendations: Show proposals recommendations
title: My account
user_permission_debates: Participate on debates
user_permission_info: With your account you can...
@@ -110,6 +113,10 @@ en:
recommendations:
without_results: There are not debates related to your interests
without_interests: Follow proposals so we can give you recommendations
disable: "Debates recommendations will stop showing if you dismiss them. You can enable them again in 'My account' page"
actions:
success: "Recommendations for debates are now disabled for this account"
error: "An error has occured. Please go to 'Your account' page to manually disable recommendations for debates"
search_form:
button: Search
placeholder: Search debates...
@@ -361,6 +368,10 @@ en:
recommendations:
without_results: There are not proposals related to your interests
without_interests: Follow proposals so we can give you recommendations
disable: "Proposals recommendations will stop showing if you dismiss them. You can enable them again in 'My account' page"
actions:
success: "Recommendations for proposals are now disabled for this account"
error: "An error has occured. Please go to 'Your account' page to manually disable recommendations for proposals"
retired_proposals: Retired proposals
retired_proposals_link: "Proposals retired by the author"
retired_links:
@@ -632,6 +643,10 @@ en:
title: View mode
cards: Cards
list: List
recommended_index:
title: Recommendations
see_more: See more recommendations
hide: Hide recommendations
social:
blog: "%{org} Blog"
facebook: "%{org} Facebook"

View File

@@ -43,6 +43,8 @@ en:
user:
recommendations: Recommendations
skip_verification: Skip user verification
recommendations_on_debates: Recommendations on debates
recommendations_on_proposals: Recommendations on proposals
community: Community on proposals and investments
map: Proposals and budget investments geolocation
allow_images: Allow upload and show images

View File

@@ -20,6 +20,9 @@ es:
email_on_direct_message_label: Recibir emails con mensajes privados
email_digest_label: Recibir resumen de notificaciones sobre propuestas
official_position_badge_label: Mostrar etiqueta de tipo de usuario
recommendations: Recomendaciones
show_debates_recommendations: Mostrar recomendaciones en el listado de debates
show_proposals_recommendations: Mostrar recomendaciones en el listado de propuestas
title: Mi cuenta
user_permission_debates: Participar en debates
user_permission_info: Con tu cuenta ya puedes...
@@ -110,6 +113,10 @@ es:
recommendations:
without_results: No existen debates relacionados con tus intereses
without_interests: Sigue propuestas para que podamos darte recomendaciones
disable: "Si ocultas las recomendaciones para debates, no se volverán a mostrar. Puedes volver a activarlas en 'Mi cuenta'"
actions:
success: "Las recomendaciones de debates han sido desactivadas"
error: "Ha ocurrido un error. Por favor dirígete al apartado 'Mi cuenta' para desactivar las recomendaciones manualmente"
search_form:
button: Buscar
placeholder: Buscar debates...
@@ -361,6 +368,10 @@ es:
recommendations:
without_results: No existen propuestas relacionadas con tus intereses
without_interests: Sigue propuestas para que podamos darte recomendaciones
disable: "Si ocultas las recomendaciones para propuestas, no se volverán a mostrar. Puedes volver a activarlas en 'Mi cuenta'"
actions:
success: "Las recomendaciones de propuestas han sido desactivadas"
error: "Ha ocurrido un error. Por favor dirígete al apartado 'Mi cuenta' para desactivar las recomendaciones manualmente"
retired_proposals: Propuestas retiradas
retired_proposals_link: "Propuestas retiradas por sus autores"
retired_links:
@@ -631,6 +642,10 @@ es:
title: Modo de vista
cards: Tarjetas
list: Lista
recommended_index:
title: Recomendaciones
see_more: Ver más recomendaciones
hide: Ocultar recomendaciones
social:
blog: "Blog de %{org}"
facebook: "Facebook de %{org}"

View File

@@ -43,6 +43,8 @@ es:
user:
recommendations: Recomendaciones
skip_verification: Omitir verificación de usuarios
recommendations_on_debates: Recomendaciones en debates
recommendations_on_proposals: Recomendaciones en propuestas
community: Comunidad en propuestas y proyectos de gasto
map: Geolocalización de propuestas y proyectos de gasto
allow_images: Permitir subir y mostrar imágenes

View File

@@ -10,5 +10,6 @@ resources :debates do
collection do
get :map
get :suggest
put 'recommendations/disable', only: :index, controller: 'debates', action: :disable_recommendations
end
end

View File

@@ -13,5 +13,6 @@ resources :proposals do
get :map
get :suggest
get :summary
put 'recommendations/disable', only: :index, controller: 'proposals', action: :disable_recommendations
end
end

View File

@@ -40,6 +40,8 @@ section "Creating Settings" do
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.user.recommendations_on_debates', value: "true")
Setting.create(key: 'feature.user.recommendations_on_proposals', value: "true")
Setting.create(key: 'feature.community', value: "true")
Setting.create(key: 'feature.map', value: "true")
Setting.create(key: 'feature.allow_images', value: "true")

View File

@@ -0,0 +1,7 @@
class AddRecommendedDebatesSettingToUsers < ActiveRecord::Migration
def change
change_table :users do |t|
t.boolean :recommended_debates, default: false
end
end
end

View File

@@ -0,0 +1,7 @@
class AddRecommendedProposalsSettingToUsers < ActiveRecord::Migration
def change
change_table :users do |t|
t.boolean :recommended_proposals, default: false
end
end
end

View File

@@ -0,0 +1,6 @@
class EnableRecommendationsByDefault < ActiveRecord::Migration
def change
change_column_default :users, :recommended_debates, true
change_column_default :users, :recommended_proposals, true
end
end

View File

@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180519132610) do
ActiveRecord::Schema.define(version: 20180711224810) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -1156,6 +1156,8 @@ ActiveRecord::Schema.define(version: 20180519132610) do
t.integer "failed_email_digests_count", default: 0
t.text "former_users_data_log", default: ""
t.boolean "public_interests", default: false
t.boolean "recommended_debates", default: true
t.boolean "recommended_proposals", default: true
end
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree

View File

@@ -82,6 +82,8 @@ Setting['feature.budgets'] = true
Setting['feature.signature_sheets'] = true
Setting['feature.legislation'] = true
Setting['feature.user.recommendations'] = true
Setting['feature.user.recommendations_on_debates'] = true
Setting['feature.user.recommendations_on_proposals'] = true
Setting['feature.community'] = true
Setting['feature.map'] = nil
Setting['feature.allow_images'] = true

View File

@@ -13,4 +13,11 @@ namespace :settings do
Setting['feature.allow_attached_documents'] = true
end
desc "Enable recommendations settings"
task enable_recommendations: :environment do
Setting['feature.user.recommendations'] = true
Setting['feature.user.recommendations_on_debates'] = true
Setting['feature.user.recommendations_on_proposals'] = true
end
end

10
lib/tasks/users.rake Normal file
View File

@@ -0,0 +1,10 @@
namespace :users do
desc "Enable recommendations for existing users"
task enable_recommendations: :environment do
User.find_each do |user|
user.update(recommended_debates: true, recommended_proposals: true)
end
end
end

View File

@@ -174,4 +174,53 @@ feature 'Account' do
expect(page).to have_content "Invalid login or password"
end
context 'Recommendations' do
background do
Setting['feature.user.recommendations'] = true
Setting['feature.user.recommendations_on_debates'] = true
Setting['feature.user.recommendations_on_proposals'] = true
end
after do
Setting['feature.user.recommendations'] = nil
Setting['feature.user.recommendations_on_debates'] = nil
Setting['feature.user.recommendations_on_proposals'] = nil
end
scenario 'are enabled by default' do
visit account_path
expect(page).to have_content('Recommendations')
expect(page).to have_content('Show debates recommendations')
expect(page).to have_content('Show proposals recommendations')
expect(find("#account_recommended_debates")).to be_checked
expect(find("#account_recommended_proposals")).to be_checked
end
scenario "can be disabled through 'My account' page" do
visit account_path
expect(page).to have_content('Recommendations')
expect(page).to have_content('Show debates recommendations')
expect(page).to have_content('Show proposals recommendations')
expect(find("#account_recommended_debates")).to be_checked
expect(find("#account_recommended_proposals")).to be_checked
uncheck 'account_recommended_debates'
uncheck 'account_recommended_proposals'
click_button 'Save changes'
expect(find("#account_recommended_debates")).not_to be_checked
expect(find("#account_recommended_proposals")).not_to be_checked
@user.reload
expect(@user.recommended_debates).to be(false)
expect(@user.recommended_proposals).to be(false)
end
end
end

View File

@@ -397,52 +397,70 @@ feature 'Debates' do
context 'Recommendations' do
let!(:best_debate) { create(:debate, title: 'Best', cached_votes_total: 10, tag_list: "Sport") }
let!(:medium_debate) { create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: "Sport") }
let!(:worst_debate) { create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: "Sport") }
let!(:best_debate) { create(:debate, title: 'Best', cached_votes_total: 10, tag_list: 'Sport') }
let!(:medium_debate) { create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: 'Sport') }
let!(:worst_debate) { create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: 'Sport') }
background do
Setting['feature.user.recommendations'] = true
Setting['feature.user.recommendations_on_debates'] = true
end
after do
Setting['feature.user.recommendations'] = nil
Setting['feature.user.recommendations_on_debates'] = nil
end
scenario 'Debates can not ordered by recommendations when there is not an user logged', :js do
scenario "can't be sorted if there's no logged user" 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")
scenario 'are shown on index header when account setting is enabled' do
user = create(:user)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
visit debates_path
expect(page).to have_css('.recommendation', count: 3)
expect(page).to have_link 'Best'
expect(page).to have_link 'Medium'
expect(page).to have_link 'Worst'
expect(page).to have_link 'See more recommendations'
end
scenario 'should display text when there are no results' 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"
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
scenario 'should display text when user has no related interests' 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"
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)
scenario "can be sorted when there's a logged user" do
user = create(:user)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
login_as(user)
visit debates_path
click_link 'recommendations'
@@ -457,6 +475,47 @@ feature 'Debates' do
expect(current_url).to include('order=recommendations')
expect(current_url).to include('page=1')
end
scenario 'are not shown if account setting is disabled' do
user = create(:user, recommended_debates: false)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
visit debates_path
expect(page).not_to have_css('.recommendation', count: 3)
expect(page).not_to have_link('recommendations')
end
scenario 'are automatically disabled when dismissed from index', :js do
user = create(:user)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
visit debates_path
within("#recommendations") do
expect(page).to have_content('Best')
expect(page).to have_content('Worst')
expect(page).to have_content('Medium')
expect(page).to have_css('.recommendation', count: 3)
accept_confirm { click_link 'Hide recommendations' }
end
expect(page).not_to have_link('recommendations')
expect(page).not_to have_css('.recommendation', count: 3)
expect(page).to have_content('Recommendations for debates are now disabled for this account')
user.reload
visit account_path
expect(find("#account_recommended_debates")).not_to be_checked
expect(user.recommended_debates).to be(false)
end
end
end
@@ -866,10 +925,13 @@ feature 'Debates' do
end
end
scenario "Reorder by recommendations results maintaing search", :js do
scenario "Reorder by recommendations results maintaing search" do
Setting['feature.user.recommendations'] = true
user = create(:user)
Setting['feature.user.recommendations_for_debates'] = true
user = create(:user, recommended_debates: true)
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")
@@ -889,7 +951,9 @@ feature 'Debates' do
expect(page).not_to have_content "Do not display with same tag"
expect(page).not_to have_content "Do not display"
end
Setting['feature.user.recommendations'] = nil
Setting['feature.user.recommendations_for_debates'] = nil
end
scenario 'After a search do not show featured debates' do

View File

@@ -721,52 +721,70 @@ feature 'Proposals' do
context 'Recommendations' do
let!(:best_proposal) { create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: "Sport") }
let!(:medium_proposal) { create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: "Sport") }
let!(:worst_proposal) { create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: "Sport") }
let!(:best_proposal) { create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: 'Sport') }
let!(:medium_proposal) { create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: 'Sport') }
let!(:worst_proposal) { create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: 'Sport') }
before do
Setting['feature.user.recommendations'] = true
Setting['feature.user.recommendations_on_proposals'] = true
end
after do
Setting['feature.user.recommendations'] = nil
Setting['feature.user.recommendations_on_proposals'] = nil
end
scenario 'Proposals can not ordered by recommendations when there is not an user logged', :js do
scenario "can't be sorted if there's no logged user" 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")
scenario 'are shown on index header when account setting is enabled' do
user = create(:user)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
visit proposals_path
expect(page).to have_css('.recommendation', count: 3)
expect(page).to have_link 'Best'
expect(page).to have_link 'Medium'
expect(page).to have_link 'Worst'
expect(page).to have_link 'See more recommendations'
end
scenario 'should display text when there are no results' 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"
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
scenario 'should display text when user has no related interests' 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"
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")
scenario "can be sorted when there's a logged user" do
user = create(:user)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
login_as(user)
visit proposals_path
click_link 'recommendations'
@@ -781,6 +799,47 @@ feature 'Proposals' do
expect(current_url).to include('order=recommendations')
expect(current_url).to include('page=1')
end
scenario 'are not shown if account setting is disabled' do
user = create(:user, recommended_proposals: false)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
visit proposals_path
expect(page).not_to have_css('.recommendation', count: 3)
expect(page).not_to have_link('recommendations')
end
scenario 'are automatically disabled when dismissed from index', :js do
user = create(:user)
proposal = create(:proposal, tag_list: 'Sport')
create(:follow, followable: proposal, user: user)
login_as(user)
visit proposals_path
within("#recommendations") do
expect(page).to have_content('Best')
expect(page).to have_content('Worst')
expect(page).to have_content('Medium')
expect(page).to have_css('.recommendation', count: 3)
accept_confirm { click_link 'Hide recommendations' }
end
expect(page).not_to have_link('recommendations')
expect(page).not_to have_css('.recommendation', count: 3)
expect(page).to have_content('Recommendations for proposals are now disabled for this account')
user.reload
visit account_path
expect(find("#account_recommended_proposals")).not_to be_checked
expect(user.recommended_proposals).to be(false)
end
end
end
@@ -1317,10 +1376,13 @@ feature 'Proposals' do
end
end
scenario "Reorder by recommendations results maintaing search", :js do
scenario "Reorder by recommendations results maintaing search" do
Setting['feature.user.recommendations'] = true
user = create(:user)
Setting['feature.user.recommendations_for_proposals'] = true
user = create(:user, recommended_proposals: true)
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")
@@ -1340,7 +1402,9 @@ feature 'Proposals' do
expect(page).not_to have_content "Do not display with same tag"
expect(page).not_to have_content "Do not display"
end
Setting['feature.user.recommendations'] = nil
Setting['feature.user.recommendations_for_proposals'] = nil
end
scenario 'After a search do not show featured proposals' do

View File

@@ -299,4 +299,10 @@ describe Abilities::Common do
it { should_not be_able_to(:answer, incoming_poll_question_from_other_geozone) }
end
end
describe "#disable_recommendations" do
it { should be_able_to(:disable_recommendations, Debate) }
it { should be_able_to(:disable_recommendations, Proposal) }
end
end