package de.komoot.photon.query; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import spark.QueryParamsMap; import spark.Request; /** * Created by Sachin Dole on 2/12/2015. */ public class PhotonRequestFactoryTest { private PhotonRequest photonRequest; @Test public void testWithLocationBiasAndLimit() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); Mockito.when(mockRequest.queryParams("lon")).thenReturn("-87"); Mockito.when(mockRequest.queryParams("lat")).thenReturn("41"); Mockito.when(mockRequest.queryParams("limit")).thenReturn("5"); QueryParamsMap mockQueryParamsMap = Mockito.mock(QueryParamsMap.class); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockQueryParamsMap); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); photonRequest = photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", photonRequest.getQuery()); Assert.assertEquals(-87, photonRequest.getLocationForBias().getX(), 0); Assert.assertEquals(41, photonRequest.getLocationForBias().getY(), 0); Assert.assertEquals(new Integer(5), photonRequest.getLimit()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("lon"); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("lat"); } @Test public void testWithoutLocationBias() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); Mockito.when(mockRequest.queryParams("lon")).thenReturn(null); Mockito.when(mockRequest.queryParams("lat")).thenReturn(null); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); QueryParamsMap mockQueryParamsMap = Mockito.mock(QueryParamsMap.class); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockQueryParamsMap); photonRequest = photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", photonRequest.getQuery()); Assert.assertNull(photonRequest.getLocationForBias()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("lon"); Mockito.verify(mockRequest, Mockito.never()).queryParams("lat"); } @Test public void testWithBadBias() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); Mockito.when(mockRequest.queryParams("lon")).thenReturn("bad"); Mockito.when(mockRequest.queryParams("lat")).thenReturn("bad"); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); QueryParamsMap mockQueryParamsMap = Mockito.mock(QueryParamsMap.class); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockQueryParamsMap); photonRequest = photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", photonRequest.getQuery()); Assert.assertNull(photonRequest.getLocationForBias()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("lon"); Mockito.verify(mockRequest, Mockito.never()).queryParams("lat"); } @Test public void testWithBadLimit() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); Mockito.when(mockRequest.queryParams("limit")).thenReturn(null); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); QueryParamsMap mockQueryParamsMap = Mockito.mock(QueryParamsMap.class); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockQueryParamsMap); photonRequest = photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", photonRequest.getQuery()); Assert.assertEquals(new Integer(15), photonRequest.getLimit()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("limit"); } @Test public void testWithBadQuery() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn(null); try { PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); photonRequest = photonRequestFactory.create(mockRequest); Assert.fail(); } catch (BadRequestException e) { Assert.assertEquals("missing search term 'q': /?q=berlin", e.getMessage()); } Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); } @Test public void testWithIncludeKeyFilter() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); QueryParamsMap mockOsmTagQueryParm = Mockito.mock(QueryParamsMap.class); Mockito.when(mockOsmTagQueryParm.values()).thenReturn(new String[]{"aTag"}); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockOsmTagQueryParm); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); Mockito.when(mockOsmTagQueryParm.hasValue()).thenReturn(true); FilteredPhotonRequest filteredPhotonRequest = (FilteredPhotonRequest) photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", filteredPhotonRequest.getQuery()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryMap("osm_tag"); Mockito.verify(mockOsmTagQueryParm, Mockito.times(2)).values(); Assert.assertEquals(ImmutableSet.of("aTag"), filteredPhotonRequest.keys()); } @Test public void testWithIncludeTagFilter() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); QueryParamsMap mockOsmTagQueryParm = Mockito.mock(QueryParamsMap.class); Mockito.when(mockOsmTagQueryParm.values()).thenReturn(new String[]{"aTag:aValue"}); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockOsmTagQueryParm); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); Mockito.when(mockOsmTagQueryParm.hasValue()).thenReturn(true); FilteredPhotonRequest filteredPhotonRequest = (FilteredPhotonRequest) photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", filteredPhotonRequest.getQuery()); Mockito.verify(mockRequest, Mockito.times(1)).queryMap("osm_tag"); Mockito.verify(mockOsmTagQueryParm, Mockito.times(2)).values(); Assert.assertEquals(ImmutableMap.of("aTag", ImmutableSet.of("aValue")), filteredPhotonRequest.tags()); } @Test public void testWithIncludeValueFilter() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); QueryParamsMap mockOsmTagQueryParm = Mockito.mock(QueryParamsMap.class); Mockito.when(mockOsmTagQueryParm.values()).thenReturn(new String[]{":aValue"}); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockOsmTagQueryParm); Mockito.when(mockOsmTagQueryParm.hasValue()).thenReturn(true); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); FilteredPhotonRequest filteredPhotonRequest = photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", filteredPhotonRequest.getQuery()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryMap("osm_tag"); Mockito.verify(mockOsmTagQueryParm, Mockito.times(2)).values(); Assert.assertEquals(ImmutableSet.of("aValue"), filteredPhotonRequest.values()); } @Test public void testWithExcludeKeyFilter() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); QueryParamsMap mockOsmTagQueryParm = Mockito.mock(QueryParamsMap.class); Mockito.when(mockOsmTagQueryParm.values()).thenReturn(new String[]{"!aTag"}); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockOsmTagQueryParm); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); Mockito.when(mockOsmTagQueryParm.hasValue()).thenReturn(true); FilteredPhotonRequest filteredPhotonRequest = (FilteredPhotonRequest) photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", filteredPhotonRequest.getQuery()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryMap("osm_tag"); Mockito.verify(mockOsmTagQueryParm, Mockito.times(2)).values(); Assert.assertEquals(ImmutableSet.of("aTag"), filteredPhotonRequest.notKeys()); } @Test public void testWithExcludeTagFilter() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); QueryParamsMap mockOsmTagQueryParm = Mockito.mock(QueryParamsMap.class); Mockito.when(mockOsmTagQueryParm.values()).thenReturn(new String[]{"!aTag:aValue"}); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockOsmTagQueryParm); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); Mockito.when(mockOsmTagQueryParm.hasValue()).thenReturn(true); FilteredPhotonRequest filteredPhotonRequest = (FilteredPhotonRequest) photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", filteredPhotonRequest.getQuery()); Mockito.verify(mockRequest, Mockito.times(1)).queryMap("osm_tag"); Mockito.verify(mockOsmTagQueryParm, Mockito.times(2)).values(); Assert.assertEquals(ImmutableMap.of("aTag", ImmutableSet.of("aValue")), filteredPhotonRequest.notTags()); } @Test public void testWithExcludeValueFilter() throws Exception { Request mockRequest = Mockito.mock(Request.class); Mockito.when(mockRequest.queryParams("q")).thenReturn("berlin"); QueryParamsMap mockOsmTagQueryParm = Mockito.mock(QueryParamsMap.class); Mockito.when(mockOsmTagQueryParm.values()).thenReturn(new String[]{"!:aValue"}); Mockito.when(mockRequest.queryMap("osm_tag")).thenReturn(mockOsmTagQueryParm); PhotonRequestFactory photonRequestFactory = new PhotonRequestFactory(ImmutableSet.of("en")); Mockito.when(mockOsmTagQueryParm.hasValue()).thenReturn(true); FilteredPhotonRequest filteredPhotonRequest = (FilteredPhotonRequest) photonRequestFactory.create(mockRequest); Assert.assertEquals("berlin", filteredPhotonRequest.getQuery()); Mockito.verify(mockRequest, Mockito.times(1)).queryParams("q"); Mockito.verify(mockRequest, Mockito.times(1)).queryMap("osm_tag"); Mockito.verify(mockOsmTagQueryParm, Mockito.times(2)).values(); Assert.assertEquals(ImmutableSet.of("aValue"), filteredPhotonRequest.notValues()); } }