mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-10 17:21:38 -05:00
150 lines
4.1 KiB
Ruby
150 lines
4.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module PolylinePopupHelpers
|
|
def trigger_polyline_hover_and_get_popup
|
|
# Wait for polylines to be fully loaded
|
|
expect(page).to have_css('.leaflet-overlay-pane', wait: 10)
|
|
sleep 2 # Allow time for polylines to render
|
|
|
|
# Try multiple approaches to trigger polyline hover
|
|
popup_content = try_canvas_hover || try_polyline_click || try_map_interaction
|
|
|
|
popup_content
|
|
end
|
|
|
|
def verify_popup_content_structure(popup_content, distance_unit)
|
|
return false unless popup_content
|
|
|
|
# Check for required fields in popup
|
|
required_fields = [
|
|
'Start:',
|
|
'End:',
|
|
'Duration:',
|
|
'Total Distance:',
|
|
'Current Speed:'
|
|
]
|
|
|
|
# Check that all required fields are present
|
|
fields_present = required_fields.all? { |field| popup_content.include?(field) }
|
|
|
|
# Check distance unit in Total Distance field
|
|
distance_unit_present = popup_content.include?(distance_unit == 'km' ? 'km' : 'mi')
|
|
|
|
# Check speed unit in Current Speed field (should match distance unit)
|
|
speed_unit_present = if distance_unit == 'mi'
|
|
popup_content.include?('mph')
|
|
else
|
|
popup_content.include?('km/h')
|
|
end
|
|
|
|
fields_present && distance_unit_present && speed_unit_present
|
|
end
|
|
|
|
def extract_popup_data(popup_content)
|
|
return {} unless popup_content
|
|
|
|
data = {}
|
|
|
|
# Extract start time
|
|
if match = popup_content.match(/Start:<\/strong>\s*([^<]+)/)
|
|
data[:start] = match[1].strip
|
|
end
|
|
|
|
# Extract end time
|
|
if match = popup_content.match(/End:<\/strong>\s*([^<]+)/)
|
|
data[:end] = match[1].strip
|
|
end
|
|
|
|
# Extract duration
|
|
if match = popup_content.match(/Duration:<\/strong>\s*([^<]+)/)
|
|
data[:duration] = match[1].strip
|
|
end
|
|
|
|
# Extract total distance
|
|
if match = popup_content.match(/Total Distance:<\/strong>\s*([^<]+)/)
|
|
data[:total_distance] = match[1].strip
|
|
end
|
|
|
|
# Extract current speed
|
|
if match = popup_content.match(/Current Speed:<\/strong>\s*([^<]+)/)
|
|
data[:current_speed] = match[1].strip
|
|
end
|
|
|
|
data
|
|
end
|
|
|
|
private
|
|
|
|
def try_canvas_hover
|
|
page.evaluate_script(<<~JS)
|
|
return new Promise((resolve) => {
|
|
const polylinesPane = document.querySelector('.leaflet-polylinesPane-pane');
|
|
if (polylinesPane) {
|
|
const canvas = polylinesPane.querySelector('canvas');
|
|
if (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);
|
|
|
|
setTimeout(() => {
|
|
const popup = document.querySelector('.leaflet-popup-content');
|
|
resolve(popup ? popup.innerHTML : null);
|
|
}, 1000);
|
|
} else {
|
|
resolve(null);
|
|
}
|
|
} else {
|
|
resolve(null);
|
|
}
|
|
});
|
|
JS
|
|
rescue => e
|
|
Rails.logger.debug "Canvas hover failed: #{e.message}"
|
|
nil
|
|
end
|
|
|
|
def try_polyline_click
|
|
# Try to find and click on polyline elements directly
|
|
if page.has_css?('path[stroke]', wait: 2)
|
|
polyline = first('path[stroke]')
|
|
polyline.click if polyline
|
|
sleep 1
|
|
|
|
if page.has_css?('.leaflet-popup-content')
|
|
return find('.leaflet-popup-content').native.inner_html
|
|
end
|
|
end
|
|
nil
|
|
rescue => e
|
|
Rails.logger.debug "Polyline click failed: #{e.message}"
|
|
nil
|
|
end
|
|
|
|
def try_map_interaction
|
|
# As a fallback, click in the center of the map
|
|
map_element = find('.leaflet-container')
|
|
map_element.click
|
|
sleep 1
|
|
|
|
if page.has_css?('.leaflet-popup-content', wait: 2)
|
|
return find('.leaflet-popup-content').native.inner_html
|
|
end
|
|
nil
|
|
rescue => e
|
|
Rails.logger.debug "Map interaction failed: #{e.message}"
|
|
nil
|
|
end
|
|
end
|
|
|
|
RSpec.configure do |config|
|
|
config.include PolylinePopupHelpers, type: :system
|
|
end
|