Skip to content

Commit

Permalink
Fix Infinity exceptions in hot score calculator
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
javierm committed Sep 5, 2019
1 parent 7683dc0 commit fb352f7
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/score_calculator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
29 changes: 29 additions & 0 deletions spec/lib/score_calculator_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit fb352f7

Please sign in to comment.