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.Country;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.HealthMapCountry;
import java.util.List;
import java.util.Set;
import static ch.lambdaj.Lambda.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.core.IsNull.notNullValue;
/**
* Tests the HealthMapCountryDao class.
*
* Copyright (c) 2014 University of Oxford
*/
public class HealthMapCountryDaoTest extends AbstractCommonSpringIntegrationTests {
@Autowired
private HealthMapCountryDao healthMapCountryDao;
@Test
public void getAllHealthMapCountries() {
// Act
List<HealthMapCountry> healthMapCountries = healthMapCountryDao.getAll();
// Assert
assertThat(healthMapCountries).hasSize(224);
int numberOfAssociatedCountries = getNumberOfAssociatedCountries(healthMapCountries);
assertThat(numberOfAssociatedCountries).isEqualTo(264);
int numberOfCountriesWithCentroidOverride = getNumberOfCountriesWithCentroidOverride(healthMapCountries);
assertThat(numberOfCountriesWithCentroidOverride).isEqualTo(11);
}
@Test
public void getHealthMapCountryWithNoAssociatedSEEGCountries() {
// Arrange
int id = 143;
String healthMapCountryName = "Maldives";
// Act
HealthMapCountry healthMapCountry = healthMapCountryDao.getById(id);
// Assert
assertThat(healthMapCountry).isNotNull();
assertThat(healthMapCountry.getId()).isEqualTo(id);
assertThat(healthMapCountry.getName()).isEqualTo(healthMapCountryName);
assertThat(healthMapCountry.getCountries()).isNotNull();
assertThat(healthMapCountry.getCountries()).isEmpty();
}
@Test
public void getHealthMapCountryWithOneAssociatedSEEGCountry() {
// Arrange
int id = 28;
String healthMapCountryName = "Trinidad & Tobago";
// Act
HealthMapCountry healthMapCountry = healthMapCountryDao.getById(id);
// Assert
assertThat(healthMapCountry).isNotNull();
assertThat(healthMapCountry.getId()).isEqualTo(id);
assertThat(healthMapCountry.getName()).isEqualTo(healthMapCountryName);
assertThat(healthMapCountry.getCountries()).isNotNull();
assertThat(healthMapCountry.getCountries()).hasSize(1);
for (Country country : healthMapCountry.getCountries()) {
assertThat(country.getGaulCode()).isEqualTo(246);
assertThat(country.getName()).isEqualTo("Trinidad and Tobago");
}
}
@Test
public void getHealthMapCountryWithTwoAssociatedSEEGCountries() {
// Arrange
int id = 104;
String healthMapCountryName = "Netherlands";
// Act
HealthMapCountry healthMapCountry = healthMapCountryDao.getById(id);
// Assert
assertThat(healthMapCountry).isNotNull();
assertThat(healthMapCountry.getId()).isEqualTo(id);
assertThat(healthMapCountry.getName()).isEqualTo(healthMapCountryName);
Set<Country> countries = healthMapCountry.getCountries();
assertThat(countries).isNotNull();
assertThat(countries).hasSize(2);
Country country1 = findCountryByGaulCode(countries, 177);
assertThat(country1).isNotNull();
assertThat(country1.getName()).isEqualTo("Netherlands");
Country country2 = findCountryByGaulCode(countries, 14);
assertThat(country2).isNotNull();
assertThat(country2.getName()).isEqualTo("Aruba");
}
@Test
public void getHealthMapCountryByInvalidId() {
int id = 5000;
HealthMapCountry healthMapCountry = healthMapCountryDao.getById(id);
assertThat(healthMapCountry).isNull();
}
private int getNumberOfAssociatedCountries(List<HealthMapCountry> healthMapCountries) {
int totalAssociatedCountries = 0;
for (HealthMapCountry healthMapCountry : healthMapCountries) {
if (healthMapCountry.getCountries() != null) {
totalAssociatedCountries += healthMapCountry.getCountries().size();
}
}
return totalAssociatedCountries;
}
private int getNumberOfCountriesWithCentroidOverride(List<HealthMapCountry> healthMapCountries) {
// Return the number of HealthMapCountries with a non-null centroid override
return filter(having(on(HealthMapCountry.class).getCentroidOverride(), notNullValue()),
healthMapCountries).size();
}
private Country findCountryByGaulCode(Set<Country> countries, int gaulCode) {
for (Country country : countries) {
if (country.getGaulCode() == gaulCode) {
return country;
}
}
return null;
}
}