source: josm/trunk/test/unit/org/openstreetmap/josm/io/OverpassDownloadReaderTest.java

Last change on this file was 18106, checked in by Don-vip, 3 years ago

fix #21150 - Add JUnit5 annotation for WireMockServer (patch by taylor.smock)

File size: 9.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
5import static com.github.tomakehurst.wiremock.client.WireMock.get;
6import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
7import static org.junit.jupiter.api.Assertions.assertEquals;
8import static org.junit.jupiter.api.Assertions.assertNotNull;
9import static org.junit.jupiter.api.Assertions.assertNull;
10import static org.junit.jupiter.api.Assertions.assertTrue;
11
12import java.io.StringReader;
13import java.time.LocalDateTime;
14import java.util.regex.Matcher;
15
16import org.junit.jupiter.api.BeforeEach;
17import org.junit.jupiter.api.Test;
18import org.openstreetmap.josm.data.Bounds;
19import org.openstreetmap.josm.io.OverpassDownloadReader.OverpassOutputFormat;
20import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
21import org.openstreetmap.josm.testutils.annotations.BasicWiremock;
22import org.openstreetmap.josm.testutils.annotations.HTTP;
23import org.openstreetmap.josm.tools.SearchCompilerQueryWizard;
24import org.openstreetmap.josm.tools.Utils;
25import org.openstreetmap.josm.tools.date.DateUtils;
26
27import com.github.tomakehurst.wiremock.WireMockServer;
28
29/**
30 * Unit tests of {@link OverpassDownloadReader} class.
31 */
32@BasicWiremock
33@BasicPreferences
34@HTTP
35class OverpassDownloadReaderTest {
36 /**
37 * HTTP mock.
38 */
39 @BasicWiremock
40 WireMockServer wireMockServer;
41
42 private static final String NOMINATIM_URL_PATH = "/search?format=xml&q=";
43
44 /**
45 * Setup test.
46 */
47 @BeforeEach
48 public void setUp() {
49 NameFinder.NOMINATIM_URL_PROP.put(wireMockServer.url(NOMINATIM_URL_PATH));
50 }
51
52 private String getExpandedQuery(String search) {
53 final String query = SearchCompilerQueryWizard.constructQuery(search);
54 final String request = new OverpassDownloadReader(new Bounds(1, 2, 3, 4), null, query)
55 .getRequestForBbox(1, 2, 3, 4)
56 .substring("interpreter?data=".length());
57 return Utils.decodeUrl(request);
58 }
59
60 /**
61 * Tests evaluating the extended query feature {@code bbox}.
62 */
63 @Test
64 void testBbox() {
65 final String query = getExpandedQuery("amenity=drinking_water");
66 assertEquals("" +
67 "[out:xml][timeout:90][bbox:2.0,1.0,4.0,3.0];\n" +
68 "(\n" +
69 " nwr[\"amenity\"=\"drinking_water\"];\n" +
70 ");\n" +
71 "(._;>;);\n" +
72 "out meta;", query);
73 }
74
75 private void stubNominatim(String query) {
76 wireMockServer.stubFor(get(urlEqualTo(NOMINATIM_URL_PATH + query))
77 .willReturn(aResponse()
78 .withStatus(200)
79 .withHeader("Content-Type", "text/xml")
80 .withBodyFile("nominatim/" + query + ".xml")));
81 }
82
83 /**
84 * Tests evaluating the extended query feature {@code date}.
85 */
86 @Test
87 void testDate() {
88 LocalDateTime from = LocalDateTime.of(2017, 7, 14, 2, 40);
89 assertEquals("2016-07-14T02:40:00Z", OverpassDownloadReader.date("1 year", from));
90 assertEquals("2007-07-14T02:40:00Z", OverpassDownloadReader.date("10years", from));
91 assertEquals("2017-06-14T02:40:00Z", OverpassDownloadReader.date("1 month", from));
92 assertEquals("2016-09-14T02:40:00Z", OverpassDownloadReader.date("10months", from));
93 assertEquals("2017-07-07T02:40:00Z", OverpassDownloadReader.date("1 week", from));
94 assertEquals("2017-05-05T02:40:00Z", OverpassDownloadReader.date("10weeks", from));
95 assertEquals("2017-07-13T02:40:00Z", OverpassDownloadReader.date("1 day", from));
96 assertEquals("2017-07-04T02:40:00Z", OverpassDownloadReader.date("10days", from));
97 assertEquals("2017-07-14T01:40:00Z", OverpassDownloadReader.date("1 hour", from));
98 assertEquals("2017-07-13T16:40:00Z", OverpassDownloadReader.date("10hours", from));
99 assertEquals("2017-07-14T02:39:00Z", OverpassDownloadReader.date("1 minute", from));
100 assertEquals("2017-07-14T02:30:00Z", OverpassDownloadReader.date("10minutes", from));
101 assertEquals("2017-07-14T02:39:59Z", OverpassDownloadReader.date("1 second", from));
102 assertEquals("2017-07-14T02:39:50Z", OverpassDownloadReader.date("10seconds", from));
103
104 assertEquals("2016-07-13T02:40:00Z", OverpassDownloadReader.date("1 year 1 day", from));
105 assertEquals("2016-07-14T02:38:20Z", OverpassDownloadReader.date("1 year 100 seconds", from));
106 assertEquals("2017-07-13T02:38:20Z", OverpassDownloadReader.date("1 day 100 seconds", from));
107 }
108
109 /**
110 * Tests evaluating the extended query feature {@code date} through {@code newer:} operator.
111 */
112 @Test
113 void testDateNewer() {
114 String query = getExpandedQuery("type:node and newer:3minutes");
115 String statement = query.substring(query.indexOf("node(newer:\"") + 12, query.lastIndexOf("\");"));
116 assertNotNull(DateUtils.fromString(statement));
117
118 query = getExpandedQuery("type:node and newer:\"2021-05-30T20:00:00Z\"");
119 statement = query.substring(query.indexOf("node(newer:\"") + 12, query.lastIndexOf("\");"));
120 assertNotNull(DateUtils.fromString(statement));
121 }
122
123 /**
124 * Tests evaluating the extended query feature {@code geocodeArea}.
125 */
126 @Test
127 void testGeocodeArea() {
128 stubNominatim("London");
129 final String query = getExpandedQuery("amenity=drinking_water in London");
130 assertEquals("" +
131 "[out:xml][timeout:90];\n" +
132 "area(3600065606)->.searchArea;\n" +
133 "(\n" +
134 " nwr[\"amenity\"=\"drinking_water\"](area.searchArea);\n" +
135 ");\n" +
136 "(._;>;);\n" +
137 "out meta;", query);
138 }
139
140 /**
141 * Tests evaluating the extended query feature {@code geocodeArea}.
142 */
143 @Test
144 void testGeocodeUnknownArea() {
145 stubNominatim("foo-bar-baz-does-not-exist");
146 final String query = OverpassDownloadReader.expandExtendedQueries("{{geocodeArea:foo-bar-baz-does-not-exist}}");
147 assertEquals("// Failed to evaluate {{geocodeArea:foo-bar-baz-does-not-exist}}\n", query);
148 }
149
150 /**
151 * Tests evaluating the overpass output format statements.
152 */
153 @Test
154 void testOutputFormatStatement() {
155 for (OverpassOutputFormat oof : OverpassOutputFormat.values()) {
156 Matcher m = OverpassDownloadReader.OUTPUT_FORMAT_STATEMENT.matcher("[out:"+oof.getDirective()+"]");
157 assertTrue(m.matches());
158 assertEquals(oof.getDirective(), m.group(1));
159 }
160
161 assertTrue(OverpassDownloadReader.OUTPUT_FORMAT_STATEMENT.matcher(
162 "[out:pbf][timeout:90][bbox:{{bbox}}];\n" +
163 "(\n" +
164 " node[\"amenity\"=\"pharmacy\"];\n" +
165 " way[\"amenity\"=\"pharmacy\"];\n" +
166 " relation[\"amenity\"=\"pharmacy\"];\n" +
167 ");\n" +
168 "(._;>;);\n" +
169 "out meta;").matches());
170 }
171
172 /**
173 * Test {@link OverpassDownloadReader#fixQuery(String)}.
174 */
175 @Test
176 void testFixQuery() {
177 assertNull(OverpassDownloadReader.fixQuery(null));
178
179 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out;"));
180 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out body;"));
181 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out skel;"));
182 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out ids;"));
183
184 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out id;"));
185 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out body id;"));
186 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out skel id;"));
187 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out ids id;"));
188
189 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out qt;"));
190 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out body qt;"));
191 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out skel qt;"));
192 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out ids qt;"));
193
194 assertEquals("[out:json]", OverpassDownloadReader.fixQuery("[out:json]"));
195 assertEquals("[out:xml]", OverpassDownloadReader.fixQuery("[out:csv(\n" +
196 " ::\"id\", amenity, name, operator, opening_hours, \"contact:website\", \"contact:phone\", brand, dispensing, lastcheck\n" +
197 " )]"));
198
199 assertEquals("[out:json][timeout:90];\n" +
200 "(\n" +
201 " node[\"historic\"=\"ringfort\"];\n" +
202 " way[\"historic\"=\"ringfort\"];\n" +
203 ");\n" +
204 "out meta;",
205 OverpassDownloadReader.fixQuery("[out:json][timeout:90];\n" +
206 "(\n" +
207 " node[\"historic\"=\"ringfort\"];\n" +
208 " way[\"historic\"=\"ringfort\"];\n" +
209 ");\n" +
210 "out body;"));
211 }
212
213 /**
214 * Unit test of {@link OverpassDownloadReader#searchName(java.util.List)}
215 * @throws Exception if an error occurs
216 */
217 @Test
218 void testSearchName() throws Exception {
219 try (StringReader reader = new StringReader(NameFinderTest.SAMPLE)) {
220 assertEquals(1942586L,
221 OverpassDownloadReader.searchName(NameFinder.parseSearchResults(reader)).getOsmId().getUniqueId());
222 }
223 }
224}
Note: See TracBrowser for help on using the repository browser.