package org.molgenis.data.elasticsearch.request; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.search.sort.FieldSortBuilder; import org.mockito.ArgumentCaptor; import org.molgenis.data.Entity; import org.molgenis.data.Query; import org.molgenis.data.Sort; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.support.QueryImpl; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.List; import static org.mockito.Mockito.*; import static org.molgenis.data.meta.AttributeType.INT; import static org.molgenis.data.meta.AttributeType.STRING; import static org.testng.Assert.assertEquals; public class SortGeneratorTest { private SortGenerator sortGenerator; private SearchRequestBuilder searchRequestBuilder; private EntityType entityType; @BeforeMethod public void beforeMethod() { sortGenerator = new SortGenerator(); searchRequestBuilder = mock(SearchRequestBuilder.class); EntityType entityType = when(mock(EntityType.class).getName()).thenReturn("entity").getMock(); Attribute intAttr = when(mock(Attribute.class).getName()).thenReturn("int").getMock(); when(intAttr.getDataType()).thenReturn(INT); when(entityType.getAttribute("int")).thenReturn(intAttr); Attribute stringAttr = when(mock(Attribute.class).getName()).thenReturn("string").getMock(); when(stringAttr.getDataType()).thenReturn(STRING); when(entityType.getAttribute("string")).thenReturn(stringAttr); this.entityType = entityType; } @Test public void testGenerateNoSort() { QueryImpl<Entity> query = new QueryImpl<>(); sortGenerator.generate(searchRequestBuilder, query, entityType); verifyZeroInteractions(searchRequestBuilder); } @Test public void testGenerateAsc() { Query<Entity> query = new QueryImpl<>().sort(new Sort("int", Sort.Direction.ASC)); sortGenerator.generate(searchRequestBuilder, query, entityType); ArgumentCaptor<FieldSortBuilder> argument = ArgumentCaptor.forClass(FieldSortBuilder.class); verify(searchRequestBuilder).addSort(argument.capture()); FieldSortBuilder sortBuilder = argument.getValue(); assertEquals(sortBuilder.toString().replaceAll("\\s", ""), "\"int\"{\"order\":\"asc\",\"mode\":\"min\"}"); } @Test public void testGenerateAscRaw() { Query<Entity> query = new QueryImpl<>().sort(new Sort("string", Sort.Direction.ASC)); sortGenerator.generate(searchRequestBuilder, query, entityType); ArgumentCaptor<FieldSortBuilder> argument = ArgumentCaptor.forClass(FieldSortBuilder.class); verify(searchRequestBuilder).addSort(argument.capture()); FieldSortBuilder sortBuilder = argument.getValue(); assertEquals(sortBuilder.toString().replaceAll("\\s", ""), "\"string.raw\"{\"order\":\"asc\",\"mode\":\"min\"}"); } @Test public void testGenerateDesc() { Query<Entity> query = new QueryImpl<>().sort(new Sort("int", Sort.Direction.DESC)); sortGenerator.generate(searchRequestBuilder, query, entityType); ArgumentCaptor<FieldSortBuilder> argument = ArgumentCaptor.forClass(FieldSortBuilder.class); verify(searchRequestBuilder).addSort(argument.capture()); FieldSortBuilder sortBuilder = argument.getValue(); assertEquals(sortBuilder.toString().replaceAll("\\s", ""), "\"int\"{\"order\":\"desc\",\"mode\":\"min\"}"); } @Test public void testGenerateDescRaw() { Query<Entity> query = new QueryImpl<>().sort(new Sort("string", Sort.Direction.DESC)); sortGenerator.generate(searchRequestBuilder, query, entityType); ArgumentCaptor<FieldSortBuilder> argument = ArgumentCaptor.forClass(FieldSortBuilder.class); verify(searchRequestBuilder).addSort(argument.capture()); FieldSortBuilder sortBuilder = argument.getValue(); assertEquals(sortBuilder.toString().replaceAll("\\s", ""), "\"string.raw\"{\"order\":\"desc\",\"mode\":\"min\"}"); } @Test public void testGenerateDescAscRaw() { Query<Entity> query = new QueryImpl<>() .sort(new Sort().on("int", Sort.Direction.DESC).on("string", Sort.Direction.ASC)); sortGenerator.generate(searchRequestBuilder, query, entityType); ArgumentCaptor<FieldSortBuilder> argument = ArgumentCaptor.forClass(FieldSortBuilder.class); verify(searchRequestBuilder, times(2)).addSort(argument.capture()); List<FieldSortBuilder> sortBuilder = argument.getAllValues(); assertEquals(sortBuilder.size(), 2); assertEquals(sortBuilder.get(0).toString().replaceAll("\\s", ""), "\"int\"{\"order\":\"desc\",\"mode\":\"min\"}"); assertEquals(sortBuilder.get(1).toString().replaceAll("\\s", ""), "\"string.raw\"{\"order\":\"asc\",\"mode\":\"min\"}"); } }