package io.monokkel.actors;
import akka.actor.PoisonPill;
import akka.actor.Props;
import io.monokkel.messages.StartElastic;
import org.elasticsearch.node.Node;
import org.elasticsearch.node.NodeBuilder;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({NodeBuilder.class})
public class ElasticNodeActorTest extends ActorTest {
@Before
public void before(){
super.before();
}
@Test
public void onReceive_with_expect() throws Exception {
mockStatic(NodeBuilder.class);
NodeBuilder mockedNode = createNodeBuilder();
subject.tell(new StartElastic(),javaTestKit.getRef());
Thread.sleep(1000L);
verify(mockedNode, times(1)).node();
}
@Test
public void postRestart() throws Exception {
}
@Test
public void postStop_withNodeInitialized_expectNodeToBeClosed() throws Exception {
mockStatic(NodeBuilder.class);
NodeBuilder mockedNodeBuilder = createNodeBuilder();
Node mockedNode = mock(Node.class);
when(mockedNodeBuilder.node()).thenReturn(mockedNode);
subject.tell(new StartElastic(),javaTestKit.getRef());
subject.tell(PoisonPill.getInstance(),javaTestKit.getRef());
Thread.sleep(1000L);
verify(mockedNode,times(1)).close();
}
@Test
public void postStop_withNoNodeInitialized_expectActorShutdownToNotFail() throws Exception {
mockStatic(NodeBuilder.class);
NodeBuilder mockedNodeBuilder = createNodeBuilder();
Node mockedNode = mock(Node.class);
when(mockedNodeBuilder.node()).thenReturn(mockedNode);
subject.tell(PoisonPill.getInstance(),javaTestKit.getRef());
Thread.sleep(1000L);
}
@Test
public void postStop_withNodeFailingToBeCreated_expectActorShutdownToNotFail() throws Exception {
mockStatic(NodeBuilder.class);
NodeBuilder mockedNodeBuilder = createNodeBuilder();
Node mockedNode = mock(Node.class);
when(mockedNodeBuilder.node()).thenThrow(new RuntimeException()).thenReturn(mockedNode);
subject.tell(new StartElastic(),javaTestKit.getRef());
Thread.sleep(1000L);
verify(mockedNodeBuilder,times(2)).node();
}
@Override
protected String getActorName() {
return "ElasticNodeActor";
}
@Override
protected Props getActor() {
return ElasticNodeActor.props();
}
private NodeBuilder createNodeBuilder() {
NodeBuilder mockedNode = mock(NodeBuilder.class);
when(NodeBuilder.nodeBuilder()).thenReturn(mockedNode);
return mockedNode;
}
}