Files
grecia/spec/shared/system/mappable.rb
Javi Martín 288f62cdd2 Use coordinates as marker labels when there's only one mappable
When editing/showing a proposal or an investment, the most relevant
information regarding the marker are the coordinates. The title of the
proposal or investment is redundant because we already know the marker
is about that proposal/investment.

There's one problem with this approach, though: when editing a proposal
or an investment, the aria-label of the marker isn't updated
automatically when we move the marker to a different place. This
behaviour will only affect people who use both a screen reader and a
mouse, since keyboard users can't change the position of the marker in
the first place. We'll deal with this issue when we make it possible to
change the position of a marker using the keyboard.
2025-11-17 15:39:36 +01:00

288 lines
9.7 KiB
Ruby

shared_examples "mappable" do |mappable_factory_name, mappable_association_name,
mappable_new_path, mappable_edit_path, mappable_show_path,
mappable_path_arguments: {},
management: false|
let!(:user) { create(:user, :level_two) }
let!(:arguments) { {} }
let!(:mappable) { create(mappable_factory_name.to_s.to_sym) }
let(:management) { management }
let!(:map_location) do
create(:map_location, :"#{mappable_factory_name}_map_location", "#{mappable_association_name}": mappable)
end
before do
Setting["feature.map"] = true
end
describe "At #{mappable_new_path}" do
before { set_arguments(arguments, mappable, mappable_path_arguments) }
scenario "Should show marker and create #{mappable_factory_name} with map" do
do_login_for user, management: management
visit send(mappable_new_path, arguments)
send("fill_in_#{mappable_factory_name}")
within_fieldset "Map location" do
expect(page).not_to have_css ".map-icon"
find("#new_map_location").click
expect(page).to have_css ".map-icon"
expect(page).not_to have_css ".map-icon[aria-label]"
end
send("submit_#{mappable_factory_name}_form")
within ".map-location" do
expect(page).to have_css(".map-icon")
end
end
scenario "Can not display map on #{mappable_factory_name} when not fill marker on map" do
do_login_for user, management: management
visit send(mappable_new_path, arguments)
send("fill_in_#{mappable_factory_name}")
expect(page).to have_css ".map-location"
send("submit_#{mappable_factory_name}_form")
expect(page).not_to have_css(".map-location")
end
scenario "Can not display map on #{mappable_factory_name} when feature.map is disabled" do
Setting["feature.map"] = false
do_login_for user, management: management
visit send(mappable_new_path, arguments)
send("fill_in_#{mappable_factory_name}")
expect(page).not_to have_css ".map-location"
send("submit_#{mappable_factory_name}_form")
expect(page).not_to have_css(".map-location")
end
describe "When restoring the page from browser history" do
before { Setting["org_name"] = "CONSUL" }
scenario "map should not be duplicated" do
do_login_for user, management: management
visit send(mappable_new_path, arguments)
if management
click_link "Select user"
expect(page).to have_content "User management"
else
click_link "CONSUL"
expect(page).to have_content "Most active proposals"
end
go_back
within_fieldset "Map location" do
expect(page).to have_css(".leaflet-map-pane", count: 1)
end
end
scenario "keeps marker and zoom defined by the user" do
do_login_for user, management: management
visit send(mappable_new_path, arguments)
within_fieldset "Map location" do
expect(page).not_to have_css ".map-icon"
end
expect(page.execute_script("return App.Map.maps[0].getZoom();")).to eq(10)
map_zoom_in
within_fieldset "Map location" do
find("#new_map_location").click
expect(page).to have_css(".map-icon")
end
if management
click_link "Select user"
expect(page).to have_content "User management"
else
click_link "CONSUL"
expect(page).to have_content "Most active proposals"
end
go_back
within_fieldset "Map location" do
expect(page).to have_css ".map-icon"
expect(page.execute_script("return App.Map.maps[0].getZoom();")).to eq 11
end
end
scenario "shows marker at map center" do
do_login_for user, management: management
visit send(mappable_new_path, arguments)
within_fieldset "Map location" do
expect(page).not_to have_css ".map-icon"
end
place_map_at(-68.592487, -62.391357)
within_fieldset "Map location" do
find("#new_map_location").click
expect(page).to have_css(".map-icon")
end
if management
click_link "Select user"
expect(page).to have_content "User management"
else
click_link "CONSUL"
expect(page).to have_content "Most active proposals"
end
go_back
within_fieldset "Map location" do
expect(page).to have_css ".map-icon"
end
end
end
scenario "Skip map" do
do_login_for user, management: management
visit send(mappable_new_path, arguments)
send("fill_in_#{mappable_factory_name}")
send("submit_#{mappable_factory_name}_form")
expect(page).not_to have_content "Map location can't be blank"
end
end
describe "At #{mappable_edit_path}", if: mappable_edit_path.present? do
scenario "Should edit mappable on #{mappable_factory_name} without changing the map" do
mappable.map_location.update!(latitude: 51.48, longitude: 0.0)
do_login_for mappable.author, management: management
visit send(mappable_edit_path, id: mappable.id)
expect(page).to have_content "Navigate the map to the location and place the marker."
expect(page).to have_css ".map-icon[aria-label='Latitude: 51.48. Longitude: 0.0']"
expect(page).to have_field "#{mappable_factory_name}_map_location_attributes_latitude", type: :hidden,
with: "51.48"
expect(page).to have_field "#{mappable_factory_name}_map_location_attributes_longitude", type: :hidden,
with: "0.0"
fill_in "#{mappable_factory_name.camelize} title", with: "New title"
click_button "Save changes"
expect(page).not_to have_button "Save changes"
expect(page).to have_css ".map-location"
expect(page).to have_css ".map-location[data-marker-latitude='51.48']"
expect(page).to have_css ".map-location[data-marker-longitude='0.0']"
end
scenario "Should edit default values from map on #{mappable_factory_name} edit page" do
original_longitude = map_location.longitude
original_latitude = map_location.latitude
do_login_for mappable.author, management: management
visit send(mappable_edit_path, id: mappable.id)
within_fieldset "Map location" do
find(".map-location").click(x: 30, y: 30)
end
new_latitude = find_field(
"#{mappable_factory_name}_map_location_attributes_latitude", type: :hidden
).value
new_longitude = find_field(
"#{mappable_factory_name}_map_location_attributes_longitude", type: :hidden
).value
click_button "Save changes"
expect(page).not_to have_button "Save changes"
expect(page).to have_css ".map-location"
expect(page).to have_css ".map-location[data-marker-latitude='#{new_latitude}']"
expect(page).to have_css ".map-location[data-marker-longitude='#{new_longitude}']"
expect(page).not_to have_css ".map-location[data-marker-latitude='#{original_latitude}']"
expect(page).not_to have_css ".map-location[data-marker-longitude='#{original_longitude}']"
end
scenario "Can not display map on #{mappable_factory_name} edit when remove map marker" do
do_login_for mappable.author, management: management
visit send(mappable_edit_path, id: mappable.id)
within_fieldset("Map location") { click_button "Remove map marker" }
click_button "Save changes"
expect(page).not_to have_button "Save changes"
expect(page).not_to have_css ".map-location"
expect(page).not_to have_content "Map location can't be blank"
end
scenario "Can not display map on #{mappable_factory_name} edit when feature.map is disabled" do
Setting["feature.map"] = false
do_login_for mappable.author, management: management
visit send(mappable_edit_path, id: mappable.id)
fill_in "#{mappable_factory_name.camelize} title", with: "New title"
click_button "Save changes"
expect(page).not_to have_button "Save changes"
expect(page).not_to have_css ".map-location"
end
end
describe "At #{mappable_show_path}" do
before do
set_arguments(arguments, mappable, mappable_path_arguments)
end
scenario "Should display marker on #{mappable_factory_name} show page with aria label" do
arguments[:id] = mappable.id
mappable.update!(title: "Malformed quote\" and >")
do_login_for user, management: management if management
visit send(mappable_show_path, arguments)
label = "Latitude: #{map_location.latitude}. Longitude: #{map_location.longitude}"
within ".map-location" do
expect(page).to have_css ".map-icon[aria-label='#{label}']"
end
end
scenario "Should not display map on #{mappable_factory_name} show when marker is not defined" do
mappable_without_map = create(mappable_factory_name.to_s.to_sym)
set_arguments(arguments, mappable_without_map, mappable_path_arguments)
arguments[:id] = mappable_without_map.id
do_login_for user, management: management if management
visit send(mappable_show_path, arguments)
expect(page).not_to have_css(".map-location")
end
scenario "Should not display map on #{mappable_factory_name} show page when feature.map is disable" do
Setting["feature.map"] = false
arguments[:id] = mappable.id
do_login_for user, management: management if management
visit send(mappable_show_path, arguments)
expect(page).not_to have_css(".map-location")
end
end
end