package gov.samhsa.consent2share.si;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessagingException;
import org.springframework.util.StringUtils;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.doReturn;
@RunWith(MockitoJUnitRunner.class)
public class NotificationExceptionHandlerTest {
@Mock
private NotificationPublisher notificationPublisher;
@InjectMocks
private NotificationExceptionHandler sut;
@Test(expected = IllegalArgumentException.class)
public void testHandleError_Throws_Exception_Given_Null_Message() {
sut.handleError(null);
}
@Test
public void testHandleError_Notification_Is_Published() {
Message<MessagingException> errorMessageMock = (Message<MessagingException>) mock(Message.class);
MessagingException messagingExceptionMock = mock(MessagingException.class);
when(errorMessageMock.getPayload()).thenReturn(messagingExceptionMock);
Message<?> failedMessageMock = (Message<?>) mock(Message.class);
doReturn(failedMessageMock).when(messagingExceptionMock)
.getFailedMessage();
String origMessagePayload = "origMessagePayload";
doReturn(origMessagePayload).when(failedMessageMock).getPayload();
Throwable exMock = mock(Throwable.class);
when(messagingExceptionMock.getCause()).thenReturn(exMock);
String expectedDetails = "bla";
String expectedSubject = "Consent signed/revoked message hanlding error";
sut.handleError(errorMessageMock);
verify(notificationPublisher, times(1)).publish(
argThat(new IsNotificationAsExpected(expectedSubject,
expectedDetails)));
}
private class IsNotificationAsExpected extends
ArgumentMatcher<Notification> {
private String expectedSubject;
private String expectedDetails;
public IsNotificationAsExpected(String expectedSubject,
String expectedDetails) {
this.expectedSubject = expectedSubject;
this.expectedDetails = expectedDetails;
}
@Override
public boolean matches(Object argument) {
Notification notification = (Notification) argument;
if (notification.getSubject().equals(expectedSubject)
&& StringUtils.hasText(notification.getDetails())) {
return true;
}
return false;
}
}
}