# frozen_string_literal: true # This shared example is no longer needed since authentication is handled globally # RSpec.shared_examples 'a signed in user on map page' do # before do # sign_in_and_visit_map(user) # end # end 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