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

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

see #20129 - Fix typos and misspellings in the code (patch by gaben)

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