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

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

see #15800 - fix mistake in unit test

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