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;
}
}