From: Tom Hughes Date: Sun, 13 Aug 2023 09:50:33 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/pull/4144' X-Git-Tag: live~1574 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/e2cb2327f9e5a3a107dbe249e4fe503cbde45d24?hp=41f8607810c3d2fdba66d964d2b591bbdc78abea Merge remote-tracking branch 'upstream/pull/4144' --- diff --git a/app/assets/javascripts/messages.js b/app/assets/javascripts/messages.js index 0cae79a58..5accc1a60 100644 --- a/app/assets/javascripts/messages.js +++ b/app/assets/javascripts/messages.js @@ -1,30 +1,34 @@ $(document).ready(function () { $(".inbox-mark-unread").on("ajax:success", function (event, data) { - $("#inboxanchor").remove(); - $(".user-button").before(data.inboxanchor); - - $("#inbox-count").replaceWith(data.inbox_count); - - $(this).parents(".inbox-row").removeClass("inbox-row").addClass("inbox-row-unread"); + updateHtml(data); + updateReadState(this, false); }); $(".inbox-mark-read").on("ajax:success", function (event, data) { - $("#inboxanchor").remove(); - $(".user-button").before(data.inboxanchor); + updateHtml(data); + updateReadState(this, true); + }); - $("#inbox-count").replaceWith(data.inbox_count); + $(".inbox-destroy").on("ajax:success", function (event, data) { + updateHtml(data); - $(this).parents(".inbox-row-unread").removeClass("inbox-row-unread").addClass("inbox-row"); + $(this).closest("tr").fadeOut(800, "linear", function () { + $(this).remove(); + }); }); - $(".inbox-destroy").on("ajax:success", function (event, data) { + function updateHtml(data) { $("#inboxanchor").remove(); $(".user-button").before(data.inboxanchor); $("#inbox-count").replaceWith(data.inbox_count); - - $(this).parents(".inbox-row, .inbox-row-unread").fadeOut(800, "linear", function () { - $(this).remove(); - }); - }); + } + + function updateReadState(target, isRead) { + $(target).closest("tr") + .toggleClass("inbox-row", isRead) + .toggleClass("inbox-row-unread", !isRead) + .find(".inbox-mark-unread").prop("hidden", !isRead).end() + .find(".inbox-mark-read").prop("hidden", isRead); + } }); diff --git a/app/assets/javascripts/user.js b/app/assets/javascripts/user.js index 964f187f9..146d876f7 100644 --- a/app/assets/javascripts/user.js +++ b/app/assets/javascripts/user.js @@ -1,8 +1,11 @@ //= require leaflet.locatecontrol/src/L.Control.Locate $(document).ready(function () { + var defaultHomeZoom = 12; + var map, marker, deleted_lat, deleted_lon; + if ($("#map").length) { - var map = L.map("map", { + map = L.map("map", { attributionControl: false, zoomControl: false }).addLayer(new L.OSM.Mapnik()); @@ -35,13 +38,17 @@ $(document).ready(function () { .addClass("control-button"); if (OSM.home) { - map.setView([OSM.home.lat, OSM.home.lon], 12); + map.setView([OSM.home.lat, OSM.home.lon], defaultHomeZoom); } else { map.setView([0, 0], 0); } if ($("#map").hasClass("set_location")) { - var marker = L.marker([0, 0], { icon: OSM.getUserIcon() }); + marker = L.marker([0, 0], { + icon: OSM.getUserIcon(), + keyboard: false, + interactive: false + }); if (OSM.home) { marker.setLatLng([OSM.home.lat, OSM.home.lon]); @@ -49,18 +56,65 @@ $(document).ready(function () { } map.on("click", function (e) { - if ($("#updatehome").is(":checked")) { - var zoom = map.getZoom(), - precision = OSM.zoomPrecision(zoom), - location = e.latlng.wrap(); + if (!$("#updatehome").is(":checked")) return; + + var zoom = map.getZoom(), + precision = OSM.zoomPrecision(zoom), + location = e.latlng.wrap(); + + $("#home_lat").val(location.lat.toFixed(precision)); + $("#home_lon").val(location.lng.toFixed(precision)); + + deleted_lat = null; + deleted_lon = null; + respondToHomeUpdate(); + }).on("moveend", function () { + var lat = $("#home_lat").val().trim(), + lon = $("#home_lon").val().trim(), + location; + + try { + if (lat && lon) { + location = L.latLng(lat, lon); + } + } catch (error) { + // keep location undefined + } - $("#home_message").hide(); - $("#home_lat").val(location.lat.toFixed(precision)); - $("#home_lon").val(location.lng.toFixed(precision)); + $("#home_show").prop("disabled", !location || isCloseEnoughToMapCenter(location)); + }); - marker.setLatLng(e.latlng); - marker.addTo(map); - } + $("#home_lat, #home_lon").on("input", function () { + deleted_lat = null; + deleted_lon = null; + respondToHomeUpdate(); + }); + + $("#home_show").click(function () { + var lat = $("#home_lat").val(), + lon = $("#home_lon").val(); + + map.setView([lat, lon], defaultHomeZoom); + }); + + $("#home_delete").click(function () { + var lat = $("#home_lat").val(), + lon = $("#home_lon").val(); + + $("#home_lat, #home_lon").val(""); + deleted_lat = lat; + deleted_lon = lon; + respondToHomeUpdate(); + $("#home_undelete").trigger("focus"); + }); + + $("#home_undelete").click(function () { + $("#home_lat").val(deleted_lat); + $("#home_lon").val(deleted_lon); + deleted_lat = null; + deleted_lon = null; + respondToHomeUpdate(); + $("#home_delete").trigger("focus"); }); } else { $("[data-user]").each(function () { @@ -73,6 +127,41 @@ $(document).ready(function () { } } + function respondToHomeUpdate() { + var lat = $("#home_lat").val().trim(), + lon = $("#home_lon").val().trim(), + location; + + try { + if (lat && lon) { + location = L.latLng(lat, lon); + } + $("#home_lat, #home_lon").removeClass("is-invalid"); + } catch (error) { + if (lat && isNaN(lat)) $("#home_lat").addClass("is-invalid"); + if (lon && isNaN(lon)) $("#home_lon").addClass("is-invalid"); + } + + $("#home_message").toggleClass("invisible", Boolean(location)); + $("#home_show").prop("hidden", !location); + $("#home_delete").prop("hidden", !location); + $("#home_undelete").prop("hidden", !(!location && deleted_lat && deleted_lon)); + if (location) { + marker.setLatLng([lat, lon]); + marker.addTo(map); + map.panTo([lat, lon]); + } else { + marker.removeFrom(map); + } + } + + function isCloseEnoughToMapCenter(location) { + var inputPt = map.latLngToContainerPoint(location), + centerPt = map.latLngToContainerPoint(map.getCenter()); + + return centerPt.distanceTo(inputPt) < 10; + } + function updateAuthUID() { var provider = $("select#user_auth_provider").val(); diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 5b15fcc5d..b694247a8 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -1107,11 +1107,6 @@ tr.turn:hover { /* Rules for messages pages */ .messages { - button[type="submit"] { - margin: auto; - white-space: nowrap; - } - .inbox-row { background: $offwhite; } @@ -1121,24 +1116,6 @@ tr.turn:hover { } } -.inbox-row .inbox-mark-read { - display: none; -} - -.inbox-sent { - white-space: nowrap; -} - -.inbox-mark-unread, -.inbox-mark-read, -.inbox-delete { - width: 1%; -} - -.inbox-row-unread .inbox-mark-unread { - display: none; -} - .search_form { background-color: $lightgrey; diff --git a/app/controllers/api/changesets_controller.rb b/app/controllers/api/changesets_controller.rb index 0dffd4de2..660140427 100644 --- a/app/controllers/api/changesets_controller.rb +++ b/app/controllers/api/changesets_controller.rb @@ -170,8 +170,15 @@ module Api changesets = conditions_closed(changesets, params["closed"]) changesets = conditions_ids(changesets, params["changesets"]) - # sort and limit the changesets - changesets = changesets.order("created_at DESC").limit(result_limit) + # sort the changesets + changesets = if params[:order] == "oldest" + changesets.order("created_at ASC") + else + changesets.order("created_at DESC") + end + + # limit the result + changesets = changesets.limit(result_limit) # preload users, tags and comments, and render result @changesets = changesets.preload(:user, :changeset_tags, :comments) diff --git a/app/controllers/diary_entries_controller.rb b/app/controllers/diary_entries_controller.rb index ea9aacb21..018343d7c 100644 --- a/app/controllers/diary_entries_controller.rb +++ b/app/controllers/diary_entries_controller.rb @@ -280,7 +280,7 @@ class DiaryEntriesController < ApplicationController @lon = @diary_entry.longitude @lat = @diary_entry.latitude @zoom = 12 - elsif current_user.home_lat.nil? || current_user.home_lon.nil? + elsif !current_user.has_home? @lon = params[:lon] || -0.1 @lat = params[:lat] || 51.5 @zoom = params[:zoom] || 4 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index bb09f3a49..4b3a22cd3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -54,7 +54,7 @@ module ApplicationHelper if current_user data[:user] = current_user.id.to_json - data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } unless current_user.home_lon.nil? || current_user.home_lat.nil? + data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } if current_user.has_home? end data[:location] = session[:location] if session[:location] diff --git a/app/models/user.rb b/app/models/user.rb index c809b6192..41f249d4e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -238,8 +238,12 @@ class User < ApplicationRecord @preferred_languages ||= Locale.list(languages) end + def has_home? + home_lat && home_lon + end + def nearby(radius = Settings.nearby_radius, num = Settings.nearby_users) - if home_lon && home_lat + if has_home? gc = OSM::GreatCircle.new(home_lat, home_lon) sql_for_area = QuadTile.sql_for_area(gc.bounds(radius), "home_") sql_for_distance = gc.sql_for_distance("home_lat", "home_lon") @@ -401,6 +405,6 @@ class User < ApplicationRecord end def update_tile - self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if home_lat && home_lon + self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if has_home? end end diff --git a/app/views/api/capabilities/show.json.jbuilder b/app/views/api/capabilities/show.json.jbuilder new file mode 100644 index 000000000..ceffa8b0e --- /dev/null +++ b/app/views/api/capabilities/show.json.jbuilder @@ -0,0 +1,44 @@ +json.partial! "api/root_attributes" + +json.api do + json.version do + json.minimum Settings.api_version + json.maximum Settings.api_version + end + json.area do + json.maximum Settings.max_request_area + end + json.note_area do + json.maximum Settings.max_note_request_area + end + json.tracepoints do + json.per_page Settings.tracepoints_per_page + end + json.waynodes do + json.maximum Settings.max_number_of_way_nodes + end + json.relationmembers do + json.maximum Settings.max_number_of_relation_members + end + json.changesets do + json.maximum_elements Changeset::MAX_ELEMENTS + json.default_query_limit Settings.default_changeset_query_limit + json.maximum_query_limit Settings.max_changeset_query_limit + end + json.timeout do + json.seconds Settings.api_timeout + end + json.status do + json.database @database_status + json.api @api_status + json.gpx @gpx_status + end +end + +json.policy do + json.imagery do + json.blacklist(Settings.imagery_blacklist) do |url_regex| + json.regex url_regex.to_s + end + end +end diff --git a/app/views/api/users/_user.json.jbuilder b/app/views/api/users/_user.json.jbuilder index 15f0685ac..b84916010 100644 --- a/app/views/api/users/_user.json.jbuilder +++ b/app/views/api/users/_user.json.jbuilder @@ -46,7 +46,7 @@ json.user do end if current_user && current_user == user && can?(:details, User) - if user.home_lat && user.home_lon + if user.has_home? json.home do json.lat user.home_lat json.lon user.home_lon diff --git a/app/views/api/users/_user.xml.builder b/app/views/api/users/_user.xml.builder index 1791c60ef..23ec1d34d 100644 --- a/app/views/api/users/_user.xml.builder +++ b/app/views/api/users/_user.xml.builder @@ -25,7 +25,7 @@ xml.tag! "user", :id => user.id, end end if current_user && current_user == user && can?(:details, User) - if user.home_lat && user.home_lon + if user.has_home? xml.tag! "home", :lat => user.home_lat, :lon => user.home_lon, :zoom => user.home_zoom diff --git a/app/views/dashboards/_contact.html.erb b/app/views/dashboards/_contact.html.erb index 7785c0552..aba6094b2 100644 --- a/app/views/dashboards/_contact.html.erb +++ b/app/views/dashboards/_contact.html.erb @@ -11,7 +11,7 @@

<%= link_to contact.display_name, user_path(contact) %> - <% if @user.home_lon and @user.home_lat and contact.home_lon and contact.home_lat %> + <% if @user.has_home? and contact.has_home? %> <% distance = @user.distance(contact) %> <% if distance < 1 %> (<%= t ".m away", :count => (distance * 1000).round %>) diff --git a/app/views/dashboards/show.html.erb b/app/views/dashboards/show.html.erb index d0344ce79..eb3ceef6c 100644 --- a/app/views/dashboards/show.html.erb +++ b/app/views/dashboards/show.html.erb @@ -5,7 +5,7 @@

<% if current_user and @user.id == current_user.id %>
- <% if @user.home_lat.nil? or @user.home_lon.nil? %> + <% if !@user.has_home? %>

<%= t(".no_home_location_html", :edit_profile_link => link_to(t(".edit_your_profile"), edit_profile_path)) %>

diff --git a/app/views/layouts/_banner.html.erb b/app/views/layouts/_banner.html.erb index f806201eb..c7cc75c49 100644 --- a/app/views/layouts/_banner.html.erb +++ b/app/views/layouts/_banner.html.erb @@ -1,4 +1,4 @@ <% unless (banner = next_banner()).nil? %> -<%= link_to (image_tag banner[:img], :alt => banner[:alt], :title => banner[:alt]), banner[:link] %> +<%= link_to (image_tag banner[:img], :srcset => banner[:srcset], :alt => banner[:alt], :title => banner[:alt]), banner[:link] %> <% end %> diff --git a/app/views/layouts/map.html.erb b/app/views/layouts/map.html.erb index 6d983d30e..40f06a899 100644 --- a/app/views/layouts/map.html.erb +++ b/app/views/layouts/map.html.erb @@ -4,7 +4,7 @@ <% content_for(:body_class) { "map-layout" } %> -<% if current_user and !current_user.home_lon.nil? and !current_user.home_lat.nil? %> +<% if current_user&.has_home? %> <% content_for :greeting do %> <%= link_to t("layouts.home"), "#", diff --git a/app/views/messages/_message_summary.html.erb b/app/views/messages/_message_summary.html.erb index 1a4445eae..b2a1bc268 100644 --- a/app/views/messages/_message_summary.html.erb +++ b/app/views/messages/_message_summary.html.erb @@ -1,8 +1,10 @@ "> - <%= link_to message_summary.sender.display_name, user_path(message_summary.sender) %> - <%= link_to message_summary.title, message_path(message_summary) %> - <%= l message_summary.sent_on, :format => :friendly %> - <%= button_to t(".unread_button"), message_mark_path(message_summary, :mark => "unread"), :remote => true, :class => "btn btn-sm btn-primary" %> - <%= button_to t(".read_button"), message_mark_path(message_summary, :mark => "read"), :remote => true, :class => "btn btn-sm btn-primary" %> - <%= button_to t(".destroy_button"), message_path(message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger" %> + <%= link_to message_summary.sender.display_name, user_path(message_summary.sender) %> + <%= link_to message_summary.title, message_path(message_summary) %> + <%= l message_summary.sent_on, :format => :friendly %> + + <%= button_to t(".unread_button"), message_mark_path(message_summary, :mark => "unread"), :remote => true, :class => "btn btn-sm btn-primary", :form => { :class => "inbox-mark-unread", :hidden => !message_summary.message_read? } %> + <%= button_to t(".read_button"), message_mark_path(message_summary, :mark => "read"), :remote => true, :class => "btn btn-sm btn-primary", :form => { :class => "inbox-mark-read", :hidden => message_summary.message_read? } %> + <%= button_to t(".destroy_button"), message_path(message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger", :form_class => "inbox-destroy" %> + diff --git a/app/views/messages/_sent_message_summary.html.erb b/app/views/messages/_sent_message_summary.html.erb index 4d1b361b1..24caba5ab 100644 --- a/app/views/messages/_sent_message_summary.html.erb +++ b/app/views/messages/_sent_message_summary.html.erb @@ -1,6 +1,8 @@ - <%= link_to sent_message_summary.recipient.display_name, user_path(sent_message_summary.recipient) %> - <%= link_to sent_message_summary.title, message_path(sent_message_summary) %> - <%= l sent_message_summary.sent_on, :format => :friendly %> - <%= button_to t(".destroy_button"), message_path(sent_message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger" %> + <%= link_to sent_message_summary.recipient.display_name, user_path(sent_message_summary.recipient) %> + <%= link_to sent_message_summary.title, message_path(sent_message_summary) %> + <%= l sent_message_summary.sent_on, :format => :friendly %> + + <%= button_to t(".destroy_button"), message_path(sent_message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger", :form_class => "inbox-destroy" %> + diff --git a/app/views/messages/inbox.html.erb b/app/views/messages/inbox.html.erb index 4f2925b14..54089c34a 100644 --- a/app/views/messages/inbox.html.erb +++ b/app/views/messages/inbox.html.erb @@ -19,14 +19,12 @@

<%= render :partial => "message_count" %>

<% if current_user.messages.size > 0 %> - +
- - diff --git a/app/views/messages/outbox.html.erb b/app/views/messages/outbox.html.erb index 0099b573d..e246f9292 100644 --- a/app/views/messages/outbox.html.erb +++ b/app/views/messages/outbox.html.erb @@ -20,13 +20,12 @@

<%= t ".messages", :count => current_user.sent_messages.size %>

<% if current_user.sent_messages.size > 0 %> -
<%= t ".from" %> <%= t ".subject" %> <%= t ".date" %>
+
- diff --git a/app/views/profiles/edit.html.erb b/app/views/profiles/edit.html.erb index 5bf7426f2..cac657ff1 100644 --- a/app/views/profiles/edit.html.erb +++ b/app/views/profiles/edit.html.erb @@ -42,13 +42,18 @@
<%= t ".home location" -%> -

hidden<% end %>><%= t ".no home location" %>

+

<%= t ".no home location" %>

<%= f.text_field :home_lat, :wrapper_class => "col-sm-4", :id => "home_lat" %> <%= f.text_field :home_lon, :wrapper_class => "col-sm-4", :id => "home_lon" %> +
+ + + +
- checked="checked" <% end %> id="updatehome" /> + checked <% end %> id="updatehome" />
<%= tag.div "", :id => "map", :class => "content_map set_location border border-grey rounded" %> diff --git a/config/locales/en.yml b/config/locales/en.yml index c05b92d44..e14c5806c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1754,6 +1754,9 @@ en: home location: "Home Location" no home location: "You have not entered your home location." update home location on click: "Update home location when I click on the map?" + show: "Show" + delete: "Delete" + undelete: "Undo delete" update: success: Profile updated. failure: Couldn't update profile. diff --git a/test/controllers/api/capabilities_controller_test.rb b/test/controllers/api/capabilities_controller_test.rb index 9d6de4a6f..aa8e21938 100644 --- a/test/controllers/api/capabilities_controller_test.rb +++ b/test/controllers/api/capabilities_controller_test.rb @@ -9,10 +9,18 @@ module Api { :path => "/api/capabilities", :method => :get }, { :controller => "api/capabilities", :action => "show" } ) + assert_routing( + { :path => "/api/capabilities.json", :method => :get }, + { :controller => "api/capabilities", :action => "show", :format => "json" } + ) assert_recognizes( { :controller => "api/capabilities", :action => "show" }, { :path => "/api/0.6/capabilities", :method => :get } ) + assert_recognizes( + { :controller => "api/capabilities", :action => "show", :format => "json" }, + { :path => "/api/0.6/capabilities.json", :method => :get } + ) end def test_capabilities @@ -32,5 +40,28 @@ module Api end end end + + def test_capabilities_json + get api_capabilities_path, :params => { :format => "json" } + assert_response :success + js = ActiveSupport::JSON.decode(@response.body) + assert_not_nil js + + assert_equal Settings.api_version, js["version"] + assert_equal Settings.generator, js["generator"] + assert_equal Settings.api_version, js["api"]["version"]["minimum"] + assert_equal Settings.api_version, js["api"]["version"]["maximum"] + assert_equal Settings.max_request_area, js["api"]["area"]["maximum"] + assert_equal Settings.max_note_request_area, js["api"]["note_area"]["maximum"] + assert_equal Settings.tracepoints_per_page, js["api"]["tracepoints"]["per_page"] + assert_equal Changeset::MAX_ELEMENTS, js["api"]["changesets"]["maximum_elements"] + assert_equal Settings.default_changeset_query_limit, js["api"]["changesets"]["default_query_limit"] + assert_equal Settings.max_changeset_query_limit, js["api"]["changesets"]["maximum_query_limit"] + assert_equal Settings.max_number_of_relation_members, js["api"]["relationmembers"]["maximum"] + assert_equal "online", js["api"]["status"]["database"] + assert_equal "online", js["api"]["status"]["api"] + assert_equal "online", js["api"]["status"]["gpx"] + assert_equal Settings.imagery_blacklist.length, js["policy"]["imagery"]["blacklist"].length + end end end diff --git a/test/controllers/api/changesets_controller_test.rb b/test/controllers/api/changesets_controller_test.rb index 7f2cd0abb..4f96e3ecb 100644 --- a/test/controllers/api/changesets_controller_test.rb +++ b/test/controllers/api/changesets_controller_test.rb @@ -151,7 +151,7 @@ module Api get changeset_show_path(changeset) assert_response :success, "cannot get first changeset" - assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 assert_select "osm>changeset[id='#{changeset.id}']", 1 assert_select "osm>changeset>@open", "true" assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema @@ -161,7 +161,7 @@ module Api get changeset_show_path(changeset), :params => { :include_discussion => true } assert_response :success, "cannot get first changeset with comments" - assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 assert_select "osm>changeset[id='#{changeset.id}']", 1 assert_select "osm>changeset>@open", "true" assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema @@ -175,7 +175,7 @@ module Api get changeset_show_path(changeset), :params => { :include_discussion => true } assert_response :success, "cannot get closed changeset with comments" - assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 assert_select "osm>changeset[id='#{changeset.id}']", 1 assert_select "osm>changeset>@open", "false" assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema @@ -194,7 +194,7 @@ module Api assert_not_nil js assert_equal Settings.api_version, js["version"] - assert_equal "OpenStreetMap server", js["generator"] + assert_equal Settings.generator, js["generator"] assert_equal changeset.id, js["changeset"]["id"] assert js["changeset"]["open"] assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"] @@ -210,7 +210,7 @@ module Api js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal Settings.api_version, js["version"] - assert_equal "OpenStreetMap server", js["generator"] + assert_equal Settings.generator, js["generator"] assert_equal changeset.id, js["changeset"]["id"] assert js["changeset"]["open"] assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"] @@ -247,7 +247,7 @@ module Api assert_not_nil js assert_equal Settings.api_version, js["version"] - assert_equal "OpenStreetMap server", js["generator"] + assert_equal Settings.generator, js["generator"] assert_equal changeset.id, js["changeset"]["id"] assert_not js["changeset"]["open"] assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"] @@ -521,7 +521,7 @@ module Api "can't upload a simple valid creation to changeset: #{@response.body}" # check the returned payload - assert_select "diffResult[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 assert_select "diffResult>node", 1 assert_select "diffResult>way", 1 assert_select "diffResult>relation", 1 @@ -759,7 +759,7 @@ module Api "can't do a conditional delete of in use objects: #{@response.body}" # check the returned payload - assert_select "diffResult[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 assert_select "diffResult>node", 1 assert_select "diffResult>way", 1 assert_select "diffResult>relation", 1 @@ -1430,7 +1430,7 @@ module Api "failed to return error in XML format" # check the returned payload - assert_select "osmError[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "osmError[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 assert_select "osmError>status", 1 assert_select "osmError>message", 1 end @@ -1890,7 +1890,7 @@ module Api assert_not_nil js assert_equal Settings.api_version, js["version"] - assert_equal "OpenStreetMap server", js["generator"] + assert_equal Settings.generator, js["generator"] assert_equal 2, js["changesets"].count # check that the correct error is given when we provide both UID and name @@ -1950,23 +1950,58 @@ module Api get changesets_path assert_response :success - assert_changesets [changeset5, changeset4, changeset3, changeset2, changeset1] + assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1] get changesets_path(:limit => "3") assert_response :success - assert_changesets [changeset5, changeset4, changeset3] + assert_changesets_in_order [changeset5, changeset4, changeset3] get changesets_path(:limit => "0") assert_response :bad_request get changesets_path(:limit => Settings.max_changeset_query_limit) assert_response :success - assert_changesets [changeset5, changeset4, changeset3, changeset2, changeset1] + assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1] get changesets_path(:limit => Settings.max_changeset_query_limit + 1) assert_response :bad_request end + ## + # test the query functionality of changesets with the order parameter + def test_query_order + user = create(:user) + changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0)) + changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 2, 1, 0, 0, 0), :closed_at => Time.utc(2008, 2, 2, 0, 0, 0)) + changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 3, 1, 0, 0, 0), :closed_at => Time.utc(2008, 3, 2, 0, 0, 0)) + changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 4, 1, 0, 0, 0), :closed_at => Time.utc(2008, 4, 2, 0, 0, 0)) + changeset5 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 5, 1, 0, 0, 0), :closed_at => Time.utc(2008, 5, 2, 0, 0, 0)) + + get changesets_path(:order => "oldest") + assert_response :success + assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5] + + get changesets_path(:order => "oldest", :time => "2008-01-01T00:00Z,2018-01-01T00:00Z") + assert_response :success + assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5] + + get changesets_path(:order => "oldest", :time => "2008-01-02T00:00Z,2018-01-01T00:00Z") + assert_response :success + assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5] + + get changesets_path(:order => "oldest", :time => "2008-01-02T00:01Z,2018-01-01T00:00Z") + assert_response :success + assert_changesets_in_order [changeset2, changeset3, changeset4, changeset5] + + get changesets_path(:order => "oldest", :time => "2008-04-01T00:00Z,2018-01-01T00:00Z") + assert_response :success + assert_changesets_in_order [changeset4, changeset5] + + get changesets_path(:order => "oldest", :time => "2008-06-01T00:00Z,2018-01-01T00:00Z") + assert_response :success + assert_changesets_in_order [] + end + ## # check that errors are returned if garbage is inserted # into query strings @@ -2247,8 +2282,7 @@ module Api private ## - # boilerplate for checking that certain changesets exist in the - # output. + # check that certain changesets exist in the output def assert_changesets(changesets) assert_select "osm>changeset", changesets.size changesets.each do |changeset| @@ -2256,6 +2290,15 @@ module Api end end + ## + # check that certain changesets exist in the output in the specified order + def assert_changesets_in_order(changesets) + assert_select "osm>changeset", changesets.size + changesets.each_with_index do |changeset, index| + assert_select "osm>changeset:nth-child(#{index + 1})[id='#{changeset.id}']", 1 + end + end + ## # update the changeset_id of a way element def update_changeset(xml, changeset_id) diff --git a/test/controllers/api/relations_controller_test.rb b/test/controllers/api/relations_controller_test.rb index eb8f8e022..7f2c19665 100644 --- a/test/controllers/api/relations_controller_test.rb +++ b/test/controllers/api/relations_controller_test.rb @@ -915,7 +915,7 @@ module Api assert_response :success # count one osm element - assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1 + assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 # we should have only the expected number of relations assert_select "osm>relation", expected_relations.size diff --git a/yarn.lock b/yarn.lock index 2be69e654..5ff60cd30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,10 +19,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== -"@eslint/eslintrc@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" - integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -34,10 +34,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^8.46.0": - version "8.46.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" - integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== +"@eslint/js@^8.47.0": + version "8.47.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d" + integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== "@humanwhocodes/config-array@^0.11.10": version "0.11.10" @@ -218,20 +218,20 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" - integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.0.0: - version "8.46.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" - integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== + version "8.47.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806" + integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.1" - "@eslint/js" "^8.46.0" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "^8.47.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -242,7 +242,7 @@ eslint@^8.0.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.2" + eslint-visitor-keys "^3.4.3" espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2"
<%= t ".to" %> <%= t ".subject" %> <%= t ".date" %>