diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 5219c1308..68570dd70 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -82,8 +82,8 @@ class DebatesController < ApplicationController end def parse_order - @valid_orders = ['created_at', 'score', 'most_commented', 'random'] - @order = @valid_orders.include?(params[:order]) ? params[:order] : 'created_at' + @valid_orders = ['hot_score', 'created_at', 'score', 'most_commented', 'random'] + @order = @valid_orders.include?(params[:order]) ? params[:order] : @valid_orders.first end def parse_tag_filter diff --git a/app/models/debate.rb b/app/models/debate.rb index 25ba8aca8..0ce52a168 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -32,6 +32,7 @@ class Debate < ActiveRecord::Base 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_hot_score , -> { order(hot_score: :desc) } # Ahoy setup visitable # Ahoy will automatically assign visit_id on create diff --git a/config/locales/en.yml b/config/locales/en.yml index c4583ffd8..58b576c89 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -69,6 +69,7 @@ en: select_order: Order by select_order_long: Order debates by orders: + hot_score: most active created_at: newest score: best rated most_commented: most commented diff --git a/config/locales/es.yml b/config/locales/es.yml index 62ab28997..fe4b033d9 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -69,6 +69,7 @@ es: select_order: Ordenar por select_order_long: Estás viendo los debates orders: + hot_score: "más activos" created_at: "más nuevos" score: "mejor valorados" most_commented: "más comentados" diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index d45e1c46f..7ea8ad459 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -350,67 +350,63 @@ feature 'Debates' do expect(Flag.flagged?(user, debate)).to_not be end - feature 'Debate index order filters', :js do + feature 'Debate index order filters' do - before do - @most_commented_debate = create(:debate) - @most_score_debate = create(:debate) - @most_recent_debate = create(:debate) - create_list(:comment, 2, commentable: @most_commented_debate) - create_list(:vote, 2, votable: @most_score_debate) - create_list(:vote, 2, votable: @most_recent_debate, vote_flag: false) - create(:vote, votable: @most_recent_debate) - create(:comment, commentable: @most_recent_debate) - end + scenario 'Default order is hot_score', :js do + create(:debate, title: 'best', hot_score: 10) + create(:debate, title: 'medium', hot_score: 5) + create(:debate, title: 'worst', hot_score: 2) - scenario 'Default order is created_at' do visit debates_path - expect(page).to have_select('order-selector', selected: 'newest') - expect(@most_recent_debate.title).to appear_before(@most_score_debate.title) - expect(@most_score_debate.title).to appear_before(@most_commented_debate.title) + expect(page).to have_select('order-selector', selected: 'most active') + expect('best').to appear_before('medium') + expect('medium').to appear_before('worst') end - scenario 'Debates are ordered by best rated' do - visit debates_path + scenario 'Debates are ordered by best rated', :js do + create(:debate, title: 'best', cached_votes_score: 10) + create(:debate, title: 'medium', cached_votes_score: 5) + create(:debate, title: 'worst', cached_votes_score: 2) + visit debates_path select 'best rated', from: 'order-selector' + expect(page).to have_select('order-selector', selected: 'best rated') - expect(find("#debates .debate", match: :first)).to have_content(@most_score_debate.title) - + expect('best').to appear_before('medium') + expect('medium').to appear_before('worst') expect(current_url).to include('order=score') - expect(@most_score_debate.title).to appear_before(@most_commented_debate.title) - expect(@most_commented_debate.title).to appear_before(@most_recent_debate.title) end - scenario 'Debates are ordered by most commented' do - visit debates_path + scenario 'Debates are ordered by most commented', :js do + create(:debate, title: 'best', comments_count: 10) + create(:debate, title: 'medium', comments_count: 5) + create(:debate, title: 'worst', comments_count: 2) + visit debates_path select 'most commented', from: 'order-selector' + expect(page).to have_select('order-selector', selected: 'most commented') - expect(find("#debates .debate", match: :first)).to have_content(@most_commented_debate.title) - + expect('best').to appear_before('medium') + expect('medium').to appear_before('worst') expect(current_url).to include('order=most_commented') - expect(@most_commented_debate.title).to appear_before(@most_recent_debate.title) - expect(@most_recent_debate.title).to appear_before(@most_score_debate.title) end - scenario 'Debates are ordered by newest' do + scenario 'Debates are ordered by newest', :js do + create(:debate, title: 'best', created_at: Time.now) + create(:debate, title: 'medium', created_at: Time.now - 1.hour) + create(:debate, title: 'worst', created_at: Time.now - 1.day) + visit debates_path - - select 'best rated', from: 'order-selector' - expect(find("#debates .debate", match: :first)).to have_content(@most_score_debate.title) - select 'newest', from: 'order-selector' - expect(page).to have_select('order-selector', selected: 'newest') - expect(find("#debates .debate", match: :first)).to have_content(@most_recent_debate.title) + expect(page).to have_select('order-selector', selected: 'newest') + expect('best').to appear_before('medium') + expect('medium').to appear_before('worst') expect(current_url).to include('order=created_at') - expect(@most_recent_debate.title).to appear_before(@most_score_debate.title) - expect(@most_score_debate.title).to appear_before(@most_commented_debate.title) end - scenario 'Debates are ordered randomly' do + scenario 'Debates are ordered randomly', :js do create_list(:debate, 12) visit debates_path @@ -420,7 +416,6 @@ feature 'Debates' do select 'most commented', from: 'order-selector' expect(page).to have_select('order-selector', selected: 'most commented') - expect(find("#debates .debate", match: :first)).to have_content(@most_commented_debate.title) select 'random', from: 'order-selector' expect(page).to have_select('order-selector', selected: 'random') diff --git a/spec/support/matchers/appear_before.rb b/spec/support/matchers/appear_before.rb index bb1d65072..73df35139 100644 --- a/spec/support/matchers/appear_before.rb +++ b/spec/support/matchers/appear_before.rb @@ -1,6 +1,7 @@ RSpec::Matchers.define :appear_before do |later_content| match do |earlier_content| - page.body.index(earlier_content) < page.body.index(later_content) + text = page.text + text.index(earlier_content) < text.index(later_content) end end