dawarich/spec/services/visits/smart_detect_spec.rb
2025-03-05 20:04:26 +01:00

45 lines
1.8 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Visits::SmartDetect do
let(:user) { create(:user) }
let(:start_at) { 1.day.ago }
let(:end_at) { Time.current }
let(:points) { create_list(:point, 5, user: user, timestamp: 2.hours.ago) }
subject { described_class.new(user, start_at: start_at, end_at: end_at) }
describe '#call' do
context 'when there are no points' do
it 'returns an empty array' do
expect(subject.call).to eq([])
end
end
context 'when there are points' do
let(:visit_detector) { instance_double(Visits::Detector) }
let(:visit_merger) { instance_double(Visits::Merger) }
let(:visit_creator) { instance_double(Visits::Creator) }
let(:potential_visits) { [{ id: 1 }] }
let(:merged_visits) { [{ id: 2 }] }
let(:grouped_visits) { [[{ id: 3 }]] }
let(:created_visits) { [instance_double(Visit)] }
before do
allow(user).to receive_message_chain(:tracked_points, :not_visited, :order, :where).and_return(points)
allow(Visits::Detector).to receive(:new).with(points).and_return(visit_detector)
allow(Visits::Merger).to receive(:new).with(points).and_return(visit_merger)
allow(Visits::Creator).to receive(:new).with(user).and_return(visit_creator)
allow(visit_detector).to receive(:detect_potential_visits).and_return(potential_visits)
allow(visit_merger).to receive(:merge_visits).with(potential_visits).and_return(merged_visits)
allow(subject).to receive(:group_nearby_visits).with(merged_visits).and_return(grouped_visits)
allow(visit_creator).to receive(:create_visits).with([{ id: 3 }]).and_return(created_visits)
end
it 'delegates to the appropriate services' do
expect(subject.call).to eq(created_visits)
end
end
end
end