package io.monokkel.actors;
import akka.actor.Props;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import io.monokkel.core.UrlVisitor;
import io.monokkel.domain.UrlVisitResponse;
import io.monokkel.exceptions.UrlVisitException;
import io.monokkel.messages.UnparsedResponse;
import io.monokkel.messages.VisitUrl;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import java.util.stream.Collectors;
import static akka.testkit.JavaTestKit.duration;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Created by tarjei on 07/06/14.
*/
public class UrlVisitorActorTest extends ActorTest{
public static final int DEFAULT_DEPTH = 0;
public static final int MAX_DEPTH = 1;
private UrlVisitor mockedUrlVisitor;
@Before
public void before() {
mockedUrlVisitor = mock(UrlVisitor.class);
super.before();
}
@Override
protected String getActorName() {
return "urlVisitorActor";
}
@Override
public Props getActor() {
return UrlVisitorActor.props(mockedUrlVisitor);
}
@Test
public void onMessage_withMockedUrlVisitor_expectResponseToBeReceived() throws UrlVisitException {
String expectedResponse = "Expected html response";
when(mockedUrlVisitor.visitUrlAndRespond("url")).thenReturn(createUrlVisitResponse("url",expectedResponse));
subject.tell(new VisitUrl("url", DEFAULT_DEPTH, MAX_DEPTH),javaTestKit.getRef());
final UnparsedResponse unparsedResponse = getUnparsedResponseMessage();
final String response = unparsedResponse.getResponse();
assertEquals(expectedResponse, response);
}
@Test
public void onMessage_withMockedUrlVisitor_expectUrlToBeReceived() throws UrlVisitException {
final String expectedUrl = "url";
when(mockedUrlVisitor.visitUrlAndRespond(expectedUrl)).thenReturn(createUrlVisitResponse(expectedUrl));
subject.tell(new VisitUrl(expectedUrl, DEFAULT_DEPTH, MAX_DEPTH),javaTestKit.getRef());
final UnparsedResponse unparsedResponse = getUnparsedResponseMessage();
final String actualUrl = unparsedResponse.getUrl();
assertEquals(expectedUrl, actualUrl);
}
@Test
public void onMessage_withMockedUrlVisitor_expectTimeStampToBeSet() throws UrlVisitException {
when(mockedUrlVisitor.visitUrlAndRespond("url")).thenReturn(createUrlVisitResponse("url"));
subject.tell(new VisitUrl("url", DEFAULT_DEPTH, MAX_DEPTH),javaTestKit.getRef());
final UnparsedResponse unparsedResponse = getUnparsedResponseMessage();
final Long timeStamp = unparsedResponse.getTimeStamp();
assertTrue(timeStamp > 0);
}
private UrlVisitResponse createUrlVisitResponse(String url,String response,Long timestamp) {
return new UrlVisitResponse(response, 200, ImmutableList.of("application/json"), timestamp, url);
}
private UrlVisitResponse createUrlVisitResponse(String url,String response) {
return createUrlVisitResponse(url,response,1L);
}
private UrlVisitResponse createUrlVisitResponse(String url) {
return createUrlVisitResponse(url,"<html><body></body></html>");
}
private UnparsedResponse getUnparsedResponseMessage() {
final List<Object> messages = Lists.newArrayList(javaTestKit.receiveN(1, duration("1 second")));
final List<UnparsedResponse> unparsedResponses = messages.stream().filter(m -> m instanceof UnparsedResponse).map(e -> (UnparsedResponse) e).collect(Collectors.toList());
return unparsedResponses.get(0);
}
}