package io.github.azagniotov.stubby4j.handlers; import io.github.azagniotov.stubby4j.cli.ANSITerminal; import io.github.azagniotov.stubby4j.stubs.StubHttpLifecycle; import io.github.azagniotov.stubby4j.stubs.StubRepository; import io.github.azagniotov.stubby4j.stubs.StubTypes; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.server.Request; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Optional; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AjaxResourceContentHandlerTest { private static final Optional<StubHttpLifecycle> STUB_HTTP_LIFECYCLE_OPTIONAL = Optional.of(new StubHttpLifecycle.Builder().build()); @Rule public ExpectedException expectedException = ExpectedException.none(); @Mock private PrintWriter mockPrintWriter; @Mock private StubRepository mockStubRepository; @Mock private HttpServletRequest mockHttpServletRequest; @Mock private HttpServletResponse mockHttpServletResponse; @Mock private Request mockRequest; @Captor private ArgumentCaptor<String> fieldCaptor; @Captor private ArgumentCaptor<Integer> responseSequenceCaptor; @Captor private ArgumentCaptor<Integer> stubIndexCaptor; @Captor private ArgumentCaptor<StubTypes> stubTypeCaptor; private AjaxResourceContentHandler spyAjaxResourceContentHandler = new AjaxResourceContentHandler(mockStubRepository); @BeforeClass public static void beforeClass() throws Exception { ANSITerminal.muteConsole(true); } @Before public void beforeEach() throws Exception { when(mockHttpServletResponse.getWriter()).thenReturn(mockPrintWriter); when(mockHttpServletRequest.getMethod()).thenReturn(HttpMethod.GET.asString()); spyAjaxResourceContentHandler = Mockito.spy(new AjaxResourceContentHandler(mockStubRepository)); } @Test public void verifyBehaviourWhenAjaxSubmittedToFetchStubbedRequestContent() throws Exception { final String requestURI = "/ajax/resource/5/request/post"; when(mockHttpServletRequest.getRequestURI()).thenReturn(requestURI); when(mockStubRepository.matchStubByIndex(anyInt())).thenReturn(STUB_HTTP_LIFECYCLE_OPTIONAL); spyAjaxResourceContentHandler.handle(requestURI, mockRequest, mockHttpServletRequest, mockHttpServletResponse); verify(spyAjaxResourceContentHandler).throwErrorOnNonExistentResourceIndex(any(HttpServletResponse.class), stubIndexCaptor.capture()); verify(spyAjaxResourceContentHandler, times(1)).renderAjaxResponseContent(any(HttpServletResponse.class), stubTypeCaptor.capture(), fieldCaptor.capture(), any(StubHttpLifecycle.class)); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), anyInt(), anyString(), any(StubHttpLifecycle.class)); assertThat(stubIndexCaptor.getValue()).isEqualTo(5); assertThat(stubTypeCaptor.getValue()).isEqualTo(StubTypes.REQUEST); assertThat(fieldCaptor.getValue()).isEqualTo("post"); } @Test public void verifyBehaviourWhenAjaxSubmittedToFetchStubbedResponseContent() throws Exception { final String requestURI = "/ajax/resource/15/response/file"; when(mockHttpServletRequest.getRequestURI()).thenReturn(requestURI); when(mockStubRepository.matchStubByIndex(anyInt())).thenReturn(STUB_HTTP_LIFECYCLE_OPTIONAL); spyAjaxResourceContentHandler.handle(requestURI, mockRequest, mockHttpServletRequest, mockHttpServletResponse); verify(spyAjaxResourceContentHandler).throwErrorOnNonExistentResourceIndex(any(HttpServletResponse.class), stubIndexCaptor.capture()); verify(spyAjaxResourceContentHandler, times(1)).renderAjaxResponseContent(any(HttpServletResponse.class), stubTypeCaptor.capture(), fieldCaptor.capture(), any(StubHttpLifecycle.class)); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), anyInt(), anyString(), any(StubHttpLifecycle.class)); assertThat(stubIndexCaptor.getValue()).isEqualTo(15); assertThat(stubTypeCaptor.getValue()).isEqualTo(StubTypes.RESPONSE); assertThat(fieldCaptor.getValue()).isEqualTo("file"); } @Test public void verifyBehaviourWhenAjaxSubmittedToFetchStubbedSequencedResponseContent() throws Exception { final String requestURI = "/ajax/resource/15/response/8/file"; when(mockHttpServletRequest.getRequestURI()).thenReturn(requestURI); when(mockStubRepository.matchStubByIndex(anyInt())).thenReturn(STUB_HTTP_LIFECYCLE_OPTIONAL); spyAjaxResourceContentHandler.handle(requestURI, mockRequest, mockHttpServletRequest, mockHttpServletResponse); verify(spyAjaxResourceContentHandler).throwErrorOnNonExistentResourceIndex(any(HttpServletResponse.class), stubIndexCaptor.capture()); verify(spyAjaxResourceContentHandler, times(1)).renderAjaxResponseContent(any(HttpServletResponse.class), responseSequenceCaptor.capture(), fieldCaptor.capture(), any(StubHttpLifecycle.class)); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), any(StubTypes.class), anyString(), any(StubHttpLifecycle.class)); assertThat(stubIndexCaptor.getValue()).isEqualTo(15); assertThat(responseSequenceCaptor.getValue()).isEqualTo(8); assertThat(fieldCaptor.getValue()).isEqualTo("file"); } @Test public void verifyBehaviourWhenAjaxSubmittedToFetchNonExistentStubbedSequencedResponseContent() throws Exception { expectedException.expect(IOException.class); expectedException.expectMessage("Resource does not exist for ID: 999"); final String requestURI = "/ajax/resource/999/response/8/file"; when(mockHttpServletRequest.getRequestURI()).thenReturn(requestURI); when(mockStubRepository.matchStubByIndex(999)).thenReturn(Optional.empty()); spyAjaxResourceContentHandler.handle(requestURI, mockRequest, mockHttpServletRequest, mockHttpServletResponse); verify(spyAjaxResourceContentHandler).throwErrorOnNonExistentResourceIndex(any(HttpServletResponse.class), stubIndexCaptor.capture()); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), anyInt(), anyString(), any(StubHttpLifecycle.class)); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), any(StubTypes.class), anyString(), any(StubHttpLifecycle.class)); } @Test public void verifyBehaviourWhenAjaxSubmittedToFetchContentForWrongStubType() throws Exception { final String requestURI = "/ajax/resource/5/WRONG-STUB-TYPE/post"; when(mockHttpServletRequest.getRequestURI()).thenReturn(requestURI); when(mockStubRepository.matchStubByIndex(anyInt())).thenReturn(STUB_HTTP_LIFECYCLE_OPTIONAL); spyAjaxResourceContentHandler.handle(requestURI, mockRequest, mockHttpServletRequest, mockHttpServletResponse); verify(spyAjaxResourceContentHandler, times(1)).throwErrorOnNonExistentResourceIndex(any(HttpServletResponse.class), anyInt()); verify(mockPrintWriter, times(1)).println("Could not fetch the content for stub type: WRONG-STUB-TYPE"); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), any(StubTypes.class), anyString(), any(StubHttpLifecycle.class)); verify(spyAjaxResourceContentHandler, never()).renderAjaxResponseContent(any(HttpServletResponse.class), anyInt(), anyString(), any(StubHttpLifecycle.class)); } }