package pl.edu.icm.saos.persistence.search.implementor;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.iterableWithSize;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springframework.beans.factory.annotation.Autowired;
import pl.edu.icm.saos.common.testcommon.category.SlowTest;
import pl.edu.icm.saos.persistence.PersistenceTestSupport;
import pl.edu.icm.saos.persistence.common.TestPersistenceObjectFactory;
import pl.edu.icm.saos.persistence.model.CommonCourt;
import pl.edu.icm.saos.persistence.model.CommonCourt.CommonCourtType;
import pl.edu.icm.saos.persistence.model.CommonCourtDivision;
import pl.edu.icm.saos.persistence.repository.CommonCourtRepository;
import pl.edu.icm.saos.persistence.search.DatabaseSearchService;
import pl.edu.icm.saos.persistence.search.dto.CommonCourtSearchFilter;
import pl.edu.icm.saos.persistence.search.result.SearchResult;
/**
* Tests integration between
* {@link pl.edu.icm.saos.persistence.search.implementor.CommonCourtJpqlSearchImplementator CommonCourtJpqlSearchImplementator}
* and {@link pl.edu.icm.saos.persistence.search.DatabaseSearchService DatabaseSearchService}
*/
@Category(SlowTest.class)
public class CommonCourtJpqlSearchImplementatorTest extends PersistenceTestSupport {
@Autowired
private TestPersistenceObjectFactory testPersistenceObjectFactory;
@Autowired
private DatabaseSearchService databaseSearchService;
@Autowired
private CommonCourtRepository commonCourtRepository;
@Test
public void search__it_should_not_throw_lazy_exception_for_empty_division_list(){
//given
CommonCourt commonCourt = new CommonCourt();
commonCourt.setCode("someCode");
commonCourtRepository.save(commonCourt);
CommonCourtSearchFilter searchFilter = CommonCourtSearchFilter.builder()
.filter();
//when
SearchResult<CommonCourt> searchResult = databaseSearchService.search(searchFilter);
//then
CommonCourt court = searchResult.getResultRecords().get(0);
court.getDivisions();
}
@Test
public void search__it_should_return_empty_list_if_there_is_no_common_courts(){
CommonCourtSearchFilter searchFilter = CommonCourtSearchFilter.builder()
.filter();
//when
SearchResult<CommonCourt> searchResult = databaseSearchService.search(searchFilter);
//then
List<CommonCourt> courts = searchResult.getResultRecords();
assertThat("should be empty", courts, iterableWithSize(0));
}
@Test
public void search__it_should_find_all_CommonCourt_Basic_Fields_With_Its_All_Divisions_Fields(){
//given
CommonCourt commonCourt = testPersistenceObjectFactory.createCcCourt(CommonCourtType.APPEAL);
CommonCourtSearchFilter searchFilter = CommonCourtSearchFilter.builder()
.filter();
//when
SearchResult<CommonCourt> searchResult = databaseSearchService.search(searchFilter);
//then
List<CommonCourt> courts = searchResult.getResultRecords();
assertThat(courts, iterableWithSize(1));
CommonCourt actualCourt = courts.get(0);
assertThat("court code", actualCourt.getCode(), is(commonCourt.getCode()));
assertThat("court name", actualCourt.getName(), is(commonCourt.getName()));
assertThat("court type", actualCourt.getType(), is(commonCourt.getType()));
List<CommonCourtDivision> divisions = actualCourt.getDivisions();
assertThat(divisions, iterableWithSize(2));
assertThat(" divisions ", actualCourt.getDivisions(), containsListInAnyOrder(commonCourt.getDivisions()));
}
@Test
public void search__it_should_find_subList_of_courts_ordered_by_id(){
//given
List<CommonCourt> commonCourts = testPersistenceObjectFactory.createCcCourtListWithRandomData(4);
commonCourts.sort((first, second) -> Long.compare(first.getId(), second.getId()));
int offset = 1;
int limit = 2;
CommonCourtSearchFilter searchFilter = CommonCourtSearchFilter.builder()
.limit(limit)
.offset(offset)
.filter();
//when
SearchResult<CommonCourt> searchResult = databaseSearchService.search(searchFilter);
//then
List<CommonCourt> courts = searchResult.getResultRecords();
assertThat("courts code", toCodes(courts), is(toCodes(commonCourts.subList(1, 3))));
}
private static org.hamcrest.Matcher<java.lang.Iterable<?>> containsListInAnyOrder(List<?> items) {
return containsInAnyOrder(items.toArray());
}
private static List<String> toCodes(List<CommonCourt> courts){
return courts.stream().map(CommonCourt::getCode).collect(Collectors.toList());
}
}