package io.monokkel.actors;
import akka.actor.Props;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import io.monokkel.actors.domain.ThrottlerConfig;
import io.monokkel.core.*;
import io.monokkel.domain.UrlVisitResponse;
import io.monokkel.messages.SeedUrl;
import org.junit.Before;
import org.junit.Test;
import static java.lang.Thread.sleep;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
public class CrawlerActorWithThrottlerTest extends ActorTest {
private UrlVisitor mockedUrlVisitor;
private HtmlTransformer mockedHtmlTransformer;
private Indexer mockedIndexer;
private DataCleaner mockedDataCleaner;
private ThrottlerConfig throttlerConfig;
private DataValidator mockedValidator;
@Before
public void setUp() throws Exception {
mockedUrlVisitor = mock(UrlVisitor.class);
mockedHtmlTransformer = mock(HtmlTransformer.class);
mockedIndexer = mock(Indexer.class);
mockedDataCleaner = mock(DataCleaner.class);
mockedValidator = mock(DataValidator.class);
throttlerConfig = new ThrottlerConfig(1,1, false);
super.before();
}
@Test
public void onReceive_withManySeedUrls_expectOneUrlToBeVisitedAfterOneSecond() throws Exception {
String url = "http://url";
when(mockedUrlVisitor.visitUrlAndRespond(url)).thenReturn(createUrlVisitResponse(url));
subject.tell(new SeedUrl(1, url), javaTestKit.getRef());
subject.tell(new SeedUrl(1, "http://url2"), javaTestKit.getRef());
subject.tell(new SeedUrl(1, "http://url2"), javaTestKit.getRef());
subject.tell(new SeedUrl(1, "http://url2"), javaTestKit.getRef());
subject.tell(new SeedUrl(1, "http://url2"), javaTestKit.getRef());
sleep(1000L);
verify(mockedUrlVisitor, times(1)).visitUrlAndRespond(anyString());
}
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>");
}
@Override
protected String getActorName() {
return "crawlerActor";
}
@Override
protected Props getActor() {
return CrawlerActor.props(mockedUrlVisitor, mockedIndexer, mockedDataCleaner, throttlerConfig, Lists.newArrayList(mockedHtmlTransformer), mockedValidator);
}
}