package uk.ac.ox.zoo.seeg.abraid.mp.common.dao;
import org.joda.time.DateTime;
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.*;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the AdminUnitReviewDao class.
* Copyright (c) 2014 University of Oxford
*/
public class AdminUnitReviewDaoTest extends AbstractCommonSpringIntegrationTests {
@Autowired
private AdminUnitReviewDao adminUnitReviewDao;
@Autowired
private DiseaseExtentClassDao diseaseExtentClassDao;
@Autowired
private DiseaseGroupDao diseaseGroupDao;
@Autowired
private ExpertDao expertDao;
private static final Integer EXPERT_ID = 1;
private static final Integer DISEASE_GROUP_ID = 1;
@Test
public void saveAndReloadGlobalAdminUnitReview() {
// Arrange
Expert expert = expertDao.getById(2);
DiseaseGroup diseaseGroup = diseaseGroupDao.getById(1);
int adminUnitGlobalGaulCode = 2;
DiseaseExtentClass response = diseaseExtentClassDao.getByName("PRESENCE");
AdminUnitReview review = createAdminUnitReview(expert, adminUnitGlobalGaulCode, diseaseGroup, response);
// Act
adminUnitReviewDao.save(review);
// Assert
assertReviewSaved(review);
Integer id = review.getId();
flushAndClear();
review = adminUnitReviewDao.getById(id);
assertReviewParameters(review, expert, diseaseGroup, adminUnitGlobalGaulCode, response);
}
private void assertReviewSaved(AdminUnitReview review) {
assertThat(review.getId()).isNotNull();
assertThat(review.getCreatedDate()).isNotNull();
}
private void assertReviewParameters(AdminUnitReview review, Expert expert, DiseaseGroup diseaseGroup,
int adminUnitGlobalGaulCode, DiseaseExtentClass response) {
assertThat(review).isNotNull();
assertThat(review.getExpert().getEmail()).isEqualTo(expert.getEmail());
assertThat(review.getExpert().getValidatorDiseaseGroups()).containsAll(expert.getValidatorDiseaseGroups());
assertThat(review.getDiseaseGroup()).isEqualTo(diseaseGroup);
assertThat(review.getAdminUnitGlobalGaulCode()).isEqualTo(adminUnitGlobalGaulCode);
assertThat(review.getAdminUnitTropicalGaulCode()).isNull();
assertThat(review.getResponse()).isEqualTo(response);
}
@Test
public void saveTwoAdminUnitReviews() {
// Arrange
Expert expert = expertDao.getById(2);
DiseaseGroup diseaseGroup = diseaseGroupDao.getById(1);
int adminUnitGlobalGaulCode = 2;
DiseaseExtentClass response1 = diseaseExtentClassDao.getByName("PRESENCE");
DiseaseExtentClass response2 = diseaseExtentClassDao.getByName("ABSENCE");
AdminUnitReview review1 = createAdminUnitReview(expert, adminUnitGlobalGaulCode, diseaseGroup, response1);
AdminUnitReview review2 = createAdminUnitReview(expert, adminUnitGlobalGaulCode, diseaseGroup, response2);
// Act
adminUnitReviewDao.save(review1);
adminUnitReviewDao.save(review2);
// Assert
assertReviewSaved(review1);
assertReviewSaved(review2);
Integer id1 = review1.getId();
Integer id2 = review2.getId();
flushAndClear();
review1 = adminUnitReviewDao.getById(id1);
review2 = adminUnitReviewDao.getById(id2);
assertReviewParameters(review1, expert, diseaseGroup, adminUnitGlobalGaulCode, response1);
assertReviewParameters(review2, expert, diseaseGroup, adminUnitGlobalGaulCode, response2);
}
@Test
public void saveAdminUnitReviewWithNullResponse() {
// Arrange
AdminUnitReview review = createAdminUnitReview(new Expert(1), 100, new DiseaseGroup(2), null);
// Act
adminUnitReviewDao.save(review);
// Assert
assertReviewSaved(review);
}
@Test
public void getLastReviewDateByExpertIdAndDiseaseGroupIdAndGaulCodeReturnsCorrectDateForGlobal() {
// Arrange
int gaulCode = 24;
AdminUnitReview firstReview = new AdminUnitReview(expertDao.getById(1), gaulCode, null, diseaseGroupDao.getById(22), diseaseExtentClassDao.getByName(DiseaseExtentClass.POSSIBLE_ABSENCE));
adminUnitReviewDao.save(firstReview);
flushAndClear();
AdminUnitReview secondReview = new AdminUnitReview(expertDao.getById(1), gaulCode, null, diseaseGroupDao.getById(22), diseaseExtentClassDao.getByName(DiseaseExtentClass.POSSIBLE_ABSENCE));
adminUnitReviewDao.save(secondReview);
flushAndClear();
// Act
DateTime actual = adminUnitReviewDao.getLastReviewDateByExpertIdAndDiseaseGroupIdAndGaulCode(1, 22, gaulCode);
// Assert
assertThat(actual).isEqualTo(secondReview.getCreatedDate());
}
@Test
public void getLastReviewDateByExpertIdAndDiseaseGroupIdAndGaulCodeReturnsCorrectDateForTropical() {
// Arrange
int gaulCode = 24;
AdminUnitReview firstReview = new AdminUnitReview(expertDao.getById(1), null, gaulCode, diseaseGroupDao.getById(87), diseaseExtentClassDao.getByName(DiseaseExtentClass.POSSIBLE_ABSENCE));
adminUnitReviewDao.save(firstReview);
flushAndClear();
AdminUnitReview secondReview = new AdminUnitReview(expertDao.getById(1), null, gaulCode, diseaseGroupDao.getById(87), diseaseExtentClassDao.getByName(DiseaseExtentClass.POSSIBLE_ABSENCE));
adminUnitReviewDao.save(secondReview);
flushAndClear();
// Act
DateTime actual = adminUnitReviewDao.getLastReviewDateByExpertIdAndDiseaseGroupIdAndGaulCode(1, 87, gaulCode);
// Assert
assertThat(actual).isEqualTo(secondReview.getCreatedDate());
}
@Test
public void getLastReviewDateByExpertIdAndDiseaseGroupIdAndGaulCodeReturnsNullWhenNoReviews() {
// Arrange - no reviews in the database
// Act
DateTime actual = adminUnitReviewDao.getLastReviewDateByExpertIdAndDiseaseGroupIdAndGaulCode(1, 87, 24);
// Assert
assertThat(actual).isNull();
}
@Test
public void getLastReviewDateByExpertIdReturnsCorrectDate() {
// Arrange
AdminUnitReview firstReview = new AdminUnitReview(expertDao.getById(1), 24, null, diseaseGroupDao.getById(87), diseaseExtentClassDao.getByName(DiseaseExtentClass.POSSIBLE_ABSENCE));
adminUnitReviewDao.save(firstReview);
flushAndClear();
AdminUnitReview secondReview = new AdminUnitReview(expertDao.getById(1), 24, null, diseaseGroupDao.getById(87), diseaseExtentClassDao.getByName(DiseaseExtentClass.POSSIBLE_ABSENCE));
adminUnitReviewDao.save(secondReview);
flushAndClear();
// Act
DateTime actual = adminUnitReviewDao.getLastReviewDateByExpertId(1);
// Assert
assertThat(actual).isEqualTo(secondReview.getCreatedDate());
}
@Test
public void getLastReviewDateByExpertIdReturnsNullWhenNoReviews() {
// Arrange - no reviews in the database
// Act
DateTime actual = adminUnitReviewDao.getLastReviewDateByExpertId(1);
// Assert
assertThat(actual).isNull();
}
@Test
public void getByDiseaseGroupIdReturnsExpectedListExcludingNullResponses() {
// Arrange
AdminUnitReview review = createAndSaveAdminUnitReview(1, 1);
createAndSaveAdminUnitReview(1, 2);
AdminUnitReview review2 = createAndSaveAdminUnitReview(2, 1);
createAndSaveAdminUnitReview(2, 2);
AdminUnitReview nullReview = createAndSaveAdminUnitReview(2, 1, null);
// Act
List<AdminUnitReview> reviews = adminUnitReviewDao.getByDiseaseGroupId(DISEASE_GROUP_ID);
// Assert
assertThat(reviews.size()).isEqualTo(2);
assertThat(reviews).contains(review);
assertThat(reviews).contains(review2);
assertThat(reviews).doesNotContain(nullReview);
}
@Test
public void getByExpertIdAndDiseaseGroupReturnsExpectedListIncludingNullResponses() {
// Arrange
AdminUnitReview review = createAndSaveAdminUnitReview(EXPERT_ID, DISEASE_GROUP_ID);
AdminUnitReview nullReview = createAndSaveAdminUnitReview(EXPERT_ID, DISEASE_GROUP_ID, null);
// Act
List<AdminUnitReview> reviews = adminUnitReviewDao.getByExpertIdAndDiseaseGroupId(EXPERT_ID, DISEASE_GROUP_ID);
// Assert
assertThat(reviews.size()).isEqualTo(2);
assertThat(reviews).contains(review);
assertThat(reviews).contains(nullReview);
}
@Test
public void getByExpertIdAndDiseaseGroupReturnsEmptyListForWrongDisease() {
// Arrange
createAndSaveAdminUnitReview(EXPERT_ID, DISEASE_GROUP_ID);
// Act
List<AdminUnitReview> reviews = adminUnitReviewDao.getByExpertIdAndDiseaseGroupId(EXPERT_ID, 2);
// Assert
assertThat(reviews).isEmpty();
}
@Test
public void getCountByExpertIdReturnsExpectedLongIncludingNullResponses() {
// Arrange
createAndSaveAdminUnitReview(EXPERT_ID, DISEASE_GROUP_ID);
createAndSaveAdminUnitReview(EXPERT_ID, DISEASE_GROUP_ID, null);
// Act
Long count = adminUnitReviewDao.getCountByExpertId(EXPERT_ID);
// Assert
assertThat(count).isEqualTo(2);
}
@Test
public void getCountByExpertIdReturnsZeroForNoReviews() {
// Act
Long count = adminUnitReviewDao.getCountByExpertId(1);
// Assert
assertThat(count).isEqualTo(0);
}
private AdminUnitReview createAdminUnitReview(Expert expert, int adminUnitGlobalGaulCode,
DiseaseGroup diseaseGroup, DiseaseExtentClass response) {
AdminUnitReview review = new AdminUnitReview();
review.setExpert(expert);
review.setAdminUnitGlobalGaulCode(adminUnitGlobalGaulCode);
review.setDiseaseGroup(diseaseGroup);
review.setResponse(response);
return review;
}
private AdminUnitReview createAndSaveAdminUnitReview(Integer expertId, Integer diseaseGroupId, DiseaseExtentClass response) {
Expert expert = expertDao.getById(expertId);
DiseaseGroup diseaseGroup = diseaseGroupDao.getById(diseaseGroupId);
int adminUnitGlobalGaulCode = 2;
AdminUnitReview review = new AdminUnitReview(expert, adminUnitGlobalGaulCode, null, diseaseGroup, response);
adminUnitReviewDao.save(review);
return review;
}
private AdminUnitReview createAndSaveAdminUnitReview(Integer expertId, Integer diseaseGroupId) {
DiseaseExtentClass response = diseaseExtentClassDao.getByName(DiseaseExtentClass.PRESENCE);
return createAndSaveAdminUnitReview(expertId, diseaseGroupId, response);
}
}