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