From ce3cb045f8a1143bc3e8b54fbb600ff34daef1b2 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Thu, 1 Mar 2018 22:54:49 +0100 Subject: [PATCH] Convert random seed to a small value We are trying out a modulus function to return investments in random order https://github.com/consul/consul/pull/2131 However we ran into the gotcha of having a seed value too big for the modulus function to work as expected If the seed is bigger than the investment id, the records are returned ordered by id By dividing the seed by a big number, this problem seems to get fixed --- app/controllers/budgets/investments_controller.rb | 3 ++- spec/features/budgets/investments_spec.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index c48ce7fc4..5d1251d90 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -112,7 +112,8 @@ module Budgets def set_random_seed if params[:order] == 'random' || params[:order].blank? seed = params[:random_seed] || session[:random_seed] || rand(-100000..100000) - params[:random_seed] ||= Float(seed) rescue 0 + params[:random_seed] = Float(seed) / 1000000 rescue 0 + session[:random_seed] = params[:random_seed] else params[:random_seed] = nil end diff --git a/spec/features/budgets/investments_spec.rb b/spec/features/budgets/investments_spec.rb index d2ea73390..f5a650c18 100644 --- a/spec/features/budgets/investments_spec.rb +++ b/spec/features/budgets/investments_spec.rb @@ -610,7 +610,15 @@ feature 'Budget Investments' do end expect(@first_user_investments_order).to eq(@second_user_investments_order) + scenario "Convert seed to a value small enough for the modulus function to return investments in random order", :focus do + 12.times { |i| create(:budget_investment, heading: heading, id: i) } + visit budget_investments_path(budget, heading_id: heading.id, random_seed: '12') + + order = investments_order + orderd_by_id = Budget::Investment.order(:id).limit(10).pluck(:title) + + expect(order).to_not eq(orderd_by_id) end def investments_order