diff --git a/CHANGELOG.md b/CHANGELOG.md index a51f35d3..cda4369e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Track generation is now significantly faster and less resource intensive. +## Fixed + +- Distance on the stats page is now rounded. #1548 + # [0.30.2] - 2025-07-22 diff --git a/app/services/tracks/generator.rb b/app/services/tracks/generator.rb index b93f863c..62a4fab3 100644 --- a/app/services/tracks/generator.rb +++ b/app/services/tracks/generator.rb @@ -58,7 +58,7 @@ class Tracks::Generator tracks_created = 0 segments.each do |segment_data| - track = create_track_from_segment_optimized(segment_data) + track = create_track_from_segment(segment_data) tracks_created += 1 if track end diff --git a/app/views/stats/index.html.erb b/app/views/stats/index.html.erb index af42647b..bd06de8e 100644 --- a/app/views/stats/index.html.erb +++ b/app/views/stats/index.html.erb @@ -41,7 +41,7 @@
<% cache [current_user, 'year_distance_stat', year], skip_digest: true do %> - <%= number_with_delimiter year_distance_stat(year, current_user) %><%= current_user.safe_settings.distance_unit %> + <%= number_with_delimiter year_distance_stat(year, current_user).round %> <%= current_user.safe_settings.distance_unit %> <% end %>
<% if DawarichSettings.reverse_geocoding_enabled? %> diff --git a/spec/services/tracks/track_builder_spec.rb b/spec/services/tracks/track_builder_spec.rb index 5046e60f..2213f5a2 100644 --- a/spec/services/tracks/track_builder_spec.rb +++ b/spec/services/tracks/track_builder_spec.rb @@ -39,21 +39,23 @@ RSpec.describe Tracks::TrackBuilder do ] end + let(:pre_calculated_distance) { 1500 } # 1500 meters + it 'creates a track with correct attributes' do - track = builder.create_track_from_points(points) + track = builder.create_track_from_points(points, pre_calculated_distance) expect(track).to be_persisted expect(track.user).to eq(user) expect(track.start_at).to be_within(1.second).of(Time.zone.at(points.first.timestamp)) expect(track.end_at).to be_within(1.second).of(Time.zone.at(points.last.timestamp)) - expect(track.distance).to be > 0 + expect(track.distance).to eq(1500) expect(track.duration).to eq(90.minutes.to_i) expect(track.avg_speed).to be > 0 expect(track.original_path).to be_present end it 'calculates elevation statistics correctly' do - track = builder.create_track_from_points(points) + track = builder.create_track_from_points(points, pre_calculated_distance) expect(track.elevation_gain).to eq(10) # 110 - 100 expect(track.elevation_loss).to eq(5) # 110 - 105 @@ -62,7 +64,7 @@ RSpec.describe Tracks::TrackBuilder do end it 'associates points with the track' do - track = builder.create_track_from_points(points) + track = builder.create_track_from_points(points, pre_calculated_distance) points.each(&:reload) expect(points.map(&:track)).to all(eq(track)) @@ -73,12 +75,12 @@ RSpec.describe Tracks::TrackBuilder do let(:single_point) { [create(:point, user: user)] } it 'returns nil for single point' do - result = builder.create_track_from_points(single_point) + result = builder.create_track_from_points(single_point, 1000) expect(result).to be_nil end it 'returns nil for empty array' do - result = builder.create_track_from_points([]) + result = builder.create_track_from_points([], 1000) expect(result).to be_nil end end @@ -100,7 +102,7 @@ RSpec.describe Tracks::TrackBuilder do /Failed to create track for user #{user.id}/ ) - result = builder.create_track_from_points(points) + result = builder.create_track_from_points(points, 1000) expect(result).to be_nil end end @@ -120,7 +122,7 @@ RSpec.describe Tracks::TrackBuilder do ).and_call_original result = builder.build_path(points) - expect(result).to respond_to(:as_text) + expect(result).to be_a(RGeo::Geographic::SphericalLineStringImpl) end end @@ -134,7 +136,7 @@ RSpec.describe Tracks::TrackBuilder do before do # Mock Point.total_distance to return distance in meters - allow(Point).to receive(:total_distance).and_return(1500) # 1500 meters + allow(Point).to receive(:total_distance).with(points, :m).and_return(1500) # 1500 meters end it 'stores distance in meters regardless of user unit preference' do @@ -143,7 +145,7 @@ RSpec.describe Tracks::TrackBuilder do end it 'rounds distance to nearest meter' do - allow(Point).to receive(:total_distance).and_return(1500.7) + allow(Point).to receive(:total_distance).with(points, :m).and_return(1500.7) result = builder.calculate_track_distance(points) expect(result).to eq(1501) # Rounded to nearest meter end @@ -312,13 +314,15 @@ RSpec.describe Tracks::TrackBuilder do ] end + let(:pre_calculated_distance) { 2000 } + it 'creates a complete track end-to-end' do - expect { builder.create_track_from_points(points) }.to change(Track, :count).by(1) + expect { builder.create_track_from_points(points, pre_calculated_distance) }.to change(Track, :count).by(1) track = Track.last expect(track.user).to eq(user) expect(track.points).to match_array(points) - expect(track.distance).to be > 0 + expect(track.distance).to eq(2000) expect(track.duration).to eq(1.hour.to_i) expect(track.elevation_gain).to eq(20) end