diff --git a/app/jobs/tracks/create_job.rb b/app/jobs/tracks/create_job.rb index 514a6ac9..a57a3f79 100644 --- a/app/jobs/tracks/create_job.rb +++ b/app/jobs/tracks/create_job.rb @@ -5,26 +5,21 @@ class Tracks::CreateJob < ApplicationJob def perform(user_id, start_at: nil, end_at: nil, mode: :daily) user = User.find(user_id) - + # Translate mode parameter to Generator mode generator_mode = case mode when :daily then :daily when :none then :incremental else :bulk end - - # Count tracks before generation - tracks_before = user.tracks.count - - Tracks::Generator.new( + + # Generate tracks and get the count of tracks created + tracks_created = Tracks::Generator.new( user, start_at: start_at, end_at: end_at, mode: generator_mode ).call - - # Calculate tracks created - tracks_created = user.tracks.count - tracks_before create_success_notification(user, tracks_created) rescue StandardError => e diff --git a/app/services/tracks/generator.rb b/app/services/tracks/generator.rb index ebb47873..4191a286 100644 --- a/app/services/tracks/generator.rb +++ b/app/services/tracks/generator.rb @@ -42,14 +42,19 @@ class Tracks::Generator points = load_points Rails.logger.debug "Generator: loaded #{points.size} points for user #{user.id} in #{mode} mode" - return if points.empty? + return 0 if points.empty? segments = split_points_into_segments(points) Rails.logger.debug "Generator: created #{segments.size} segments" - segments.each { |segment| create_track_from_segment(segment) } + tracks_created = 0 + segments.each do |segment| + track = create_track_from_segment(segment) + tracks_created += 1 if track + end - Rails.logger.info "Generated #{segments.size} tracks for user #{user.id} in #{mode} mode" + Rails.logger.info "Generated #{tracks_created} tracks for user #{user.id} in #{mode} mode" + tracks_created end private diff --git a/spec/jobs/tracks/create_job_spec.rb b/spec/jobs/tracks/create_job_spec.rb index fd772609..69a47fa2 100644 --- a/spec/jobs/tracks/create_job_spec.rb +++ b/spec/jobs/tracks/create_job_spec.rb @@ -17,11 +17,9 @@ RSpec.describe Tracks::CreateJob, type: :job do end it 'calls the generator and creates a notification' do - # Mock the generator to actually create tracks - allow(generator_instance).to receive(:call) do - create_list(:track, 2, user: user) - end - + # Mock the generator to return the count of tracks created + allow(generator_instance).to receive(:call).and_return(2) + described_class.new.perform(user.id) expect(Tracks::Generator).to have_received(:new).with( @@ -53,12 +51,9 @@ RSpec.describe Tracks::CreateJob, type: :job do end it 'passes custom parameters to the generator' do - # Create some existing tracks and mock generator to create 1 more - create_list(:track, 5, user: user) - allow(generator_instance).to receive(:call) do - create(:track, user: user) - end - + # Mock generator to return the count of tracks created + allow(generator_instance).to receive(:call).and_return(1) + described_class.new.perform(user.id, start_at: start_at, end_at: end_at, mode: mode) expect(Tracks::Generator).to have_received(:new).with( @@ -87,6 +82,8 @@ RSpec.describe Tracks::CreateJob, type: :job do end it 'translates :none to :incremental' do + allow(generator_instance).to receive(:call).and_return(0) + described_class.new.perform(user.id, mode: :none) expect(Tracks::Generator).to have_received(:new).with( @@ -104,6 +101,8 @@ RSpec.describe Tracks::CreateJob, type: :job do end it 'translates :daily to :daily' do + allow(generator_instance).to receive(:call).and_return(0) + described_class.new.perform(user.id, mode: :daily) expect(Tracks::Generator).to have_received(:new).with( @@ -121,6 +120,8 @@ RSpec.describe Tracks::CreateJob, type: :job do end it 'translates other modes to :bulk' do + allow(generator_instance).to receive(:call).and_return(0) + described_class.new.perform(user.id, mode: :replace) expect(Tracks::Generator).to have_received(:new).with( @@ -185,6 +186,34 @@ RSpec.describe Tracks::CreateJob, type: :job do expect(ExceptionReporter).to have_received(:call) end end + + context 'when tracks are deleted and recreated' do + it 'returns the correct count of newly created tracks' do + # Create some existing tracks first + create_list(:track, 3, user: user) + + # Mock the generator to simulate deleting existing tracks and creating new ones + # This should return the count of newly created tracks, not the difference + allow(generator_instance).to receive(:call).and_return(2) + + described_class.new.perform(user.id, mode: :bulk) + + expect(Tracks::Generator).to have_received(:new).with( + user, + start_at: nil, + end_at: nil, + mode: :bulk + ) + expect(generator_instance).to have_received(:call) + expect(Notifications::Create).to have_received(:new).with( + user: user, + kind: :info, + title: 'Tracks Generated', + content: 'Created 2 tracks from your location data. Check your tracks section to view them.' + ) + expect(notification_service).to have_received(:call) + end + end end describe 'queue' do