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