package io.monokkel.actors; import akka.actor.Props; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import io.monokkel.core.HtmlTransformer; import io.monokkel.domain.PageData; import io.monokkel.exceptions.ParseException; import io.monokkel.messages.ParserDone; import io.monokkel.messages.builders.ParseResponseBuilder; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.mockito.internal.util.collections.Sets; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static akka.testkit.JavaTestKit.duration; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class ParserActorTest extends ActorTest { private HtmlTransformer mockedHtmlTransformer; @Before public void before(){ mockedHtmlTransformer = mock(HtmlTransformer.class); super.before(); } @Override protected String getActorName() { return "parserActor"; } @Test public void onMessage_withUrlAndResponse_expectResponseToBePresentInParserDone() throws ParseException { final String expectedResponse = "Passed Response String"; setupMockAndSendMessageToParserActor("title", "http://expectedUrl", expectedResponse, 1L, Sets.newSet("http://url1", "http://url2"), true); final ParserDone parserDone = getParserDone(); final String actualResponse = parserDone.getResponse(); assertEquals(expectedResponse,actualResponse); } @Test public void onMessage_withUrlAndResponse_expectUrlToBePresentInParserDone() throws ParseException { final String expectedUrl = "http://expectedUrl"; setupMockAndSendMessageToParserActor("title", expectedUrl, "Passed Response String", 1L, Sets.newSet("http://url1", "http://url2"), true); final ParserDone parserDone = getParserDone(); final String actualUrl = parserDone.getUrl(); assertEquals(expectedUrl,actualUrl); } @Test public void onMessage_withUrlAndResponse_expectTimestampToBePresentInParserDone() throws ParseException { final Long expectedTimeStamp = 1L; setupMockAndSendMessageToParserActor("title", "http://expectedUrl", "Passed Response String", expectedTimeStamp, Sets.newSet("http://url1", "http://url2"), true); final ParserDone parserDone = getParserDone(); final Long actualTimeStamp = parserDone.getTimeStamp(); assertEquals(expectedTimeStamp, actualTimeStamp); } @Test public void onMessage_withUrlAndResponse_expectUrlSeteToBePresentInParserDone() throws ParseException { final Set<String> expectedUrlSet = Sets.newSet("http://url1","http://url2"); setupMockAndSendMessageToParserActor("title", "http://expectedUrl", "Passed Response String", 1L, expectedUrlSet, true); final ParserDone parserDone = getParserDone(); final Set<String> actualUrlSet = parserDone.getUrlSet(); assertEquals(expectedUrlSet, actualUrlSet); } @Test public void onMessage_withUrlAndResponse_expectTitleToBePresentInParserDone() throws ParseException { final String expectedTitle = "title"; setupMockAndSendMessageToParserActor(expectedTitle, "http://expectedUrl", "Passed Response String", 1L, Sets.newSet("http://url1", "http://url2"), true); final ParserDone parserDone = getParserDone(); final String actualTitle = parserDone.getTitle(); assertEquals(expectedTitle, actualTitle); } @Test public void onMessage_withResponseThatCanNotBeParsed_expectParserNotToAnswer() throws ParseException { setupMockAndSendMessageToParserActor("title", "http://expectedUrl", "Passed Response String", 1L, Sets.newSet("http://url1", "http://url2"), false); javaTestKit.expectNoMsg(duration("1 second")); } private void setupMockAndSendMessageToParserActor(String expectedTitle, String expectedUrl, String expectedResponse, Long expectedTimeStamp, Set<String> visitedList, final boolean shouldBeParsed) throws ParseException { when(mockedHtmlTransformer.shouldParse(Mockito.anyString(),Mockito.anyString(),Mockito.anyList())).thenReturn(shouldBeParsed); when(mockedHtmlTransformer.parse(expectedUrl, expectedResponse, expectedTimeStamp)).thenReturn(new PageData(visitedList, expectedUrl, expectedTimeStamp, expectedResponse,expectedTitle,"",null)); subject.tell(new ParseResponseBuilder().setResponse(expectedResponse).setUrl(expectedUrl).setTimeStamp(expectedTimeStamp).setDepth(0).setMaxDepth(1).setTypesFromTheResponseHeader(ImmutableList.of("application/json")).createParseResponse(),javaTestKit.getRef()); } @Override protected Props getActor() { return ParserActor.props(mockedHtmlTransformer); } private ParserDone getParserDone() { final List<Object> messages = Lists.newArrayList(javaTestKit.receiveN(1, duration("1 second"))); final List<ParserDone> unparsedResponses = messages.stream().filter(m -> m instanceof ParserDone).map(e -> (ParserDone) e).collect(Collectors.toList()); return unparsedResponses.get(0); } }