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

Last change on this file since 14219 was 14090, checked in by Don-vip, 6 years ago

see #16546 - fix unit test

File size: 9.8 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.OverpassOutpoutFormat;
23import org.openstreetmap.josm.testutils.JOSMTestRules;
24import org.openstreetmap.josm.tools.OverpassTurboQueryWizard;
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("http://localhost:" + wireMockRule.port() + NOMINATIM_URL_PATH);
58 }
59
60 private String getExpandedQuery(String search) {
61 final String query = OverpassTurboQueryWizard.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:25][bbox:2.0,1.0,4.0,3.0];\n" +
76 "(\n" +
77 " node[\"amenity\"=\"drinking_water\"];\n" +
78 " way[\"amenity\"=\"drinking_water\"];\n" +
79 " relation[\"amenity\"=\"drinking_water\"];\n" +
80 ");\n" +
81 "(._;>;);\n" +
82 "out meta;", query);
83 }
84
85 private void stubNominatim(String query) {
86 wireMockRule.stubFor(get(urlEqualTo(NOMINATIM_URL_PATH + query))
87 .willReturn(aResponse()
88 .withStatus(200)
89 .withHeader("Content-Type", "text/xml")
90 .withBodyFile("nominatim/" + query + ".xml")));
91 }
92
93 /**
94 * Tests evaluating the extended query feature {@code date}.
95 */
96 @Test
97 public void testDate() {
98 LocalDateTime from = LocalDateTime.of(2017, 7, 14, 2, 40);
99 assertEquals("2016-07-14T02:40:00Z", OverpassDownloadReader.date("1 year", from));
100 assertEquals("2007-07-14T02:40:00Z", OverpassDownloadReader.date("10years", from));
101 assertEquals("2017-06-14T02:40:00Z", OverpassDownloadReader.date("1 month", from));
102 assertEquals("2016-09-14T02:40:00Z", OverpassDownloadReader.date("10months", from));
103 assertEquals("2017-07-07T02:40:00Z", OverpassDownloadReader.date("1 week", from));
104 assertEquals("2017-05-05T02:40:00Z", OverpassDownloadReader.date("10weeks", from));
105 assertEquals("2017-07-13T02:40:00Z", OverpassDownloadReader.date("1 day", from));
106 assertEquals("2017-07-04T02:40:00Z", OverpassDownloadReader.date("10days", from));
107 assertEquals("2017-07-14T01:40:00Z", OverpassDownloadReader.date("1 hour", from));
108 assertEquals("2017-07-13T16:40:00Z", OverpassDownloadReader.date("10hours", from));
109 assertEquals("2017-07-14T02:39:00Z", OverpassDownloadReader.date("1 minute", from));
110 assertEquals("2017-07-14T02:30:00Z", OverpassDownloadReader.date("10minutes", from));
111 assertEquals("2017-07-14T02:39:59Z", OverpassDownloadReader.date("1 second", from));
112 assertEquals("2017-07-14T02:39:50Z", OverpassDownloadReader.date("10seconds", from));
113
114 assertEquals("2016-07-13T02:40:00Z", OverpassDownloadReader.date("1 year 1 day", from));
115 assertEquals("2016-07-14T02:38:20Z", OverpassDownloadReader.date("1 year 100 seconds", from));
116 assertEquals("2017-07-13T02:38:20Z", OverpassDownloadReader.date("1 day 100 seconds", from));
117 }
118
119 /**
120 * Tests evaluating the extended query feature {@code date} through {@code newer:} operator.
121 */
122 @Test
123 public void testDateNewer() {
124 final String query = getExpandedQuery("type:node and newer:3minutes");
125 String statement = query.substring(query.indexOf("node(newer:\"") + 12, query.lastIndexOf("\");"));
126 assertNotNull(DateUtils.fromString(statement));
127 }
128
129 /**
130 * Tests evaluating the extended query feature {@code geocodeArea}.
131 */
132 @Test
133 public void testGeocodeArea() {
134 stubNominatim("London");
135 final String query = getExpandedQuery("amenity=drinking_water in London");
136 assertEquals("" +
137 "[out:xml][timeout:25];\n" +
138 "area(3600065606)->.searchArea;\n" +
139 "(\n" +
140 " node[\"amenity\"=\"drinking_water\"](area.searchArea);\n" +
141 " way[\"amenity\"=\"drinking_water\"](area.searchArea);\n" +
142 " relation[\"amenity\"=\"drinking_water\"](area.searchArea);\n" +
143 ");\n" +
144 "(._;>;);\n" +
145 "out meta;", query);
146 }
147
148 /**
149 * Tests evaluating the extended query feature {@code geocodeArea}.
150 */
151 @Test
152 public void testGeocodeUnknownArea() {
153 stubNominatim("foo-bar-baz-does-not-exist");
154 final String query = OverpassDownloadReader.expandExtendedQueries("{{geocodeArea:foo-bar-baz-does-not-exist}}");
155 assertEquals("// Failed to evaluate {{geocodeArea:foo-bar-baz-does-not-exist}}\n", query);
156 }
157
158 /**
159 * Tests evaluating the overpass output format statements.
160 */
161 @Test
162 public void testOutputFormatStatement() {
163 for (OverpassOutpoutFormat oof : OverpassOutpoutFormat.values()) {
164 Matcher m = OverpassDownloadReader.OUTPUT_FORMAT_STATEMENT.matcher("[out:"+oof.getDirective()+"]");
165 assertTrue(m.matches());
166 assertEquals(oof.getDirective(), m.group(1));
167 }
168
169 assertTrue(OverpassDownloadReader.OUTPUT_FORMAT_STATEMENT.matcher(
170 "[out:pbf][timeout:25][bbox:{{bbox}}];\n" +
171 "(\n" +
172 " node[\"amenity\"=\"pharmacy\"];\n" +
173 " way[\"amenity\"=\"pharmacy\"];\n" +
174 " relation[\"amenity\"=\"pharmacy\"];\n" +
175 ");\n" +
176 "(._;>;);\n" +
177 "out meta;").matches());
178 }
179
180 /**
181 * Test {@link OverpassDownloadReader#fixQuery(String)}.
182 */
183 @Test
184 public void testFixQuery() {
185 assertNull(OverpassDownloadReader.fixQuery(null));
186
187 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out;"));
188 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out body;"));
189 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out skel;"));
190 assertEquals("out meta;", OverpassDownloadReader.fixQuery("out ids;"));
191
192 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out id;"));
193 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out body id;"));
194 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out skel id;"));
195 assertEquals("out meta id;", OverpassDownloadReader.fixQuery("out ids id;"));
196
197 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out qt;"));
198 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out body qt;"));
199 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out skel qt;"));
200 assertEquals("out meta qt;", OverpassDownloadReader.fixQuery("out ids qt;"));
201
202 assertEquals("[out:json]", OverpassDownloadReader.fixQuery("[out:json]"));
203 assertEquals("[out:xml]", OverpassDownloadReader.fixQuery("[out:csv(\n" +
204 " ::\"id\", amenity, name, operator, opening_hours, \"contact:website\", \"contact:phone\", brand, dispensing, lastcheck\n" +
205 " )]"));
206
207 assertEquals("[out:json][timeout:25];\n" +
208 "(\n" +
209 " node[\"historic\"=\"ringfort\"];\n" +
210 " way[\"historic\"=\"ringfort\"];\n" +
211 ");\n" +
212 "out meta;",
213 OverpassDownloadReader.fixQuery("[out:json][timeout:25];\n" +
214 "(\n" +
215 " node[\"historic\"=\"ringfort\"];\n" +
216 " way[\"historic\"=\"ringfort\"];\n" +
217 ");\n" +
218 "out body;"));
219 }
220
221 /**
222 * Unit test of {@link OverpassDownloadReader#searchName(java.util.List)}
223 * @throws Exception if an error occurs
224 */
225 @Test
226 public void testSearchName() throws Exception {
227 try (StringReader reader = new StringReader(NameFinderTest.SAMPLE)) {
228 assertEquals(1942586L,
229 OverpassDownloadReader.searchName(NameFinder.parseSearchResults(reader)).getOsmId().getUniqueId());
230 }
231 }
232}
Note: See TracBrowser for help on using the repository browser.