dawarich/spec/services/maps/hexagon_request_handler_spec.rb

138 lines
4.2 KiB
Ruby
Raw Normal View History

2025-09-16 14:41:53 -04:00
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Maps::HexagonRequestHandler do
describe '.call' do
subject(:handle_request) do
described_class.new(
2025-09-16 14:41:53 -04:00
params: params,
2025-09-18 16:23:47 -04:00
user: user,
2025-09-19 15:37:31 -04:00
stat: stat,
start_date: start_date,
end_date: end_date
).call
2025-09-16 14:41:53 -04:00
end
let(:user) { create(:user) }
2025-09-18 12:29:46 -04:00
context 'with authenticated user but no pre-calculated data' do
2025-09-19 15:37:31 -04:00
let(:stat) { nil }
let(:start_date) { '2024-06-01T00:00:00Z' }
let(:end_date) { '2024-06-30T23:59:59Z' }
2025-09-16 14:41:53 -04:00
let(:params) do
2025-09-18 12:29:46 -04:00
ActionController::Parameters.new(
{
min_lon: -74.1,
min_lat: 40.6,
max_lon: -73.9,
max_lat: 40.8,
2025-09-19 15:37:31 -04:00
start_date: start_date,
end_date: end_date
2025-09-18 12:29:46 -04:00
}
)
2025-09-16 14:41:53 -04:00
end
2025-09-18 12:29:46 -04:00
it 'returns empty feature collection when no pre-calculated data' do
2025-09-16 14:41:53 -04:00
result = handle_request
expect(result).to be_a(Hash)
expect(result['type']).to eq('FeatureCollection')
2025-09-18 12:29:46 -04:00
expect(result['features']).to eq([])
expect(result['metadata']['hexagon_count']).to eq(0)
expect(result['metadata']['source']).to eq('pre_calculated')
2025-09-16 14:41:53 -04:00
end
end
context 'with public sharing UUID and pre-calculated centers' do
let(:pre_calculated_centers) do
2025-09-19 13:55:27 -04:00
{
'8a1fb46622dffff' => [5, 1_717_200_000, 1_717_203_600],
'8a1fb46622e7fff' => [3, 1_717_210_000, 1_717_213_600]
}
2025-09-16 14:41:53 -04:00
end
let(:stat) do
create(:stat, :with_sharing_enabled, user:, year: 2024, month: 6,
2025-09-19 13:55:27 -04:00
h3_hex_ids: pre_calculated_centers)
2025-09-16 14:41:53 -04:00
end
2025-09-19 15:37:31 -04:00
let(:start_date) { Date.new(2024, 6, 1).beginning_of_day.iso8601 }
let(:end_date) { Date.new(2024, 6, 1).end_of_month.end_of_day.iso8601 }
2025-09-16 14:41:53 -04:00
let(:params) do
2025-09-18 12:29:46 -04:00
ActionController::Parameters.new(
{
uuid: stat.sharing_uuid,
min_lon: -74.1,
min_lat: 40.6,
max_lon: -73.9,
max_lat: 40.8
2025-09-18 12:29:46 -04:00
}
)
2025-09-16 14:41:53 -04:00
end
it 'returns pre-calculated hexagon data' do
result = handle_request
expect(result['type']).to eq('FeatureCollection')
expect(result['features'].length).to eq(2)
expect(result['metadata']['pre_calculated']).to be true
expect(result['metadata']['user_id']).to eq(user.id)
end
end
context 'with public sharing UUID but no pre-calculated centers' do
let(:stat) { create(:stat, :with_sharing_enabled, user:, year: 2024, month: 6) }
2025-09-19 15:37:31 -04:00
let(:start_date) { Date.new(2024, 6, 1).beginning_of_day.iso8601 }
let(:end_date) { Date.new(2024, 6, 1).end_of_month.end_of_day.iso8601 }
2025-09-16 14:41:53 -04:00
let(:params) do
2025-09-18 12:29:46 -04:00
ActionController::Parameters.new(
{
uuid: stat.sharing_uuid,
min_lon: -74.1,
min_lat: 40.6,
max_lon: -73.9,
max_lat: 40.8
2025-09-18 12:29:46 -04:00
}
)
2025-09-16 14:41:53 -04:00
end
2025-09-18 12:29:46 -04:00
it 'returns empty feature collection when no pre-calculated centers' do
2025-09-16 14:41:53 -04:00
result = handle_request
expect(result['type']).to eq('FeatureCollection')
2025-09-18 12:29:46 -04:00
expect(result['features']).to eq([])
expect(result['metadata']['hexagon_count']).to eq(0)
expect(result['metadata']['source']).to eq('pre_calculated')
2025-09-16 14:41:53 -04:00
end
end
2025-09-19 15:37:31 -04:00
context 'with stat containing empty h3_hex_ids data' do
2025-09-16 14:41:53 -04:00
let(:stat) do
create(:stat, :with_sharing_enabled, user:, year: 2024, month: 6,
2025-09-19 15:37:31 -04:00
h3_hex_ids: {})
2025-09-16 14:41:53 -04:00
end
2025-09-19 15:37:31 -04:00
let(:start_date) { Date.new(2024, 6, 1).beginning_of_day.iso8601 }
let(:end_date) { Date.new(2024, 6, 1).end_of_month.end_of_day.iso8601 }
2025-09-16 14:41:53 -04:00
let(:params) do
2025-09-18 12:29:46 -04:00
ActionController::Parameters.new(
{
uuid: stat.sharing_uuid,
min_lon: -74.1,
min_lat: 40.6,
max_lon: -73.9,
max_lat: 40.8
2025-09-18 12:29:46 -04:00
}
)
2025-09-16 14:41:53 -04:00
end
2025-09-19 15:37:31 -04:00
it 'returns empty feature collection for empty data' do
2025-09-16 14:41:53 -04:00
result = handle_request
expect(result['type']).to eq('FeatureCollection')
2025-09-19 15:37:31 -04:00
expect(result['features']).to eq([])
expect(result['metadata']['hexagon_count']).to eq(0)
expect(result['metadata']['source']).to eq('pre_calculated')
2025-09-16 19:55:42 -04:00
end
end
2025-09-16 14:41:53 -04:00
end
2025-09-18 12:29:46 -04:00
end