diff --git a/app/services/time_predictor.rb b/app/services/time_predictor.rb index ced6c7a4b..66e0d91f3 100644 --- a/app/services/time_predictor.rb +++ b/app/services/time_predictor.rb @@ -56,7 +56,9 @@ def pace_factor end def measurable_pace? - completed_lap_split.distance_from_start.positive? && actual_completed_time && typical_completed_time + completed_lap_split.distance_from_start.positive? && + actual_completed_time&.positive? && + typical_completed_time&.positive? end def actual_completed_time diff --git a/spec/services/time_predictor_spec.rb b/spec/services/time_predictor_spec.rb index 23186ef44..b158dc472 100644 --- a/spec/services/time_predictor_spec.rb +++ b/spec/services/time_predictor_spec.rb @@ -259,4 +259,39 @@ def imputed_pace completed_split_time.time_from_start / completed_typical_time end end + + describe "#data_status with a degenerate stats baseline" do + subject do + described_class.new(segment: segment, effort: effort, lap_splits: lap_splits, + completed_split_time: completed_split_time, calc_model: :stats) + end + + let(:segment) { aid_2_to_aid_5 } + let(:completed_split_time) { subject_split_times.first(5).last } + let(:subject_segment_average) { 10_000.0 } + + before do + allow(SplitTimeQuery).to receive(:typical_segment_time) do |queried_segment, _effort_ids| + average = queried_segment == segment ? subject_segment_average : completed_segment_average + { "effort_count" => 10, "average" => average }.with_indifferent_access + end + end + + context "when the completed-segment average is zero" do + let(:completed_segment_average) { 0.0 } + + it "treats the pace as unmeasurable instead of raising" do + expect { subject.data_status(9_999) }.not_to raise_error + expect(subject.data_status(9_999)).to eq("good") + end + end + + context "when the completed-segment average is negative" do + let(:completed_segment_average) { -100.0 } + + it "treats the pace as unmeasurable" do + expect(subject.data_status(9_999)).to eq("good") + end + end + end end