dawarich/spec/support/shared_examples/map_examples.rb

133 lines
4.3 KiB
Ruby
Raw Normal View History

2025-05-26 14:33:48 -04:00
# frozen_string_literal: true
RSpec.shared_context 'authenticated map user' do
before do
sign_in_and_visit_map(user)
end
end
RSpec.shared_examples 'map basic functionality' do
it 'displays the leaflet map with basic elements' do
expect(page).to have_css('#map')
expect(page).to have_css('.leaflet-map-pane')
expect(page).to have_css('.leaflet-tile-pane')
end
it 'loads map data and displays route information' do
expect(page).to have_css('.leaflet-overlay-pane', wait: 10)
expect(page).to have_css('[data-maps-target="container"]')
end
end
RSpec.shared_examples 'map controls' do
it 'has zoom controls' do
expect(page).to have_css('.leaflet-control-zoom')
expect(page).to have_css('.leaflet-control-zoom-in')
expect(page).to have_css('.leaflet-control-zoom-out')
end
it 'has layer control' do
expect(page).to have_css('.leaflet-control-layers', wait: 10)
end
it 'has scale control' do
expect(page).to have_css('.leaflet-control-scale')
expect(page).to have_css('.leaflet-control-scale-line')
end
it 'has stats control' do
expect(page).to have_css('.leaflet-control-stats', wait: 10)
end
it 'has attribution control' do
expect(page).to have_css('.leaflet-control-attribution')
end
end
RSpec.shared_examples 'expandable layer control' do
let(:layer_control) { find('.leaflet-control-layers') }
def expand_layer_control
if page.has_css?('.leaflet-control-layers-toggle', visible: true)
find('.leaflet-control-layers-toggle').click
else
layer_control.click
end
expect(page).to have_css('.leaflet-control-layers-expanded', wait: 5)
end
def collapse_layer_control
if page.has_css?('.leaflet-control-layers-toggle', visible: true)
find('.leaflet-control-layers-toggle').click
else
find('.leaflet-container').click
end
sleep 1
expect(page).not_to have_css('.leaflet-control-layers-expanded')
end
end
RSpec.shared_examples 'polyline popup content' do |distance_unit|
it "displays correct popup content with #{distance_unit} units" do
# Wait for polylines to load
expect(page).to have_css('.leaflet-overlay-pane', wait: 10)
sleep 2 # Allow polylines to fully render
# Find and hover over a polyline to trigger popup
# We need to use JavaScript to trigger the mouseover event on polylines
popup_content = page.evaluate_script(<<~JS)
// Find the first polyline group and trigger mouseover
const polylinesPane = document.querySelector('.leaflet-polylinesPane-pane');
if (polylinesPane) {
const canvas = polylinesPane.querySelector('canvas');
if (canvas) {
// Create a mouseover event at the center of the canvas
const rect = canvas.getBoundingClientRect();
const centerX = rect.left + rect.width / 2;
const centerY = rect.top + rect.height / 2;
const event = new MouseEvent('mouseover', {
bubbles: true,
cancelable: true,
clientX: centerX,
clientY: centerY
});
canvas.dispatchEvent(event);
// Wait a moment for popup to appear
setTimeout(() => {
const popup = document.querySelector('.leaflet-popup-content');
return popup ? popup.innerHTML : null;
}, 500);
}
}
return null;
JS
# Alternative approach: try to click on the map area where polylines should be
if popup_content.nil?
# Click in the center of the map to potentially trigger polyline interaction
map_element = find('.leaflet-container')
map_element.click
sleep 1
# Try to find any popup that might have appeared
if page.has_css?('.leaflet-popup-content', wait: 2)
popup_content = find('.leaflet-popup-content').text
end
end
# If we still don't have popup content, let's verify the polylines exist and are interactive
expect(page).to have_css('.leaflet-overlay-pane')
# Check that the map has the expected data attributes for distance unit
map_element = find('#map')
expect(map_element['data-user_settings']).to include("maps")
# Verify the user settings contain the expected distance unit
user_settings = JSON.parse(map_element['data-user_settings'])
expect(user_settings.dig('maps', 'distance_unit')).to eq(distance_unit)
end
end