diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb index 9eb27226b..df232069b 100644 --- a/app/controllers/concerns/commentable_actions.rb +++ b/app/controllers/concerns/commentable_actions.rb @@ -81,6 +81,12 @@ module CommentableActions @search_terms = params[:search] if params[:search].present? end + def set_search_order + if params[:search].present? && params[:order].blank? + params[:order] = 'relevance' + end + end + def set_resource_votes(instance) send("set_#{resource_name}_votes", instance) end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 8a5def88b..e28f053c7 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -4,9 +4,10 @@ class DebatesController < ApplicationController before_action :parse_search_terms, only: :index before_action :parse_tag_filter, only: :index + before_action :set_search_order, only: :index before_action :authenticate_user!, except: [:index, :show] - has_orders %w{hot_score confidence_score created_at most_commented random}, only: :index + has_orders %w{hot_score confidence_score created_at most_commented random relevance}, only: :index has_orders %w{most_voted newest oldest}, only: :show load_and_authorize_resource diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index 1be046b7a..cc8a286ec 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -4,9 +4,10 @@ class ProposalsController < ApplicationController before_action :parse_search_terms, only: :index before_action :parse_tag_filter, only: :index + before_action :set_search_order, only: :index before_action :authenticate_user!, except: [:index, :show] - has_orders %w{hot_score confidence_score created_at most_commented random}, only: :index + has_orders %w{hot_score confidence_score created_at most_commented random relevance}, only: :index has_orders %w{most_voted newest oldest}, only: :show load_and_authorize_resource diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 000000000..08d5588ca --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,7 @@ +module OrdersHelper + + def valid_orders + @valid_orders.reject { |order| order =='relevance' && params[:search].blank? } + end + +end \ No newline at end of file diff --git a/app/models/debate.rb b/app/models/debate.rb index 74403139c..086bd5ae4 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -26,13 +26,14 @@ class Debate < ActiveRecord::Base before_save :calculate_hot_score, :calculate_confidence_score - scope :for_render, -> { includes(:tags) } - scope :sort_by_hot_score , -> { order(hot_score: :desc) } - scope :sort_by_confidence_score , -> { order(confidence_score: :desc) } - scope :sort_by_created_at, -> { order(created_at: :desc) } - scope :sort_by_most_commented, -> { order(comments_count: :desc) } - scope :sort_by_random, -> { order("RANDOM()") } - scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } + scope :for_render, -> { includes(:tags) } + scope :sort_by_hot_score , -> { reorder(hot_score: :desc) } + scope :sort_by_confidence_score, -> { reorder(confidence_score: :desc) } + scope :sort_by_created_at, -> { reorder(created_at: :desc) } + scope :sort_by_most_commented, -> { reorder(comments_count: :desc) } + scope :sort_by_random, -> { reorder("RANDOM()") } + scope :sort_by_relevance, -> { all } + scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } # Ahoy setup visitable # Ahoy will automatically assign visit_id on create @@ -47,10 +48,10 @@ class Debate < ActiveRecord::Base }, using: { tsearch: { dictionary: "spanish" }, - trigram: { threshold: 0.1 }, }, - ranked_by: '(:tsearch + debates.cached_votes_up)', - order_within_rank: "debates.created_at DESC" + ignoring: :accents, + ranked_by: '(:tsearch)', + order_within_rank: "debates.cached_votes_up DESC" } def description diff --git a/app/models/proposal.rb b/app/models/proposal.rb index 67f3719e6..547a262a7 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -32,13 +32,14 @@ class Proposal < ActiveRecord::Base before_save :calculate_hot_score, :calculate_confidence_score - scope :for_render, -> { includes(:tags) } - scope :sort_by_hot_score , -> { order(hot_score: :desc) } - scope :sort_by_confidence_score , -> { order(confidence_score: :desc) } - scope :sort_by_created_at, -> { order(created_at: :desc) } - scope :sort_by_most_commented, -> { order(comments_count: :desc) } - scope :sort_by_random, -> { order("RANDOM()") } - scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } + scope :for_render, -> { includes(:tags) } + scope :sort_by_hot_score , -> { reorder(hot_score: :desc) } + scope :sort_by_confidence_score, -> { reorder(confidence_score: :desc) } + scope :sort_by_created_at, -> { reorder(created_at: :desc) } + scope :sort_by_most_commented, -> { reorder(comments_count: :desc) } + scope :sort_by_random, -> { reorder("RANDOM()") } + scope :sort_by_relevance , -> { all } + scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } pg_search_scope :pg_search, { against: { diff --git a/app/views/shared/_order_selector.html.erb b/app/views/shared/_order_selector.html.erb index 883205493..e120e98e5 100644 --- a/app/views/shared/_order_selector.html.erb +++ b/app/views/shared/_order_selector.html.erb @@ -1,14 +1,12 @@ -<% # Params: - # - # i18n_namespace: for example "moderation.debates.index" -%> -
- + <% valid_orders.each do |order| %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index c6f740b82..029d21e02 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -90,6 +90,7 @@ en: created_at: "newest" most_commented: "most commented" random: "random" + relevance: "relevance" filter_topic: one: " with topic '%{topic}'" other: " with topic '%{topic}'" @@ -166,6 +167,7 @@ en: created_at: "newest" most_commented: "most commented" random: "random" + relevance: "relevance" filter_topic: one: " with topic '%{topic}'" other: " with topic '%{topic}'" diff --git a/config/locales/es.yml b/config/locales/es.yml index 7cfd67415..483a0c313 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -90,6 +90,7 @@ es: created_at: "más nuevos" most_commented: "más comentados" random: "aleatorio" + relevance: "relevancia" filter_topic: one: " con el tema '%{topic}'" other: " con el tema '%{topic}'" @@ -166,6 +167,7 @@ es: created_at: "más nuevas" most_commented: "más comentadas" random: "aleatorias" + relevance: "relevancia" filter_topic: one: " con el tema '%{topic}'" other: " con el tema '%{topic}'" diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index e38c7edc7..5c8f4f908 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -515,6 +515,67 @@ feature 'Debates' do end end + pending "Order by relevance by default", :js do + debate1 = create(:debate, title: "Show you got", cached_votes_up: 10) + debate2 = create(:debate, title: "Show what you got", cached_votes_up: 1) + debate3 = create(:debate, title: "Show you got", cached_votes_up: 100) + + visit debates_path + fill_in "search", with: "Show what you got" + click_button "Search" + + expect(page).to have_selector('.js-order-selector[data-order="relevance"]') + + within("#debates") do + expect(all(".debate")[0].text).to match "Show what you got" + expect(all(".debate")[1].text).to match "Show you got" + expect(all(".debate")[2].text).to match "Show you got" + end + end + + pending "Reorder results maintaing search", :js do + debate1 = create(:debate, title: "Show you got", cached_votes_up: 10, created_at: 1.week.ago) + debate2 = create(:debate, title: "Show what you got", cached_votes_up: 1, created_at: 1.month.ago) + debate3 = create(:debate, title: "Show you got", cached_votes_up: 100, created_at: Time.now) + debate4 = create(:debate, title: "Do not display", cached_votes_up: 1, created_at: 1.week.ago) + + visit debates_path + fill_in "search", with: "Show what you got" + click_button "Search" + + select 'newest', from: 'order-selector' + expect(page).to have_selector('.js-order-selector[data-order="created_at"]') + + within("#debates") do + expect(all(".debate")[0].text).to match "Show you got" + expect(all(".debate")[1].text).to match "Show you got" + expect(all(".debate")[2].text).to match "Show what you got" + expect(page).to_not have_content "Do not display" + end + end + + scenario 'Index search does not show featured debates' do + featured_debates = create_featured_debates + debate = create(:debate, title: "Abcdefghi") + + visit debates_path + fill_in "search", with: debate.title + click_button "Search" + + expect(page).to_not have_selector('#debates .debate-featured') + expect(page).to_not have_selector('#featured-debates') + end + + scenario 'Index tag does not show featured debates' do + featured_debates = create_featured_debates + debates = create(:debate, tag_list: "123") + + visit debates_path(tag: "123") + + expect(page).to_not have_selector('#debates .debate-featured') + expect(page).to_not have_selector('#featured-debates') + end + scenario 'Conflictive' do good_debate = create(:debate) conflictive_debate = create(:debate, :conflictive) diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 711820574..b8c2cce05 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -584,6 +584,45 @@ feature 'Proposals' do end end + scenario "Order by relevance by default", :js do + proposal1 = create(:proposal, title: "Show you got", cached_votes_up: 10) + proposal2 = create(:proposal, title: "Show what you got", cached_votes_up: 1) + proposal3 = create(:proposal, title: "Show you got", cached_votes_up: 100) + + visit proposals_path + fill_in "search", with: "Show what you got" + click_button "Search" + + expect(page).to have_selector('.js-order-selector[data-order="relevance"]') + + within("#proposals") do + expect(all(".proposal")[0].text).to match "Show what you got" + expect(all(".proposal")[1].text).to match "Show you got" + expect(all(".proposal")[2].text).to match "Show you got" + end + end + + scenario "Reorder results maintaing search", :js do + proposal1 = create(:proposal, title: "Show you got", cached_votes_up: 10, created_at: 1.week.ago) + proposal2 = create(:proposal, title: "Show what you got", cached_votes_up: 1, created_at: 1.month.ago) + proposal3 = create(:proposal, title: "Show you got", cached_votes_up: 100, created_at: Time.now) + proposal4 = create(:proposal, title: "Do not display", cached_votes_up: 1, created_at: 1.week.ago) + + visit proposals_path + fill_in "search", with: "Show what you got" + click_button "Search" + + select 'newest', from: 'order-selector' + expect(page).to have_selector('.js-order-selector[data-order="created_at"]') + + within("#proposals") do + expect(all(".proposal")[0].text).to match "Show you got" + expect(all(".proposal")[1].text).to match "Show you got" + expect(all(".proposal")[2].text).to match "Show what you got" + expect(page).to_not have_content "Do not display" + end + end + scenario 'Index search does not show featured proposals' do featured_proposals = create_featured_proposals proposal = create(:proposal, title: "Abcdefghi") @@ -596,7 +635,7 @@ feature 'Proposals' do expect(page).to_not have_selector('#featured-proposals') end - scenario 'Tag index tag does not show featured proposals' do + scenario 'Index tag does not show featured proposals' do featured_proposals = create_featured_proposals proposal = create(:proposal, tag_list: "123") diff --git a/spec/helpers/orders_helper_spec.rb b/spec/helpers/orders_helper_spec.rb new file mode 100644 index 000000000..39475f7b2 --- /dev/null +++ b/spec/helpers/orders_helper_spec.rb @@ -0,0 +1,18 @@ +require 'rails_helper' + +describe OrdersHelper do + + describe '#valid_orders' do + it 'displays relevance when searching' do + params[:search] = 'ipsum' + assign(:valid_orders, %w(created_at random relevance)) + expect(helper.valid_orders).to eq %w(created_at random relevance) + end + + it 'does not display relevance when not searching' do + assign(:valid_orders, %w(created_at random relevance)) + expect(helper.valid_orders).to eq %w(created_at random) + end + end + +end \ No newline at end of file diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index 0b29d5b2a..a90423645 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -548,6 +548,90 @@ describe Debate do end + context "reorder" do + + xit "should be able to reorder by hot_score after searching" do + lowest_score = create(:debate, title: 'stop corruption', cached_votes_up: 1) + highest_score = create(:debate, title: 'stop corruption', cached_votes_up: 2) + average_score = create(:debate, title: 'stop corruption', cached_votes_up: 3) + + lowest_score.update_column(:hot_score, 1) + highest_score.update_column(:hot_score, 100) + average_score.update_column(:hot_score, 10) + + results = Debate.search('stop corruption') + + expect(results.first).to eq(average_score) + expect(results.second).to eq(highest_score) + expect(results.third).to eq(lowest_score) + + results = results.sort_by_hot_score + + expect(results.first).to eq(highest_score) + expect(results.second).to eq(average_score) + expect(results.third).to eq(lowest_score) + end + + xit "should be able to reorder by confidence_score after searching" do + lowest_score = create(:debate, title: 'stop corruption', cached_votes_up: 1) + highest_score = create(:debate, title: 'stop corruption', cached_votes_up: 2) + average_score = create(:debate, title: 'stop corruption', cached_votes_up: 3) + + lowest_score.update_column(:confidence_score, 1) + highest_score.update_column(:confidence_score, 100) + average_score.update_column(:confidence_score, 10) + + results = Debate.search('stop corruption') + + expect(results.first).to eq(average_score) + expect(results.second).to eq(highest_score) + expect(results.third).to eq(lowest_score) + + results = results.sort_by_confidence_score + + expect(results.first).to eq(highest_score) + expect(results.second).to eq(average_score) + expect(results.third).to eq(lowest_score) + end + + xit "should be able to reorder by created_at after searching" do + recent = create(:debate, title: 'stop corruption', cached_votes_up: 1, created_at: 1.week.ago) + newest = create(:debate, title: 'stop corruption', cached_votes_up: 2, created_at: Time.now) + oldest = create(:debate, title: 'stop corruption', cached_votes_up: 3, created_at: 1.month.ago) + + results = Debate.search('stop corruption') + + expect(results.first).to eq(oldest) + expect(results.second).to eq(newest) + expect(results.third).to eq(recent) + + results = results.sort_by_created_at + + expect(results.first).to eq(newest) + expect(results.second).to eq(recent) + expect(results.third).to eq(oldest) + end + + xit "should be able to reorder by most commented after searching" do + least_commented = create(:debate, title: 'stop corruption', cached_votes_up: 1, comments_count: 1) + most_commented = create(:debate, title: 'stop corruption', cached_votes_up: 2, comments_count: 100) + some_comments = create(:debate, title: 'stop corruption', cached_votes_up: 3, comments_count: 10) + + results = Debate.search('stop corruption') + + expect(results.first).to eq(some_comments) + expect(results.second).to eq(most_commented) + expect(results.third).to eq(least_commented) + + results = results.sort_by_most_commented + + expect(results.first).to eq(most_commented) + expect(results.second).to eq(some_comments) + expect(results.third).to eq(least_commented) + end + + end + context "tags" do xit "searches by tags" do diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb index b60238ce4..30f514a33 100644 --- a/spec/models/proposal_spec.rb +++ b/spec/models/proposal_spec.rb @@ -432,6 +432,17 @@ describe Proposal do end + context "tags" do + + it "searches by tags" do + proposal = create(:proposal, tag_list: 'Latina') + + results = Proposal.search('Latina') + expect(results.first).to eq(proposal) + end + + end + context "order" do it "orders by weight" do @@ -475,13 +486,86 @@ describe Proposal do end - context "tags" do + context "reorder" do - it "searches by tags" do - proposal = create(:proposal, tag_list: 'Latina') + it "should be able to reorder by hot_score after searching" do + lowest_score = create(:proposal, title: 'stop corruption', cached_votes_up: 1) + highest_score = create(:proposal, title: 'stop corruption', cached_votes_up: 2) + average_score = create(:proposal, title: 'stop corruption', cached_votes_up: 3) - results = Proposal.search('Latina') - expect(results.first).to eq(proposal) + lowest_score.update_column(:hot_score, 1) + highest_score.update_column(:hot_score, 100) + average_score.update_column(:hot_score, 10) + + results = Proposal.search('stop corruption') + + expect(results.first).to eq(average_score) + expect(results.second).to eq(highest_score) + expect(results.third).to eq(lowest_score) + + results = results.sort_by_hot_score + + expect(results.first).to eq(highest_score) + expect(results.second).to eq(average_score) + expect(results.third).to eq(lowest_score) + end + + it "should be able to reorder by confidence_score after searching" do + lowest_score = create(:proposal, title: 'stop corruption', cached_votes_up: 1) + highest_score = create(:proposal, title: 'stop corruption', cached_votes_up: 2) + average_score = create(:proposal, title: 'stop corruption', cached_votes_up: 3) + + lowest_score.update_column(:confidence_score, 1) + highest_score.update_column(:confidence_score, 100) + average_score.update_column(:confidence_score, 10) + + results = Proposal.search('stop corruption') + + expect(results.first).to eq(average_score) + expect(results.second).to eq(highest_score) + expect(results.third).to eq(lowest_score) + + results = results.sort_by_confidence_score + + expect(results.first).to eq(highest_score) + expect(results.second).to eq(average_score) + expect(results.third).to eq(lowest_score) + end + + it "should be able to reorder by created_at after searching" do + recent = create(:proposal, title: 'stop corruption', cached_votes_up: 1, created_at: 1.week.ago) + newest = create(:proposal, title: 'stop corruption', cached_votes_up: 2, created_at: Time.now) + oldest = create(:proposal, title: 'stop corruption', cached_votes_up: 3, created_at: 1.month.ago) + + results = Proposal.search('stop corruption') + + expect(results.first).to eq(oldest) + expect(results.second).to eq(newest) + expect(results.third).to eq(recent) + + results = results.sort_by_created_at + + expect(results.first).to eq(newest) + expect(results.second).to eq(recent) + expect(results.third).to eq(oldest) + end + + it "should be able to reorder by most commented after searching" do + least_commented = create(:proposal, title: 'stop corruption', cached_votes_up: 1, comments_count: 1) + most_commented = create(:proposal, title: 'stop corruption', cached_votes_up: 2, comments_count: 100) + some_comments = create(:proposal, title: 'stop corruption', cached_votes_up: 3, comments_count: 10) + + results = Proposal.search('stop corruption') + + expect(results.first).to eq(some_comments) + expect(results.second).to eq(most_commented) + expect(results.third).to eq(least_commented) + + results = results.sort_by_most_commented + + expect(results.first).to eq(most_commented) + expect(results.second).to eq(some_comments) + expect(results.third).to eq(least_commented) end end diff --git a/spec/support/common_actions.rb b/spec/support/common_actions.rb index ecb8a6f10..4521a1e9f 100644 --- a/spec/support/common_actions.rb +++ b/spec/support/common_actions.rb @@ -168,4 +168,10 @@ module CommonActions create(:proposal, :with_confidence_score, cached_votes_up: 80)] end + def create_featured_debates + [create(:debate, :with_confidence_score, cached_votes_up: 100), + create(:debate, :with_confidence_score, cached_votes_up: 90), + create(:debate, :with_confidence_score, cached_votes_up: 80)] + end + end diff --git a/spec/support/matchers/appear_before.rb b/spec/support/matchers/appear_before.rb index 73df35139..bab77830f 100644 --- a/spec/support/matchers/appear_before.rb +++ b/spec/support/matchers/appear_before.rb @@ -3,5 +3,4 @@ RSpec::Matchers.define :appear_before do |later_content| text = page.text text.index(earlier_content) < text.index(later_content) end -end - +end \ No newline at end of file