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.
This commit is contained in:
Javi Martín
2019-08-20 14:33:14 +02:00
parent 852d3b0ed6
commit 53abc57578
2 changed files with 30 additions and 1 deletions

View File

@@ -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

View File

@@ -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