package io.monokkel.core; import com.google.common.collect.ImmutableList; import io.monokkel.core.domain.ResponseFeedback; import io.monokkel.domain.UrlVisitResponse; import io.monokkel.exceptions.UrlVisitException; import io.monokkel.factories.HttpClient4Builder; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.io.IOException; import java.util.List; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; public class UrlVisitorTest { @Test public void visitUrlAndRespond_withSingleUrl_expectExpectExecuteToBeCalled() throws IOException, UrlVisitException { final HttpClient4Builder mockedHttpClient4Builder = mock(HttpClient4Builder.class); final CloseableHttpClient mockedClosableHttpClient = mock(CloseableHttpClient.class); when(mockedHttpClient4Builder.buildClientBuilder()).thenReturn(mockedClosableHttpClient); when(mockedClosableHttpClient.execute(Mockito.any(HttpGet.class),Matchers.<ResponseHandler<ResponseFeedback>>any())).thenReturn(new ResponseFeedback("",1,ImmutableList.of(""))); UrlVisitor urlVisitor = new UrlVisitor(mockedHttpClient4Builder); urlVisitor.visitUrlAndRespond("http://url"); verify(mockedClosableHttpClient, times(1)).execute(any(HttpGet.class), any(ResponseHandler.class)); } @Test public void visitUrlAndRespond_withResponseThatContainBody_expectResponseBodyToBeFound() throws IOException, UrlVisitException { final String expectedResponseBody = "Response body"; UrlVisitor urlVisitor = new UrlVisitor(setupCrawlerTask(expectedResponseBody)); final UrlVisitResponse urlVisitResponse = urlVisitor.visitUrlAndRespond("http://rul"); final String actualResponse = urlVisitResponse.getResponse(); assertEquals(expectedResponseBody, actualResponse); } @Test public void visitUrlAndRespond_withResponseThatStatusCode200_expectStatusCodeToBeFound() throws IOException, UrlVisitException { final Integer expectedStatus = 200; UrlVisitor urlVisitor = new UrlVisitor(setupCrawlerTask("Response body", expectedStatus, ImmutableList.of("test"))); final UrlVisitResponse urlVisitResponse = urlVisitor.visitUrlAndRespond("http://rul"); final Integer actualStatusCode = urlVisitResponse.getHttpStatus(); assertEquals(expectedStatus, actualStatusCode); } @Test public void visitUrlAndRespond_withResponseThatHaveJsonType_expectApplictaionTypeToBeFound() throws IOException, UrlVisitException { final ImmutableList<String> expectedTypes = ImmutableList.of("application/type"); UrlVisitor urlVisitor = new UrlVisitor(setupCrawlerTask("Response body", 200, expectedTypes)); final UrlVisitResponse urlVisitResponse = urlVisitor.visitUrlAndRespond("http://rul"); final List<String> typesFromTheResponseHeader = urlVisitResponse.getTypesFromTheResponseHeader(); assertEquals(expectedTypes,typesFromTheResponseHeader); } @Test public void visitUrlAndRespond_withResponseThatContainsUrl_expectUrlToBeFound() throws IOException, UrlVisitException { final String expectedUrl = "http://url"; UrlVisitor urlVisitor = new UrlVisitor(setupCrawlerTask("Response")); final UrlVisitResponse urlVisitResponse = urlVisitor.visitUrlAndRespond(expectedUrl); final String actualUrl = urlVisitResponse.getUrl(); assertEquals(expectedUrl, actualUrl); } private HttpClient4Builder setupCrawlerTask(final String expectedResponseBody) throws IOException { return setupCrawlerTask(expectedResponseBody, 200, ImmutableList.of("json")); } private HttpClient4Builder setupCrawlerTask(final String expectedResponseBody, final Integer expectedStatus, final List<String> types) throws IOException { final HttpClient4Builder mockedHttpClient4Builder = mock(HttpClient4Builder.class); final CloseableHttpClient mockedClosableHttpClient = mock(CloseableHttpClient.class); when(mockedHttpClient4Builder.buildClientBuilder()).thenReturn(mockedClosableHttpClient); when(mockedClosableHttpClient.execute(Mockito.any(HttpGet.class), Matchers.<ResponseHandler<ResponseFeedback>>any())).thenReturn(new ResponseFeedback(expectedResponseBody, expectedStatus, types)); return mockedHttpClient4Builder; } }