package eu.europeana.cloud.service.dps.storm.io;
import eu.europeana.cloud.mcs.driver.DataSetServiceClient;
import eu.europeana.cloud.service.dps.PluginParameterKeys;
import eu.europeana.cloud.service.dps.storm.AbstractDpsBolt;
import eu.europeana.cloud.service.dps.storm.StormTaskTuple;
import eu.europeana.cloud.service.dps.storm.utils.TestConstantsHelper;
import eu.europeana.cloud.service.mcs.exception.MCSException;
import org.apache.storm.task.OutputCollector;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.PowerMockRunner;
import java.net.URISyntaxException;
import static org.mockito.Matchers.anyList;
import static org.mockito.Mockito.*;
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*"})
public class AddResultToDataSetBoltTest implements TestConstantsHelper {
@Mock(name = "outputCollector")
private OutputCollector outputCollector;
@Mock(name = "dataSetClient")
private DataSetServiceClient dataSetServiceClient;
@InjectMocks
private AddResultToDataSetBolt addResultToDataSetBolt;
@Before
public void init() throws IllegalAccessException, MCSException, URISyntaxException {
MockitoAnnotations.initMocks(this); // initialize all the @Mock objects
}
private StormTaskTuple stormTaskTuple;
private static final String DATASET_URL = "http://127.0.0.1:8080/mcs/data-providers/stormTestTopologyProvider/data-sets/s1";
private static final String DATASET_URL2 = "http://127.0.0.1:8080/mcs/data-providers/stormTestTopologyProvider/data-sets/s2";
private static final String FILE_URL = "http://127.0.0.1:8080/mcs/records/BSJD6UWHYITSUPWUSYOVQVA4N4SJUKVSDK2X63NLYCVB4L3OXKOA/representations/NEW_REPRESENTATION_NAME/versions/c73694c0-030d-11e6-a5cb-0050568c62b8/files/dad60a17-deaa-4bb5-bfb8-9a1bbf6ba0b2";
public final void verifyMethodExecustionNumber(int expectedAssignRepresentationToDataCallTimes, int expectedEmitCallTimes) throws MCSException {
when(outputCollector.emit(anyString(), anyList())).thenReturn(null);
addResultToDataSetBolt.addRepresentationToDataSets(stormTaskTuple, dataSetServiceClient);
verify(dataSetServiceClient, times(expectedAssignRepresentationToDataCallTimes)).assignRepresentationToDataSet(anyString(), anyString(), anyString(), anyString(), anyString());
verify(outputCollector, times(expectedEmitCallTimes)).emit(eq(AbstractDpsBolt.NOTIFICATION_STREAM_NAME), anyListOf(Object.class));
}
@Test
public void shouldEmmitNotificationWhenDataSetListHasOneElement() throws MCSException, URISyntaxException {
//given
stormTaskTuple = prepareTupleWithSingleDataSet();
verifyMethodExecustionNumber(1, 1);
}
@Test
public void shouldEmitInfoWhenDataSetListIsEmpty() throws MCSException {
stormTaskTuple = prepareTupleWithEmptyDataSetList();
verifyMethodExecustionNumber(0, 1);
}
@Test
public void shouldEmmitInfoWhenDataSetListHasMoreThanOneElement() throws MCSException {
stormTaskTuple = prepareTupleWithMultipleDataSets();
verifyMethodExecustionNumber(2, 1);
}
@Test
public void shouldEmmitNotificationWhenOutputUrlIsEmpty() throws MCSException {
stormTaskTuple = prepareTupleWithEmptyOutputUrl();
verifyMethodExecustionNumber(0, 1);
}
@Test
public void shouldEmmitNotificationWrongDatasetUrl() throws MCSException {
stormTaskTuple = prepareTupleWithWrongDatasetUrl();
verifyMethodExecustionNumber(0, 1);
}
private StormTaskTuple prepareTupleWithEmptyOutputUrl() {
StormTaskTuple tuple = new StormTaskTuple();
tuple.addParameter(PluginParameterKeys.OUTPUT_DATA_SETS, DATASET_URL);
return tuple;
}
private StormTaskTuple prepareTupleWithEmptyDataSetList() {
StormTaskTuple tuple = new StormTaskTuple();
tuple.addParameter(PluginParameterKeys.OUTPUT_URL, FILE_URL);
return tuple;
}
private StormTaskTuple prepareTupleWithSingleDataSet() {
StormTaskTuple tuple = new StormTaskTuple();
tuple.addParameter(PluginParameterKeys.OUTPUT_URL, FILE_URL);
tuple.addParameter(PluginParameterKeys.OUTPUT_DATA_SETS, DATASET_URL);
return tuple;
}
private StormTaskTuple prepareTupleWithMultipleDataSets() {
StormTaskTuple tuple = new StormTaskTuple();
tuple.addParameter(PluginParameterKeys.OUTPUT_URL, FILE_URL);
tuple.addParameter(PluginParameterKeys.OUTPUT_DATA_SETS, DATASET_URL + "," + DATASET_URL2);
return tuple;
}
private StormTaskTuple prepareTupleWithWrongDatasetUrl() {
StormTaskTuple tuple = new StormTaskTuple();
tuple.addParameter(PluginParameterKeys.OUTPUT_URL, FILE_URL);
tuple.addParameter(PluginParameterKeys.OUTPUT_DATA_SETS, "sample_sample_sample");
return tuple;
}
}