package eu.europeana.cloud.service.uis.persistent;
import eu.europeana.cloud.service.uis.persistent.CassandraDataProviderService;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.google.common.io.BaseEncoding;
import eu.europeana.cloud.common.exceptions.ProviderDoesNotExistException;
import eu.europeana.cloud.common.model.DataProvider;
import eu.europeana.cloud.common.model.DataProviderProperties;
import eu.europeana.cloud.common.response.ResultSlice;
import eu.europeana.cloud.service.uis.exception.ProviderAlreadyExistsException;
/**
* DataProvider Service Test
*
* @author Yorgos Mamakis (Yorgos.Mamakis@ europeana.eu)
* @since Jan 10, 2014
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = { "classpath:/default-context.xml" })
public class CassandraDataProviderServiceTest extends CassandraTestBase {
@Autowired
private CassandraDataProviderService cassandraDataProviderService;
/**
* Create and get a provider
*
* @throws ProviderAlreadyExistsException
* @throws ProviderDoesNotExistException
*/
@Test
public void shouldCreateAndGetProvider() throws ProviderAlreadyExistsException, ProviderDoesNotExistException {
String id = "provident";
DataProvider dp = cassandraDataProviderService
.createProvider(id, createRandomDataProviderProperties());
DataProvider dpFromService = cassandraDataProviderService.getProvider("provident");
assertThat(dp, is(dpFromService));
assertThat(dp.getPartitionKey(), is(id.hashCode()));
}
/**
* Test provider does not exist exception
*
* @throws ProviderDoesNotExistException
*/
@Test(expected = ProviderDoesNotExistException.class)
public void shouldFailWhenFetchingNonExistingProvider() throws ProviderDoesNotExistException {
cassandraDataProviderService.getProvider("provident");
}
/**
* Empty array retrieval
*/
@Test
public void shouldReturnEmptyArrayWhenNoProviderAdded() {
assertTrue("Expecting no providers", cassandraDataProviderService.getProviders(null, 1).getResults().isEmpty());
}
/**
* Retrieve batch providers test
* @throws ProviderAlreadyExistsException
*/
@Test
public void shouldReturnAllProviders() throws ProviderAlreadyExistsException {
int providerCount = 10;
Set<DataProvider> insertedProviders = new HashSet<>(providerCount * 2);
// insert random providers
for (int provId = 0; provId < providerCount; provId++) {
insertedProviders.add(cassandraDataProviderService.createProvider("dp_" + provId,
createRandomDataProviderProperties()));
}
Set<DataProvider> fetchedProviders = new HashSet<>(cassandraDataProviderService.getProviders(null, 100)
.getResults());
assertThat(fetchedProviders, is(insertedProviders));
}
/**
* Paged Provider list retrieval
*
* @throws ProviderAlreadyExistsException
*/
@Test
public void shouldReturnPagedProviderList() throws ProviderAlreadyExistsException {
int providerCount = 100;
List<String> insertedProviderIds = new ArrayList<>(providerCount);
// insert random providers
for (int provId = 0; provId < providerCount; provId++) {
DataProvider prov = cassandraDataProviderService.createProvider("dp_" + provId,
createRandomDataProviderProperties());
insertedProviderIds.add(prov.getId());
}
// iterate through all providers
List<String> fetchedProviderIds = new ArrayList<>(providerCount);
int sliceSize = 10;
String token = null;
do {
ResultSlice<DataProvider> resultSlice = cassandraDataProviderService.getProviders(token, sliceSize);
token = resultSlice.getNextSlice();
assertTrue(resultSlice.getResults().size() == sliceSize || token == null);
for (DataProvider dp : resultSlice.getResults()) {
fetchedProviderIds.add(dp.getId());
}
} while (token != null);
Collections.sort(insertedProviderIds);
Collections.sort(fetchedProviderIds);
assertThat(insertedProviderIds, is(fetchedProviderIds));
}
@Test(expected = ProviderDoesNotExistException.class)
public void shouldDeleteProvider() throws ProviderAlreadyExistsException, ProviderDoesNotExistException{
String id = "sampleProvider";
DataProvider dp = cassandraDataProviderService
.createProvider(id, createRandomDataProviderProperties());
DataProvider dpFromService = cassandraDataProviderService.getProvider("sampleProvider");
assertThat(dp, is(dpFromService));
assertThat(dp.getPartitionKey(), is(id.hashCode()));
//
cassandraDataProviderService.deleteProvider("sampleProvider");
cassandraDataProviderService.deleteProvider("sampleProvider");
}
@Test(expected = ProviderDoesNotExistException.class)
public void shouldThrowExceptionWhenDeletingNonExistingProvider() throws ProviderDoesNotExistException {
cassandraDataProviderService.deleteProvider("not existing provident");
}
private DataProviderProperties createRandomDataProviderProperties() {
DataProviderProperties properties = new DataProviderProperties();
properties.setContactPerson("Contact_Person_" + randomString());
properties.setDigitalLibraryURL("http://library.url/" + randomString());
properties.setDigitalLibraryWebsite("http://library.url/website/" + randomString());
properties.setOfficialAddress("Address/" + randomString());
properties.setOrganisationName("Organisation_Name_" + randomString());
properties.setOrganisationWebsite("http://organisation.url/" + randomString());
properties.setOrganisationWebsiteURL("http://organisation.url/website" + randomString());
properties.setRemarks("Important remarks for provider include " + randomString());
return properties;
}
private static String randomString() {
byte[] randomBytes = new byte[10];
ThreadLocalRandom.current().nextBytes(randomBytes);
return BaseEncoding.base64().encode(randomBytes);
}
}