package net.petrikainulainen.spring.datasolr.todo.service;
import net.petrikainulainen.spring.datasolr.todo.TodoTestUtil;
import net.petrikainulainen.spring.datasolr.todo.document.TodoDocument;
import net.petrikainulainen.spring.datasolr.todo.model.Todo;
import net.petrikainulainen.spring.datasolr.todo.repository.solr.TodoDocumentRepository;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.data.domain.Sort;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.ArrayList;
import java.util.List;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.*;
/**
* @author Petri Kainulainen
*/
public class RepositoryTodoIndexServiceTest {
private static final String SEARCH_TERM = "Foo";
private RepositoryTodoIndexService service;
private TodoDocumentRepository repositoryMock;
@Before
public void setUp() {
service = new RepositoryTodoIndexService();
repositoryMock = mock(TodoDocumentRepository.class);
ReflectionTestUtils.setField(service, "repository", repositoryMock);
}
@Test
public void addToIndex_ShouldCreateNewDocument_ToIndex() {
Todo todoEntry = TodoTestUtil.createModel(TodoTestUtil.ID, TodoTestUtil.DESCRIPTION, TodoTestUtil.TITLE);
service.addToIndex(todoEntry);
ArgumentCaptor<TodoDocument> todoDocumentArgument = ArgumentCaptor.forClass(TodoDocument.class);
verify(repositoryMock, times(1)).save(todoDocumentArgument.capture());
verifyNoMoreInteractions(repositoryMock);
TodoDocument todoDocument = todoDocumentArgument.getValue();
assertEquals(todoEntry.getId().toString(), todoDocument.getId());
assertEquals(todoEntry.getDescription(), todoDocument.getDescription());
assertEquals(todoEntry.getTitle(), todoDocument.getTitle());
}
@Test
public void deleteFromIndex_ShouldDeleteDocumentFromIndex() {
service.deleteFromIndex(1L);
verify(repositoryMock, times(1)).delete("1");
verifyNoMoreInteractions(repositoryMock);
}
@Test
public void search_QueryGenerationFromMethodNameIsUsed_ShouldReturnTodoDocuments() {
ReflectionTestUtils.setField(service, "queryMethodType", RepositoryTodoIndexService.QUERY_METHOD_METHOD_NAME);
List<TodoDocument> expected = new ArrayList<TodoDocument>();
when(repositoryMock.findByTitleContainsOrDescriptionContains(eq(SEARCH_TERM), eq(SEARCH_TERM), any(Sort.class))).thenReturn(expected);
List<TodoDocument> actual = service.search(SEARCH_TERM);
ArgumentCaptor<Sort> sortArgument = ArgumentCaptor.forClass(Sort.class);
verify(repositoryMock, times(1)).findByTitleContainsOrDescriptionContains(eq(SEARCH_TERM), eq(SEARCH_TERM), sortArgument.capture());
verifyNoMoreInteractions(repositoryMock);
Sort sort = sortArgument.getValue();
assertEquals(Sort.Direction.DESC, sort.getOrderFor(TodoDocument.FIELD_ID).getDirection());
assertEquals(expected, actual);
}
@Test
public void search_NamedQueryIsUsed_ShouldReturnTodoDocuments() {
ReflectionTestUtils.setField(service, "queryMethodType", RepositoryTodoIndexService.QUERY_METHOD_NAMED_QUERY);
List<TodoDocument> expected = new ArrayList<TodoDocument>();
when(repositoryMock.findByNamedQuery(eq(SEARCH_TERM), any(Sort.class))).thenReturn(expected);
List<TodoDocument> actual = service.search(SEARCH_TERM);
ArgumentCaptor<Sort> sortArgument = ArgumentCaptor.forClass(Sort.class);
verify(repositoryMock, times(1)).findByNamedQuery(eq(SEARCH_TERM), sortArgument.capture());
verifyNoMoreInteractions(repositoryMock);
Sort sort = sortArgument.getValue();
assertEquals(Sort.Direction.DESC, sort.getOrderFor(TodoDocument.FIELD_ID).getDirection());
assertEquals(expected, actual);
}
@Test
public void search_QueryAnnotationIsUsed_ShouldReturnTodoDocuments() {
ReflectionTestUtils.setField(service, "queryMethodType", RepositoryTodoIndexService.QUERY_METHOD_QUERY_ANNOTATION);
List<TodoDocument> expected = new ArrayList<TodoDocument>();
when(repositoryMock.findByQueryAnnotation(eq(SEARCH_TERM), any(Sort.class))).thenReturn(expected);
List<TodoDocument> actual = service.search(SEARCH_TERM);
ArgumentCaptor<Sort> sortArgument = ArgumentCaptor.forClass(Sort.class);
verify(repositoryMock, times(1)).findByQueryAnnotation(eq(SEARCH_TERM), sortArgument.capture());
verifyNoMoreInteractions(repositoryMock);
Sort sort = sortArgument.getValue();
assertEquals(Sort.Direction.DESC, sort.getOrderFor(TodoDocument.FIELD_ID).getDirection());
assertEquals(expected, actual);
}
@Test
public void search_QueryMethodTypeIsUnknown_ShouldReturnEmptyList() {
ReflectionTestUtils.setField(service, "queryMethodType", "unknown");
List<TodoDocument> todos = service.search(SEARCH_TERM);
verifyZeroInteractions(repositoryMock);
assertTrue(todos.isEmpty());
}
@Test
public void search_QueryMethodTypeIsNotSet_ShouldReturnEmptyList() {
List<TodoDocument> todos = service.search(SEARCH_TERM);
verifyZeroInteractions(repositoryMock);
assertTrue(todos.isEmpty());
}
@Test
public void update_ExistingTodo_ShouldUpdateDocument() {
Todo todoEntry = TodoTestUtil.createModel(TodoTestUtil.ID, TodoTestUtil.DESCRIPTION, TodoTestUtil.TITLE);
service.update(todoEntry);
verify(repositoryMock, times(1)).update(todoEntry);
verifyNoMoreInteractions(repositoryMock);
}
}