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