package gov.samhsa.consent2share.si; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; 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; @RunWith(MockitoJUnitRunner.class) public class EndpointStarterTest { @Mock private BusController busController; @Mock private NotificationPublisher notificationPublisher; @Mock private EndpointStopper endpointStopperCounterpart; @InjectMocks private EndpointStarter sut; @Test public void testStart_EndpointStopperCounterpart_Is_SetCounter_To_Zero() { sut.start(); verify(endpointStopperCounterpart, times(1)).setCounter(0); } @Test public void testStart_BusController_Is_Sent_StartCommand() { final String endpointNeedToStop = "EndpointNeedToStop"; when(endpointStopperCounterpart.getEndpointNeedToStop()).thenReturn(endpointNeedToStop); sut.start(); String expectedCommand = endpointNeedToStop + ".start()"; verify(busController, times(1)).send(expectedCommand); } @Test public void testStart_Notification_Is_Published() { final String endpointNeedToStop = "EndpointNeedToStop"; when(endpointStopperCounterpart.getEndpointNeedToStop()).thenReturn(endpointNeedToStop); sut.start(); String expectedDetails = endpointNeedToStop + ".start()" + " was called."; String expectedSubject = "The endpoint of si-c2s-xds was started"; 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) && notification.getDetails().equals(expectedDetails)) { return true; } return false; } } }