Fix tracks create job spec

This commit is contained in:
Eugene Burmakin 2025-07-17 20:46:07 +02:00
parent 91f4cf7c7a
commit dc8460a948
3 changed files with 52 additions and 23 deletions

View file

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

View file

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

View file

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