package com.github.kpavlov.jreactive8583.netty.pipeline;
import com.github.kpavlov.jreactive8583.IsoMessageListener;
import com.solab.iso8583.IsoMessage;
import io.netty.channel.ChannelHandlerContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class CompositeIsoMessageHandlerTest {
@Mock
private IsoMessageListener<IsoMessage> listener1;
@Mock
private IsoMessageListener<IsoMessage> listener2;
@Mock
private IsoMessageListener<IsoMessage> listener3;
@Mock
private IsoMessage message;
@Mock
private ChannelHandlerContext ctx;
private CompositeIsoMessageHandler<IsoMessage> handler = new CompositeIsoMessageHandler<>();
@Before
public void setUp() throws Exception {
//noinspection unchecked
handler.addListeners(listener1, listener2, listener3);
}
@Test
public void shouldRemoveListener() throws Exception {
//given
when(listener1.applies(message)).thenReturn(true);
when(listener3.applies(message)).thenReturn(true);
when(listener1.onMessage(ctx, message)).thenReturn(true);
//when
handler.removeListener(listener2);
handler.channelRead(ctx, message);
//then
verify(listener1).onMessage(ctx, message);
verify(listener2, never()).onMessage(ctx, message);
verify(listener3).onMessage(ctx, message);
}
@Test
public void shouldHandleWithAppropriateHandler() throws Exception {
//given
when(listener1.applies(message)).thenReturn(false);
when(listener2.applies(message)).thenReturn(true);
when(listener3.applies(message)).thenReturn(false);
when(listener2.onMessage(ctx, message)).thenReturn(true);
//when
handler.channelRead(ctx, message);
//then
verify(listener1, never()).onMessage(ctx, message);
verify(listener2).onMessage(ctx, message);
verify(listener3, never()).onMessage(ctx, message);
}
@Test
public void testStopProcessing() throws Exception {
//given
when(listener1.applies(message)).thenReturn(true);
when(listener2.applies(message)).thenReturn(true);
when(listener1.onMessage(ctx, message)).thenReturn(true);
when(listener2.onMessage(ctx, message)).thenReturn(false);
//when
handler.channelRead(ctx, message);
//then
verify(listener1).onMessage(ctx, message);
verify(listener2).onMessage(ctx, message);
verify(listener3, never()).onMessage(ctx, message);
}
@Test
public void shouldNotFailOnExceptionInFailsafeMode() throws Exception {
//given
handler = new CompositeIsoMessageHandler<>(false);
//noinspection unchecked
handler.addListeners(listener1, listener2, listener3);
when(listener1.applies(message)).thenReturn(true);
when(listener2.applies(message)).thenThrow(new RuntimeException("Expected exception"));
when(listener3.applies(message)).thenReturn(true);
when(listener1.onMessage(ctx, message)).thenReturn(true);
// when
handler.channelRead(ctx, message);
//then
verify(listener1).onMessage(ctx, message);
verify(listener2, never()).onMessage(ctx, message);
verify(listener3).onMessage(ctx, message);
}
}