package com.visenze.visearch; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.visenze.visearch.internal.SearchOperations; import com.visenze.visearch.internal.SearchOperationsImpl; import com.visenze.visearch.internal.http.ViSearchHttpClient; import com.visenze.visearch.internal.http.ViSearchHttpResponse; import com.visenze.visearch.internal.json.ViSearchModule; import junit.framework.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Matchers; import java.io.File; import java.io.InputStream; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.*; public class ViSearchSearchOperationsTest { private ViSearchHttpClient mockClient; private ObjectMapper objectMapper; @Rule public ExpectedException expectedException = ExpectedException.none(); @Before public void beforeTest() { mockClient = mock(ViSearchHttpClient.class); objectMapper = new ObjectMapper().registerModule(new ViSearchModule()); } @Test public void testSearchParamsBasic() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_1\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); Map<String, String> responseHeaders = Maps.newHashMap(); responseHeaders.put("test-param", "123"); when(response.getHeaders()).thenReturn(responseHeaders); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedSearchResult = searchOperations.search(searchParams); assertEquals(responseHeaders, pagedSearchResult.getHeaders()); assertEquals("test_im", searchParams.getImName()); assertEquals(null, pagedSearchResult.getErrorMessage()); assertEquals(null, pagedSearchResult.getCause()); assertEquals(null, pagedSearchResult.getRawResponseMessage()); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("im_name", "test_im"); verify(mockClient).get("/search", expectedParams); } @Test public void testSearchParamsFacet() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_1\"}],\"facets\":[{\"key\":\"brand\",\"items\":[{\"value\":\"brandA\",\"count\":5},{\"value\":\"brandB\",\"count\":6},{\"value\":\"brandC\",\"count\":9}]}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im") .setFacets(Lists.newArrayList("brand")) .setFacetsLimit(10) .setFacetsShowCount(true); searchOperations.search(searchParams); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("im_name", "test_im"); expectedParams.put("facets", "brand"); expectedParams.put("facets_limit", "10"); expectedParams.put("facets_show_count", "true"); verify(mockClient).get("/search", expectedParams); } @Test public void testSearchParamsFull() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":10,\"limit\":1,\"total\":20,\"result\":[{\"im_name\":\"test_im_1\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); Map<String, String> fq = Maps.newHashMap(); fq.put("field_a", "value_a"); fq.put("field_b", "value_b"); Map<String, String> custom = Maps.newHashMap(); custom.put("custom_key", "custom_value"); SearchParams searchParams = new SearchParams("test_im") .setPage(10) .setLimit(1) .setScore(true) .setScoreMin(0.1f) .setScoreMax(0.75f) .setFq(fq) .setFl(Lists.newArrayList("field_x", "field_y")) .setGetAllFl(true) .setQInfo(true) .setCustom(custom); searchOperations.search(searchParams); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("im_name", "test_im"); expectedParams.put("page", "10"); expectedParams.put("limit", "1"); expectedParams.put("score", "true"); expectedParams.put("score_min", "0.1"); expectedParams.put("score_max", "0.75"); expectedParams.put("fq", "field_a:value_a"); expectedParams.put("fq", "field_b:value_b"); expectedParams.put("fl", "field_x"); expectedParams.put("fl", "field_y"); expectedParams.put("get_all_fl", "true"); expectedParams.put("qinfo", "true"); expectedParams.put("custom_key", "custom_value"); verify(mockClient).get("/search", expectedParams); } @Test public void testSearchResponseBasic() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_0\"},{\"im_name\":\"test_im_1\"},{\"im_name\":\"test_im_2\"},{\"im_name\":\"test_im_3\"},{\"im_name\":\"test_im_4\"},{\"im_name\":\"test_im_5\"},{\"im_name\":\"test_im_6\"},{\"im_name\":\"test_im_7\"},{\"im_name\":\"test_im_8\"},{\"im_name\":\"test_im_9\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(new Integer(1), pagedResult.getPage()); assertEquals(new Integer(10), pagedResult.getLimit()); assertEquals(new Integer(20), pagedResult.getTotal()); List<ImageResult> results = pagedResult.getResult(); assertEquals(10, results.size()); for (int i = 0; i < 10; i++) { ImageResult image = results.get(i); assertEquals("test_im_" + i, image.getImName()); } } @Test public void testSearchResponseFacet() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":1,\"total\":20,\"result\":[{\"im_name\":\"test_im_0\"}],\"facets\":[{\"key\":\"brand\",\"items\":[{\"value\":\"brandA\",\"count\":5},{\"value\":\"brandB\",\"count\":6},{\"value\":\"brandC\",\"count\":9}]}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im") .setFacets(Lists.newArrayList("brand")); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(new Integer(1), pagedResult.getPage()); assertEquals(new Integer(1), pagedResult.getLimit()); assertEquals(new Integer(20), pagedResult.getTotal()); List<ImageResult> results = pagedResult.getResult(); assertEquals(1, results.size()); List<Facet> facetList = pagedResult.getFacets(); assertEquals(1, facetList.size()); Facet facet = facetList.get(0); assertEquals("brand", facet.getKey()); List<FacetItem> facetItemList = facet.getFacetItems(); assertEquals(3, facetItemList.size()); FacetItem facetItem0 = facetItemList.get(0); assertEquals("brandA", facetItem0.getValue()); assertEquals(new Integer(5), facetItem0.getCount()); FacetItem facetItem1 = facetItemList.get(1); assertEquals("brandB", facetItem1.getValue()); assertEquals(new Integer(6), facetItem1.getCount()); FacetItem facetItem2 = facetItemList.get(2); assertEquals("brandC", facetItem2.getValue()); assertEquals(new Integer(9), facetItem2.getCount()); } @Test public void testSearchResponseFull() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":10,\"limit\":1,\"total\":20,\"qinfo\":{\"im_url\":\"http://www.example.com/test_im.jpeg\",\"price\":\"49.99\",\"title\":\"java sdk\"},\"result\":[{\"im_name\":\"test_im_0\",\"score\":0.43719249963760376,\"value_map\":{\"price\":\"67.500000\",\"title\":\"sdk test\"}}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(responseBody, pagedResult.getRawJson()); assertEquals(new Integer(10), pagedResult.getPage()); assertEquals(new Integer(1), pagedResult.getLimit()); assertEquals(new Integer(20), pagedResult.getTotal()); Map<String, String> qinfo = Maps.newHashMap(); qinfo.put("im_url", "http://www.example.com/test_im.jpeg"); qinfo.put("price", "49.99"); qinfo.put("title", "java sdk"); assertEquals(qinfo, pagedResult.getQueryInfo()); List<ImageResult> results = pagedResult.getResult(); ImageResult image = results.get(0); assertEquals("test_im_0", image.getImName()); assertEquals(new Float(0.43719249963760376), image.getScore()); Map<String, String> metadata = Maps.newHashMap(); metadata.put("price", "67.500000"); metadata.put("title", "sdk test"); assertEquals(metadata, image.getMetadata()); } @Test public void testSearchResponseError() { String responseBody = "{\"status\":\"fail\",\"method\":\"search\",\"error\":[\"Error message.\"],\"page\":1,\"limit\":10,\"total\":0}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals("Error message.", pagedResult.getErrorMessage()); assertEquals(null, pagedResult.getCause()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseUnknownError() { String responseBody = "{\"status\":\"fail\",\"method\":\"search\",\"page\":1,\"limit\":10,\"total\":0}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(ResponseMessages.INVALID_RESPONSE_FORMAT.getMessage(), pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseErrorGetJson() { String responseBody = "{\"status\":\"fail\",\"method\":\"search\",\"error\":[\"Error message.\"],\"page\":1,\"limit\":10,\"total\":0}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals("Error message.", pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseMalformed0() { String responseBody = "{\"status\":\"OK\" \"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_0\"},{\"im_name\":\"test_im_1\"},{\"im_name\":\"test_im_2\"},{\"im_name\":\"test_im_3\"},{\"im_name\":\"test_im_4\"},{\"im_name\":\"test_im_5\"},{\"im_name\":\"test_im_6\"},{\"im_name\":\"test_im_7\"},{\"im_name\":\"test_im_8\"},{\"im_name\":\"test_im_9\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(ResponseMessages.PARSE_RESPONSE_ERROR.getMessage(), pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseMalformed1() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":{}}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(ResponseMessages.PARSE_RESPONSE_ERROR.getMessage(), pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseMalformed2() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"total\":20,\"result\":[]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(ResponseMessages.INVALID_RESPONSE_FORMAT.getMessage(), pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseMalformed3() throws Exception { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":10,\"limit\":1,\"total\":20,\"qinfo\":[\"im_url\",\"price\",\"title\"],\"result\":[]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(ResponseMessages.PARSE_RESPONSE_ERROR.getMessage(), pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testSearchResponseMalformed4() { String responseBody = "{\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":0,\"result\":[]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); SearchParams searchParams = new SearchParams("test_im"); PagedSearchResult pagedResult = searchOperations.search(searchParams); assertEquals(ResponseMessages.INVALID_RESPONSE_FORMAT.getMessage(), pagedResult.getErrorMessage()); assertEquals(responseBody, pagedResult.getRawResponseMessage()); } @Test public void testColorSearchParams() { String responseBody = "{\"status\":\"OK\",\"method\":\"colorsearch\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_1\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); ColorSearchParams colorSearchParams = new ColorSearchParams("123ABC"); assertEquals("123ABC", colorSearchParams.getColor()); searchOperations.colorSearch(colorSearchParams); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("color", "123ABC"); verify(mockClient).get("/colorsearch", expectedParams); } @Test public void testColorSearchJsonFormatError() { String responseBody = "{\"status\":\"OK\" \"method\":\"colorsearch\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_1\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.get(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); ColorSearchParams colorSearchParams = new ColorSearchParams("123ABC"); assertEquals("123ABC", colorSearchParams.getColor()); PagedSearchResult searchResult = searchOperations.colorSearch(colorSearchParams); assertEquals(ResponseMessages.PARSE_RESPONSE_ERROR.getMessage(), searchResult.getErrorMessage()); assertEquals(responseBody, searchResult.getRawResponseMessage()); } @Test public void testColorSearchParamsInvalid() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Invalid color. " + "It should be a six hexadecimal number color code e.g. 123ACF."); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); ColorSearchParams colorSearchParams = new ColorSearchParams("#123ABC"); } @Test public void testUploadSearchParamsURL() { String responseBody = "{\"status\":\"OK\",\"method\":\"upload\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_1\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.post(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); UploadSearchParams uploadSearchParams = new UploadSearchParams("http://www.example.com/test_im.jpeg"); assertEquals("http://www.example.com/test_im.jpeg", uploadSearchParams.getImageUrl()); searchOperations.uploadSearch(uploadSearchParams); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("im_url", "http://www.example.com/test_im.jpeg"); verify(mockClient).post("/uploadsearch", expectedParams); } @Test public void testUploadSearchParamsURLWithDetection() { String responseBody = "{\"status\":\"OK\",\"method\":\"uploadsearch\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"product_types\":[{\"type\":\"top\",\"score\":1,\"box\":[84,223,425,639]},{\"type\":\"shoe\",\"score\":0.24432674050331116,\"box\":[522,77,865,337]},{\"type\":\"bag\",\"score\":0.2392924576997757,\"box\":[538,437,684,694]}],\"product_types_list\":[{\"type\":\"bag\"},{\"type\":\"bottom\"},{\"type\":\"dress\"},{\"type\":\"shoe\"},{\"type\":\"top\"},{\"type\":\"other\"}],\"result\":[],\"im_id\":\"abc.png\"}\n"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.post(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); UploadSearchParams uploadSearchParams = new UploadSearchParams("http://www.example.com/test_im.jpeg"); uploadSearchParams.setDetection("dress"); assertEquals("http://www.example.com/test_im.jpeg", uploadSearchParams.getImageUrl()); PagedSearchResult uploadSearchResult = searchOperations.uploadSearch(uploadSearchParams); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("im_url", "http://www.example.com/test_im.jpeg"); expectedParams.put("detection", "dress"); verify(mockClient).post("/uploadsearch", expectedParams); assertEquals(3, uploadSearchResult.getProductTypes().size()); assertEquals(6, uploadSearchResult.getProductTypesList().size()); for (ProductType productType : uploadSearchResult.getProductTypes()) { assertNotNull(productType.getType()); assertNotNull(productType.getScore()); assertNotNull(productType.getBox()); assertEquals(4, productType.getBox().size()); } for (ProductType productType : uploadSearchResult.getProductTypesList()) { assertNotNull(productType.getType()); assertNull(productType.getScore()); assertNull(productType.getBox()); } assertEquals("abc.png", uploadSearchResult.getImId()); } @Test public void testUploadSearchParamsNullFile() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("The image file must not be null"); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); File nullFile = null; UploadSearchParams uploadSearchParams = new UploadSearchParams(nullFile); searchOperations.uploadSearch(uploadSearchParams); } @Test public void testUploadSearchParamsNonFile() { SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); File nonFile = new File("nonFile"); UploadSearchParams uploadSearchParams = new UploadSearchParams(nonFile); PagedSearchResult response = searchOperations.uploadSearch(uploadSearchParams); assertEquals(ResponseMessages.INVALID_IMAGE_OR_URL.getMessage(), response.getErrorMessage()); } @Test public void testUploadSearchParamsNullStream() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("The image input stream must not be null"); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); InputStream inputStream = null; UploadSearchParams uploadSearchParams = new UploadSearchParams(inputStream); searchOperations.uploadSearch(uploadSearchParams); } @Test public void testSimilarProductsSearchParamsURL() { String responseBody = "{\"status\":\"OK\",\"method\":\"similarproducts\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"qinfo\":{\"im_url\":\"http://www.example.com/test_im.jpeg\",\"price\":\"49.99\",\"title\":\"java sdk\"},\"product_types\":[{\"type\":\"top\",\"score\":1,\"box\":[84,223,425,639]},{\"type\":\"shoe\",\"score\":0.24432674050331116,\"box\":[522,77,865,337]},{\"type\":\"bag\",\"score\":0.2392924576997757,\"box\":[538,437,684,694]}],\"product_types_list\":[{\"type\":\"bag\"},{\"type\":\"bottom\"},{\"type\":\"dress\"},{\"type\":\"shoe\"},{\"type\":\"top\"},{\"type\":\"other\"}],\"group_result\":[[{\"im_name\":\"test_im_0\",\"score\":0.43719249963760376,\"value_map\":{\"price\":\"67.500000\",\"title\":\"sdk test\"}}]],\"im_id\":\"abc.png\"}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.post(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); UploadSearchParams uploadSearchParams = new UploadSearchParams("http://www.example.com/test_im.jpeg"); assertEquals("http://www.example.com/test_im.jpeg", uploadSearchParams.getImageUrl()); PagedSearchGroupResult uploadSearchResult = searchOperations.similarProductsSearch(uploadSearchParams); Multimap<String, String> expectedParams = HashMultimap.create(); expectedParams.put("im_url", "http://www.example.com/test_im.jpeg"); expectedParams.put("detection", "all"); verify(mockClient).post("/similarproducts", expectedParams); assertEquals(3, uploadSearchResult.getProductTypes().size()); assertEquals(6, uploadSearchResult.getProductTypesList().size()); for (ProductType productType : uploadSearchResult.getProductTypes()) { assertNotNull(productType.getType()); assertNotNull(productType.getScore()); assertNotNull(productType.getBox()); assertEquals(4, productType.getBox().size()); } for (ProductType productType : uploadSearchResult.getProductTypesList()) { assertNotNull(productType.getType()); assertNull(productType.getScore()); assertNull(productType.getBox()); } assertEquals(responseBody, uploadSearchResult.getRawJson()); assertEquals(new Integer(1), uploadSearchResult.getPage()); assertEquals(new Integer(10), uploadSearchResult.getLimit()); assertEquals(new Integer(20), uploadSearchResult.getTotal()); List<GroupImageResult> results = uploadSearchResult.getResult(); assertEquals(1, results.size()); Map<String, String> qinfo = Maps.newHashMap(); qinfo.put("im_url", "http://www.example.com/test_im.jpeg"); qinfo.put("price", "49.99"); qinfo.put("title", "java sdk"); assertEquals(qinfo, uploadSearchResult.getQueryInfo()); assertEquals("abc.png", uploadSearchResult.getImId()); ImageResult image = results.get(0).getImageResultList().get(0); assertEquals("test_im_0", image.getImName()); assertEquals(new Float(0.43719249963760376), image.getScore()); Map<String, String> metadata = Maps.newHashMap(); metadata.put("price", "67.500000"); metadata.put("title", "sdk test"); assertEquals(metadata, image.getMetadata()); } @Test public void testSimilarProductsSearchParamsNullFile() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("The image file must not be null"); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); File nullFile = null; UploadSearchParams uploadSearchParams = new UploadSearchParams(nullFile); searchOperations.similarProductsSearch(uploadSearchParams); } @Test public void testSimilarProductsSearchParamsNonFile() { SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); File nonFile = new File("nonFile"); UploadSearchParams uploadSearchParams = new UploadSearchParams(nonFile); PagedSearchGroupResult response = searchOperations.similarProductsSearch(uploadSearchParams); assertEquals(ResponseMessages.INVALID_IMAGE_OR_URL.getMessage(), response.getErrorMessage()); } @Test public void testSimilarProductsSearchParamsNullStream() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("The image input stream must not be null"); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); InputStream inputStream = null; UploadSearchParams uploadSearchParams = new UploadSearchParams(inputStream); searchOperations.similarProductsSearch(uploadSearchParams); } // should not throw anything @Test public void testUploadSearchParamsImId() { String responseBody = "{\"status\":\"OK\",\"method\":\"search\",\"error\":[],\"page\":1,\"limit\":10,\"total\":20,\"result\":[{\"im_name\":\"test_im_0\"},{\"im_name\":\"test_im_1\"},{\"im_name\":\"test_im_2\"},{\"im_name\":\"test_im_3\"},{\"im_name\":\"test_im_4\"},{\"im_name\":\"test_im_5\"},{\"im_name\":\"test_im_6\"},{\"im_name\":\"test_im_7\"},{\"im_name\":\"test_im_8\"},{\"im_name\":\"test_im_9\"}]}"; ViSearchHttpResponse response = mock(ViSearchHttpResponse.class); when(response.getBody()).thenReturn(responseBody); when(mockClient.post(anyString(), Matchers.<Multimap<String, String>>any())).thenReturn(response); SearchOperations searchOperations = new SearchOperationsImpl(mockClient, objectMapper); UploadSearchParams uploadSearchParams = new UploadSearchParams(); uploadSearchParams.setImId("abc"); PagedSearchResult sr = searchOperations.uploadSearch(uploadSearchParams); assertEquals(null, sr.getErrorMessage()); } }