package eu.europeana.cloud.service.dls.kafka; import eu.europeana.cloud.common.exceptions.NoAppropriateMessageProcessorException; import eu.europeana.cloud.service.dls.listeners.MessageProcessor; import eu.europeana.cloud.service.dls.listeners.RepresentationRemovedMessageProcessor; import eu.europeana.cloud.service.dls.listeners.RepresentationVersionAddedMessageProcessor; import eu.europeana.cloud.service.mcs.messages.AbstractMessage; import eu.europeana.cloud.service.mcs.messages.InsertRepresentationMessage; import eu.europeana.cloud.service.mcs.messages.RemoveRepresentationMessage; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.Before; import org.junit.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; public class MessageDispatherTest { private MessageDispatcher messageDispatcher; @Before public void setUp() { messageDispatcher = new MessageDispatcher(); } @Test public void shouldRouteMessage() { // given String messagePayload = "test"; RemoveRepresentationMessage message = new RemoveRepresentationMessage( messagePayload); MessageProcessor<RemoveRepresentationMessage> messageListener = mock(RepresentationRemovedMessageProcessor.class); mockDispatcherClass(message, messageListener); // when messageDispatcher.routeMessage(message); // then verify(messageListener, times(1)).processMessage(message); verifyNoMoreInteractions(messageListener); } @Test public void shouldThrowNoAppropriateListenerExceptionWhenNoListenerDefined() { // given String messagePayload = "test"; RemoveRepresentationMessage message = new RemoveRepresentationMessage( messagePayload); // no route defined in messageDispatcher // when try { messageDispatcher.routeMessage(message); fail("Not thrown expected exception!"); } catch (Exception e) { // expected exception assertTrue(e instanceof NoAppropriateMessageProcessorException); } } @Test public void shouldThrowsNullPointerExceptionWhenNoListenerDefined() { // given RemoveRepresentationMessage message = null; // no route defined in messageDispatcher // when try { messageDispatcher.routeMessage(message); fail("Not thrown expected exception!"); } catch (Exception e) { // expected exception assertTrue(e instanceof NullPointerException); } } @Test public void shouldThrowNoAppropriateListenerExceptionWhenNoAppropriateListenerDefined() { // given String messagePayload = "test"; RemoveRepresentationMessage message = new RemoveRepresentationMessage( messagePayload); InsertRepresentationMessage iRMessage = new InsertRepresentationMessage( messagePayload); MessageProcessor<InsertRepresentationMessage> iRMessageListener = mock(RepresentationVersionAddedMessageProcessor.class); mockDispatcherClass(iRMessage, iRMessageListener); // no route to RemoveRepresentationMessage defined in messageDispatcher try { // when messageDispatcher.routeMessage(message); fail("No expected exception!"); } catch (Exception e) { // expected exception assertTrue(e instanceof NoAppropriateMessageProcessorException); verifyZeroInteractions(iRMessageListener); } } @Test public void shouldRouteMessageWhenTwoListeners() { // given String messagePayload = "test"; Map<Class<? extends AbstractMessage>, MessageProcessor<? extends AbstractMessage>> listenersMap = new HashMap<>(); // InsertRepresentationMessage add to map InsertRepresentationMessage iRMessage = new InsertRepresentationMessage( messagePayload); MessageProcessor<InsertRepresentationMessage> iRMessageListener = mock(RepresentationVersionAddedMessageProcessor.class); listenersMap.put(iRMessage.getClass(), iRMessageListener); // RemoveRepresentationMessage add to map RemoveRepresentationMessage rRMessage = new RemoveRepresentationMessage( messagePayload); MessageProcessor<RemoveRepresentationMessage> rRMessageListener = mock(RepresentationRemovedMessageProcessor.class); listenersMap.put(rRMessage.getClass(), rRMessageListener); messageDispatcher.setListenersMap(listenersMap); // when messageDispatcher.routeMessage(iRMessage); // then verify(iRMessageListener, times(1)).processMessage(iRMessage); verifyNoMoreInteractions(iRMessageListener); verifyZeroInteractions(rRMessageListener); } private <T extends AbstractMessage> void mockDispatcherClass(T messageClass, MessageProcessor<T> messageListener) { Map<Class<? extends AbstractMessage>, MessageProcessor<? extends AbstractMessage>> listenersMap = new HashMap<>(); listenersMap.put(messageClass.getClass(), messageListener); messageDispatcher.setListenersMap(listenersMap); } }