From 1769161d4af465c601b3090e2526b8a903136f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Tue, 20 Aug 2019 14:33:14 +0200 Subject: [PATCH] Fix Infinity exceptions in hot score calculator There was a rare case we've found on some Travis builds where the system time suddenly moved back to the past a couple of tenths of a second, meaning `Time.current - resource.created_at` returned a negative number, which lead to a division by zero. --- lib/score_calculator.rb | 2 +- spec/lib/score_calculator_spec.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 spec/lib/score_calculator_spec.rb diff --git a/lib/score_calculator.rb b/lib/score_calculator.rb index 5cba290cb5e..44a831f73c7 100644 --- a/lib/score_calculator.rb +++ b/lib/score_calculator.rb @@ -3,7 +3,7 @@ module ScoreCalculator def self.hot_score(resource) return 0 unless resource.created_at - period = [max_period, resource_age(resource)].min + period = [1, [max_period, resource_age(resource)].min].max votes_total = resource.votes_for.where("created_at >= ?", period.days.ago).count votes_up = resource.get_upvotes.where("created_at >= ?", period.days.ago).count diff --git a/spec/lib/score_calculator_spec.rb b/spec/lib/score_calculator_spec.rb new file mode 100644 index 00000000000..ef528082fbb --- /dev/null +++ b/spec/lib/score_calculator_spec.rb @@ -0,0 +1,29 @@ +require "rails_helper" + +describe ScoreCalculator do + describe ".hot_score" do + let(:resource) { create(:debate) } + + before do + resource.vote_by(voter: create(:user), vote: "yes") + end + + it "ignores small time leaps", :with_frozen_time do + resource.created_at = Time.current + 0.01 + + expect(ScoreCalculator.hot_score(resource)).to eq 1 + end + + it "ignores setting with negative value " do + Setting["hot_score_period_in_days"] = -1 + + expect(ScoreCalculator.hot_score(resource)).to eq 1 + end + + it "ignores setting with zero value" do + Setting["hot_score_period_in_days"] = 0 + + expect(ScoreCalculator.hot_score(resource)).to eq 1 + end + end +end