package eu.europeana.cloud.service.dps.storm.io; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; 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.mcs.driver.DataSetServiceClient; import eu.europeana.cloud.mcs.driver.FileServiceClient; import eu.europeana.cloud.service.dps.DpsTask; import eu.europeana.cloud.service.dps.PluginParameterKeys; 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.apache.storm.tuple.Tuple; import org.apache.storm.tuple.Values; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import java.lang.reflect.Type; import java.net.URI; import java.net.URISyntaxException; import java.util.*; import static eu.europeana.cloud.service.dps.storm.io.ReadRepresentationBolt.getTestInstance; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyList; import static org.mockito.Mockito.*; import static org.mockito.Mockito.verifyNoMoreInteractions; public class ReadRepresentationBoltTest implements TestConstantsHelper { private ReadRepresentationBolt instance; private OutputCollector oc; private final int TASK_ID = 1; private final String TASK_NAME = "TASK_NAME"; private final String FILE_URL = "http://localhost:8080/mcs/records/sourceCloudId/representations/sourceRepresentationName/versions/sourceVersion/files/sourceFileName"; private final byte[] FILE_DATA = null; private FileServiceClient fileClient; @Before public void init() { oc = mock(OutputCollector.class); fileClient = mock(FileServiceClient.class); instance = getTestInstance("http://localhost:8080/mcs", oc); } @Captor ArgumentCaptor<Values> captor = ArgumentCaptor.forClass(Values.class); @Test public void successfulExecuteStormTuple() throws MCSException, URISyntaxException { //given Representation representation = prepareRepresentation(); StormTaskTuple tuple = new StormTaskTuple(TASK_ID, TASK_NAME, FILE_URL, FILE_DATA, prepareStormTaskTupleParameters(representation)); when(fileClient.getFileUri(SOURCE + CLOUD_ID, SOURCE + REPRESENTATION_NAME, SOURCE + VERSION, SOURCE + FILE)).thenReturn(new URI(FILE_URL)); when(oc.emit(any(Tuple.class), anyList())).thenReturn(null); //when instance.execute(tuple); //then String exptectedFileUrl = "http://localhost:8080/mcs/records/sourceCloudId/representations/sourceRepresentationName/versions/sourceVersion/files/sourceFileName"; verify(oc, times(1)).emit(any(Tuple.class), captor.capture()); assertThat(captor.getAllValues().size(), is(1)); List<Values> allValues = captor.getAllValues(); assertFile(exptectedFileUrl, allValues); verifyNoMoreInteractions(oc); } private Representation prepareRepresentation() throws URISyntaxException { List<File> files = new ArrayList<>(); List<Revision> revisions = new ArrayList<>(); files.add(new File("sourceFileName", "text/plain", "md5", "1", 5, new URI(FILE_URL))); Representation representation = new Representation(SOURCE + CLOUD_ID, SOURCE + REPRESENTATION_NAME, SOURCE + VERSION, new URI(SOURCE_VERSION_URL), new URI(SOURCE_VERSION_URL), DATA_PROVIDER, files,revisions, false, new Date()); return representation; } private void assertFile(String expectedFileUrl, List<Values> allValues) { String fileUrl = ((Map<String, String>) allValues.get(0).get(4)).get(PluginParameterKeys.DPS_TASK_INPUT_DATA); assertThat(fileUrl, is(expectedFileUrl)); } private HashMap<String, String> prepareStormTaskTupleParameters(Representation representation) { HashMap<String, String> parameters = new HashMap<>(); String RepresentationsJson = new Gson().toJson(representation); parameters.put(PluginParameterKeys.REPRESENTATION, RepresentationsJson); return parameters; } }