package eu.europeana.cloud.service.mcs.persistent;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import eu.europeana.cloud.common.model.CompoundDataSetId;
import eu.europeana.cloud.common.model.File;
import eu.europeana.cloud.common.model.Representation;
import eu.europeana.cloud.common.model.Revision;
import eu.europeana.cloud.common.web.ParamConstants;
import eu.europeana.cloud.service.mcs.kafka.ProducerWrapper;
import eu.europeana.cloud.service.mcs.messages.AddAssignmentMessage;
import eu.europeana.cloud.service.mcs.messages.InsertRepresentationMessage;
import eu.europeana.cloud.service.mcs.messages.InsertRepresentationPersistentMessage;
import eu.europeana.cloud.service.mcs.messages.RemoveAssignmentMessage;
import eu.europeana.cloud.service.mcs.messages.RemoveAssignmentsFromDataSetMessage;
import eu.europeana.cloud.service.mcs.messages.RemoveRecordRepresentationsMessage;
import eu.europeana.cloud.service.mcs.messages.RemoveRepresentationMessage;
import eu.europeana.cloud.service.mcs.messages.RemoveRepresentationVersionMessage;
import eu.europeana.cloud.service.mcs.persistent.cassandra.CassandraDataSetDAO;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import org.apache.commons.lang.SerializationUtils;
import static org.hamcrest.Matchers.is;
import org.junit.After;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import static org.mockito.Matchers.eq;
import org.mockito.Mockito;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = {"classpath:/rabbitContext.xml"})
public class SolrRepresentationIndexerTest {
@Autowired
SolrRepresentationIndexer indexer;
@Autowired
ProducerWrapper producerWrapper;
@Autowired
CassandraDataSetDAO cassandraDataSetDAO;
private static final Gson gson = new GsonBuilder().setDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSSZZ").create();
@After
public void cleanUp() {
Mockito.reset(producerWrapper);
}
@Test
public void shouldSendMessageAboutNotPersistentRepresentationVersionInsert() {
String providerId = "Provider001";
String cloudId = "25DG622J4VM";
String representationName = "representation01";
String versionId
= "b95fcda0-994a-11e3-bfe1-1c6f653f6012";
int partitionKey = 32151;
ArrayList<File> files = new ArrayList<>();
boolean persistent = false;
Date creationDate = Calendar.getInstance().getTime();
Representation representation = new Representation(cloudId,
representationName, versionId, null, null, providerId, files, null, persistent,
creationDate);
indexer.insertRepresentation(representation,
partitionKey);
verify(producerWrapper, times(1)).send(partitionKey, SerializationUtils
.serialize(new InsertRepresentationMessage(gson.toJson(representation))));
verifyNoMoreInteractions(producerWrapper);
}
@Test
public void shouldSendMessageAboutPersistentRepresentationVersionInsert() {
//given
String providerId = "Provider001";
String cloudId = "25DG622J4VM";
String representationName = "representation01";
String versionId
= "b95fcda0-994a-11e3-bfe1-1c6f653f6012";
int partitionKey = 32151;
ArrayList<File> files = new ArrayList<>();
ArrayList<Revision> revisions = new ArrayList<>();
boolean persistent = true;
Date creationDate = Calendar.getInstance().getTime();
Representation representation = new Representation(cloudId, representationName,
versionId, null, null, providerId, files, revisions, persistent, creationDate);
String dataSetId1 = "dataSet1";
String dataSetId2 = "dataSet2";
Collection<CompoundDataSetId> dataSetIds = new ArrayList<>();
dataSetIds.add(new CompoundDataSetId(providerId, dataSetId1));
dataSetIds.add(new CompoundDataSetId(providerId, dataSetId2));
//when
Mockito.when(cassandraDataSetDAO.getDataSetAssignments(cloudId,
representationName, null)).thenReturn(dataSetIds);
indexer.insertRepresentation(representation, partitionKey);
//then
ArgumentCaptor<byte[]> argument = ArgumentCaptor.forClass(byte[].class);
verify(producerWrapper, times(1)).send(eq(partitionKey),
argument.capture());
verifyNoMoreInteractions(producerWrapper);
InsertRepresentationPersistentMessage resultMessage
= (InsertRepresentationPersistentMessage) SerializationUtils.deserialize((byte[]) (argument.getValue()));
JsonElement jsonElem = gson.fromJson(resultMessage.getPayload(),
JsonElement.class);
JsonObject jsonObject = jsonElem.getAsJsonObject();
JsonElement jsonRepresentation
= jsonObject.get(ParamConstants.F_REPRESENTATION);
Representation sentRepresentation = gson.fromJson(jsonRepresentation,
Representation.class);
Type dataSetIdsType = new TypeToken<Collection<CompoundDataSetId>>() {
}.getType();
JsonElement jsonDataSetIds
= jsonObject.get(ParamConstants.F_DATASETS);
Collection<CompoundDataSetId> sentDataSetIds = gson.fromJson(jsonDataSetIds, dataSetIdsType);
assertEquals(sentDataSetIds, dataSetIds);
assertEquals(sentRepresentation, representation);
}
@Test
public void shouldSendMessageAboutRepresentationVersionRemoval() {
// given
String versionId = "b95fcda0-994a-11e3-bfe1-1c6f653f6012";
int partitionKey = 32151; // when
indexer.removeRepresentationVersion(versionId, partitionKey);
// then
verify(producerWrapper, times(1)).send(
partitionKey,
SerializationUtils
.serialize(new RemoveRepresentationVersionMessage(
versionId)));
verifyNoMoreInteractions(producerWrapper);
}
@Test
public void shouldSendMessageAboutRepresentationRemoval() {
// given
String cloudId = "cloudId123123";
String representationName = "rdf";
int partitionKey = 32151;
ArgumentCaptor<byte[]> argument = ArgumentCaptor.forClass(byte[].class); // when
indexer.removeRepresentation(cloudId, representationName, partitionKey);
// then
verify(producerWrapper, times(1)).send(eq(partitionKey),
argument.capture());
verifyNoMoreInteractions(producerWrapper);
RemoveRepresentationMessage sentMessage = (RemoveRepresentationMessage) SerializationUtils
.deserialize((byte[]) (argument.getValue()));
JsonObject jo = gson.fromJson(sentMessage.getPayload(),
JsonElement.class).getAsJsonObject();
JsonElement cloudIdJson = jo.get(ParamConstants.P_CLOUDID);
String sentCloudId = cloudIdJson.getAsString();
assertEquals(sentCloudId, cloudId);
JsonElement representationNameJson = jo
.get(ParamConstants.P_REPRESENTATIONNAME);
String sentRepresentationName = representationNameJson.getAsString();
assertEquals(sentRepresentationName, representationName);
}
@Test
public void shouldSendMessageAboutNewAssignment() {
// given
String versionId = "b95fcda0-994a-11e3-bfe1-1c6f653f6012";
int partitionKey = 32151;
CompoundDataSetId ds = new CompoundDataSetId("providerId",
"someDataSetId");
ArgumentCaptor<byte[]> argument = ArgumentCaptor.forClass(byte[].class);
// when
indexer.addAssignment(versionId, ds, partitionKey);
// then
verify(producerWrapper, times(1)).send(eq(partitionKey),
argument.capture());
verifyNoMoreInteractions(producerWrapper);
AddAssignmentMessage sentMessage = (AddAssignmentMessage) SerializationUtils
.deserialize((byte[]) (argument.getValue()));
JsonObject jo = gson.fromJson(sentMessage.getPayload(),
JsonElement.class).getAsJsonObject();
assertThat(jo.get(ParamConstants.P_VER).getAsString(), is(versionId));
assertTrue(jo.get(ParamConstants.F_DATASET_PROVIDER_ID).isJsonObject());
assertThat(jo.get(ParamConstants.F_DATASET_PROVIDER_ID)
.getAsJsonObject().get("dataSetId").getAsString(),
is(ds.getDataSetId()));
assertThat(jo.get(ParamConstants.F_DATASET_PROVIDER_ID)
.getAsJsonObject().get("dataSetProviderId").getAsString(),
is(ds.getDataSetProviderId()));
}
@Test
public void shouldSendMessageAboutAssignmentRemoval() {
// given
String cloudId = "b95fcda053f6012";
String representationName = "schema";
int partitionKey = 32151;
CompoundDataSetId ds = new CompoundDataSetId("providerId",
"someDataSetId");
ArgumentCaptor<byte[]> argument = ArgumentCaptor.forClass(byte[].class);
// when
indexer.removeAssignment(cloudId, representationName, ds, partitionKey);
// then
verify(producerWrapper, times(1)).send(eq(partitionKey),
argument.capture());
verifyNoMoreInteractions(producerWrapper);
RemoveAssignmentMessage sentMessage = (RemoveAssignmentMessage) SerializationUtils
.deserialize((byte[]) (argument.getValue()));
JsonObject jo = gson.fromJson(sentMessage.getPayload(),
JsonElement.class).getAsJsonObject();
assertThat(jo.get(ParamConstants.P_CLOUDID).getAsString(), is(cloudId));
assertThat(jo.get(ParamConstants.P_REPRESENTATIONNAME).getAsString(),
is(representationName));
assertTrue(jo.get(ParamConstants.F_DATASET_PROVIDER_ID).isJsonObject());
assertThat(jo.get(ParamConstants.F_DATASET_PROVIDER_ID)
.getAsJsonObject().get("dataSetId").getAsString(),
is(ds.getDataSetId()));
assertThat(jo.get(ParamConstants.F_DATASET_PROVIDER_ID)
.getAsJsonObject().get("dataSetProviderId").getAsString(),
is(ds.getDataSetProviderId()));
}
@Test
public void shouldSendMessageAboutRecordsRepresentationsDeletion() { // given
String cloudId = "b95fcda053f6012";
int partitionKey = 32151;
// when
indexer.removeRecordRepresentations(cloudId, partitionKey);
// then
verify(producerWrapper, times(1)).send(
partitionKey,
SerializationUtils
.serialize(new RemoveRecordRepresentationsMessage(
cloudId)));
verifyNoMoreInteractions(producerWrapper);
}
@Test
public void shouldSendMessageAboutAllDataSetAssignmentsDeletion() {
// given
int partitionKey = 32151;
CompoundDataSetId compoundDataSetId = new CompoundDataSetId("provider",
"dataSet");
// when
indexer.removeAssignmentsFromDataSet(compoundDataSetId, partitionKey);
// then
ArgumentCaptor<byte[]> argument = ArgumentCaptor.forClass(byte[].class);
verify(producerWrapper, times(1)).send(eq(partitionKey),
argument.capture());
verifyNoMoreInteractions(producerWrapper);
RemoveAssignmentsFromDataSetMessage sentMessage = (RemoveAssignmentsFromDataSetMessage) SerializationUtils
.deserialize((byte[]) (argument.getValue()));
CompoundDataSetId sentCompoundDataSetId = gson.fromJson(
sentMessage.getPayload(), CompoundDataSetId.class);
assertEquals(sentCompoundDataSetId, compoundDataSetId);
}
}