package uk.ac.ox.zoo.seeg.abraid.mp.common.dao;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import uk.ac.ox.zoo.seeg.abraid.mp.common.AbstractCommonSpringIntegrationTests;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.Expert;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.ValidatorDiseaseGroup;
import java.util.HashSet;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the ExpertDao class.
*
* Copyright (c) 2014 University of Oxford
*/
public class ExpertDaoTest extends AbstractCommonSpringIntegrationTests {
@Autowired
private ExpertDao expertDao;
@Test
public void saveAndReloadExpert() {
// Arrange
String expertName = "Test Expert";
String expertEmail = "hello@world.com";
String expertPassword = "password";
String expertJob = "job";
String expertInstitution = "institution";
boolean visibilityRequested = true;
boolean isSeegMember = true;
boolean hasSeenHelpText = false;
Expert expert = new Expert();
expert.setName(expertName);
expert.setEmail(expertEmail);
expert.setPassword(expertPassword);
expert.setJobTitle(expertJob);
expert.setInstitution(expertInstitution);
expert.setVisibilityRequested(visibilityRequested);
expert.setSeegMember(isSeegMember);
expert.setHasSeenHelpText(hasSeenHelpText);
// Act
expertDao.save(expert);
// Assert
assertThat(expert.getCreatedDate()).isNotNull();
Integer id = expert.getId();
flushAndClear();
expert = expertDao.getByEmail(expertEmail);
assertThat(expert).isNotNull();
assertThat(expert.getId()).isNotNull();
assertThat(expert.getId()).isEqualTo(id);
assertThat(expert.getName()).isEqualTo(expertName);
assertThat(expert.getJobTitle()).isEqualTo(expertJob);
assertThat(expert.getInstitution()).isEqualTo(expertInstitution);
assertThat(expert.getCreatedDate()).isNotNull();
assertThat(expert.getUpdatedDate()).isNotNull();
assertThat(expert.getVisibilityRequested()).isEqualTo(visibilityRequested);
assertThat(expert.isSeegMember()).isEqualTo(isSeegMember);
assertThat(expert.hasSeenHelpText()).isEqualTo(hasSeenHelpText);
}
@Test
public void saveAndReloadExpertOnId() {
// Arrange
String expertName = "Test Expert";
String expertEmail = "hello@world.com";
String expertPassword = "password";
String expertJob = "job";
String expertInstitution = "institution";
boolean visibilityRequested = true;
Expert expert = new Expert();
expert.setName(expertName);
expert.setEmail(expertEmail);
expert.setPassword(expertPassword);
expert.setJobTitle(expertJob);
expert.setInstitution(expertInstitution);
//noinspection ConstantConditions
expert.setVisibilityRequested(visibilityRequested);
// Act
expertDao.save(expert);
// Assert
assertThat(expert.getCreatedDate()).isNotNull();
Integer id = expert.getId();
flushAndClear();
expert = expertDao.getById(id);
assertThat(expert).isNotNull();
assertThat(expert.getId()).isNotNull();
assertThat(expert.getEmail()).isEqualTo(expertEmail);
assertThat(expert.getName()).isEqualTo(expertName);
assertThat(expert.getJobTitle()).isEqualTo(expertJob);
assertThat(expert.getInstitution()).isEqualTo(expertInstitution);
assertThat(expert.getCreatedDate()).isNotNull();
assertThat(expert.getUpdatedDate()).isNotNull();
//noinspection ConstantConditions
assertThat(expert.getVisibilityRequested()).isEqualTo(visibilityRequested);
}
@Test
public void loadNonExistentExpert() {
// Arrange
String expertEmail = "This expert does not exist";
// Act
Expert expert = expertDao.getByEmail(expertEmail);
// Assert
assertThat(expert).isNull();
}
@Test
public void getAllExperts() {
// Act
List<Expert> experts = expertDao.getAll();
// Assert
assertThat(experts).hasSize(2);
}
@Test
public void getCountOfPubliclyVisibleReturnsCorrectCount() {
// Act
long result = expertDao.getCountOfPubliclyVisible();
// Assert
assertThat(result).isEqualTo(1);
}
@Test
public void getCountOfPubliclyVisibleReturnsCorrectCountAfterModifications() {
// Arrange
Expert expert = expertDao.getById(2);
expert.setVisibilityRequested(true);
expert.setVisibilityApproved(true);
expertDao.save(expert);
// Act
long result = expertDao.getCountOfPubliclyVisible();
// Assert
assertThat(result).isEqualTo(2);
}
@Test
public void getPageOfPubliclyVisibleReturnsCorrectExperts() {
// Act
List<Expert> result = expertDao.getPageOfPubliclyVisible(1, 10);
// Assert
assertThat(result.size()).isEqualTo(1);
assertThat(result.get(0).getName()).isEqualTo("Helena Patching");
}
@Test
public void getPageOfPubliclyVisibleReturnsCorrectExpertsAfterModifications() {
// Arrange
Expert expert = expertDao.getById(2);
expert.setVisibilityRequested(true);
expert.setVisibilityApproved(true);
expertDao.save(expert);
// Act
List<Expert> result = expertDao.getPageOfPubliclyVisible(1, 10);
// Assert
assertThat(result.size()).isEqualTo(2);
assertThat(result.get(0).getName()).isEqualTo("Helena Patching");
assertThat(result.get(1).getName()).isEqualTo("Ed Wiles");
}
@Test
public void getPageOfPubliclyVisibleReturnsCorrectExpertsWithMultiplePages() {
// Arrange
for (int i = 0; i <= 9; i++) {
Expert expert = new Expert();
expert.setEmail("i=" + i);
expert.setName("");
expert.setPassword("");
expert.setJobTitle("");
expert.setInstitution("");
expert.setVisibilityRequested(true);
expert.setVisibilityApproved(true);
expertDao.save(expert);
}
// Act
List<Expert> result1 = expertDao.getPageOfPubliclyVisible(1, 3);
List<Expert> result2 = expertDao.getPageOfPubliclyVisible(2, 3);
List<Expert> result3 = expertDao.getPageOfPubliclyVisible(3, 3);
List<Expert> result4 = expertDao.getPageOfPubliclyVisible(4, 3);
// Assert
assertThat(result1.size()).isEqualTo(3);
assertThat(result2.size()).isEqualTo(3);
assertThat(result3.size()).isEqualTo(3);
assertThat(result4.size()).isEqualTo(2);
HashSet<Expert> allResults = new HashSet<>(); // wont take duplicates
allResults.addAll(result1);
allResults.addAll(result2);
allResults.addAll(result3);
allResults.addAll(result4);
assertThat(allResults.size()).isEqualTo(11);
}
@Test
public void getExpertByIdReturnsExpertIfItExists() {
// Act
Expert expert = expertDao.getById(1);
// Assert
assertThat(expert).isNotNull();
assertThat(expert.getId()).isEqualTo(1);
assertThat(expert.getName()).isEqualTo("Helena Patching");
// Upon execution of the next line, the lazily-loaded validatorDiseaseGroups set is actually loaded
List<ValidatorDiseaseGroup> validatorDiseaseGroups = expert.getValidatorDiseaseGroups();
assertThat(validatorDiseaseGroups).hasSize(2);
}
@Test
public void getExpertByIdReturnsNullIfItDoesNotExist() {
// Act
Expert expert = expertDao.getById(-1);
// Assert
assertThat(expert).isNull();
}
}