]> git.openstreetmap.org Git - rails.git/blob - test/system/query_features_test.rb
Merge pull request #6394 from openstreetmap/dependabot/github_actions/ruby/setup...
[rails.git] / test / system / query_features_test.rb
1 # frozen_string_literal: true
2
3 require "application_system_test_case"
4
5 class QueryFeaturesSystemTest < ApplicationSystemTestCase
6   test "sorts enclosing features correctly" do
7     visit "/#map=15/54.18315/7.88473"
8
9     within "#map" do
10       click_on "Query features"
11
12       stub_overpass :enclosing_elements => [
13         {
14           "type" => "relation",
15           "id" => 51477,
16           "bounds" => {
17             "minlat" => 47.2701114,
18             "minlon" => 5.8663153,
19             "maxlat" => 55.0991610,
20             "maxlon" => 15.0419309
21           },
22           "tags" => {
23             "admin_level" => "2",
24             "border_type" => "country",
25             "boundary" => "administrative",
26             "name" => "Deutschland",
27             "name:de" => "Deutschland",
28             "name:en" => "Germany",
29             "type" => "boundary"
30           }
31         },
32         {
33           "type" => "relation",
34           "id" => 51529,
35           "bounds" => {
36             "minlat" => 53.3598160,
37             "minlon" => 7.5211615,
38             "maxlat" => 55.0991610,
39             "maxlon" => 11.6723860
40           },
41           "tags" => {
42             "admin_level" => "4",
43             "border_type" => "state",
44             "boundary" => "administrative",
45             "name" => "Schleswig-Holstein",
46             "name:de" => "Schleswig-Holstein",
47             "name:en" => "Schleswig-Holstein",
48             "type" => "boundary"
49           }
50         },
51         {
52           "type" => "relation",
53           "id" => 3787052,
54           "bounds" => {
55             "minlat" => 54.1693099,
56             "minlon" => 7.8648436,
57             "maxlat" => 54.1907839,
58             "maxlon" => 7.9001626
59           },
60           "tags" => {
61             "name" => "Helgoland",
62             "name:de" => "Helgoland",
63             "name:en" => "Heligoland",
64             "place" => "island"
65           }
66         }
67       ]
68
69       click
70     end
71
72     within_sidebar do
73       assert_link "Heligoland"
74       assert_link "Schleswig-Holstein", :below => find_link("Heligoland")
75       assert_link "Germany", :below => find_link("Schleswig-Holstein")
76     end
77   end
78
79   test "sorts enclosing features correctly across antimeridian" do
80     visit "/#map=15/60/30"
81
82     within "#map" do
83       click_on "Query features"
84
85       stub_overpass :enclosing_elements => [
86         {
87           "type" => "relation",
88           "id" => 60189,
89           "bounds" => {
90             "minlat" => 41.1850968,
91             "minlon" => 19.4041722,
92             "maxlat" => 82.0586232,
93             "maxlon" => -168.9769440
94           },
95           "tags" => {
96             "admin_level" => "2",
97             "border_type" => "nation",
98             "boundary" => "administrative",
99             "name" => "Россия",
100             "name:en" => "Russia",
101             "name:ru" => "Россия",
102             "type" => "boundary"
103           }
104         },
105         {
106           "type" => "relation",
107           "id" => 1114253,
108           "bounds" => {
109             "minlat" => 59.8587853,
110             "minlon" => 29.6720697,
111             "maxlat" => 60.0370554,
112             "maxlon" => 30.2307057
113           },
114           "tags" => {
115             "name" => "Невская губа",
116             "name:en" => "Neva Bay",
117             "name:ru" => "Невская губа",
118             "natural" => "bay",
119             "type" => "multipolygon"
120           }
121         }
122       ]
123
124       click
125     end
126
127     within_sidebar do
128       assert_link "Neva Bay"
129       assert_link "Russia", :below => find_link("Neva Bay")
130     end
131   end
132
133   test "sorts enclosing features correctly with multiple bboxes across antimeridian" do
134     visit "/#map=15/-16.155/179.995"
135
136     within "#map" do
137       click_on "Query features"
138
139       stub_overpass :enclosing_elements => [
140         {
141           "type" => "relation",
142           "id" => 571747,
143           "bounds" => {
144             "minlat" => -21.9434274,
145             "minlon" => 174.4214965,
146             "maxlat" => -12.2613866,
147             "maxlon" => -178.0034928
148           },
149           "tags" => {
150             "admin_level" => "2",
151             "boundary" => "administrative",
152             "name" => "Viti",
153             "name:en" => "Fiji",
154             "name:fj" => "Viti",
155             "type" => "boundary"
156           }
157         },
158         {
159           "type" => "relation",
160           "id" => 2325025,
161           "bounds" => {
162             "minlat" => -17.0160140,
163             "minlon" => 178.4754914,
164             "maxlat" => -16.1243512,
165             "maxlon" => -179.6630100
166           },
167           "tags" => {
168             "name" => "Vanua Levu Group",
169             "place" => "archipelago",
170             "type" => "multipolygon",
171             "wikidata" => "Q2756586"
172           }
173         },
174         {
175           "type" => "relation",
176           "id" => 4097003,
177           "bounds" => {
178             "minlat" => -17.0160140,
179             "minlon" => 178.4754914,
180             "maxlat" => -16.1243512,
181             "maxlon" => -179.9513876
182           },
183           "tags" => {
184             "name" => "Vanua Levu",
185             "place" => "island",
186             "type" => "multipolygon",
187             "wikidata" => "Q327733"
188           }
189         }
190       ]
191
192       click
193     end
194
195     within_sidebar do
196       assert_link "Vanua Levu"
197       assert_link "Vanua Levu Group", :below => find_link("Vanua Levu")
198       assert_link "Fiji", :below => find_link("Vanua Levu Group")
199     end
200   end
201
202   private
203
204   def stub_overpass(nearby_elements: [], enclosing_elements: [])
205     execute_script <<~SCRIPT
206       {
207         const originalFetch = fetch;
208         window.fetch = (...args) => {
209           const [resource, options] = args;
210
211           if (resource != OSM.OVERPASS_URL) return originalFetch(...args);
212
213           const data = options.body.get("data"),
214                 elements = data.includes("is_in") ? #{enclosing_elements.to_json} : #{nearby_elements.to_json};
215
216           return Promise.resolve({
217             json: () => Promise.resolve({ elements })
218           });
219         }
220       }
221     SCRIPT
222   end
223 end