//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.core.web.servlets;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import uk.gov.dstl.baleen.core.pipelines.BaleenPipeline;
import uk.gov.dstl.baleen.core.pipelines.BaleenPipelineManager;
import uk.gov.dstl.baleen.core.pipelines.orderers.NoOpOrderer;
import uk.gov.dstl.baleen.exceptions.BaleenException;
import uk.gov.dstl.baleen.testing.DummyCollectionReader;
import uk.gov.dstl.baleen.testing.servlets.ServletCaller;
/**
* Tests for {@link PipelineManagerServlet}.
*/
@RunWith(MockitoJUnitRunner.Silent.class)
public class PipelineManagerServletTest {
private static final String ROOT = "/api/1/pipelines";
private static final String PAUSE = ROOT + "/pause";
private static final String UNPAUSE = ROOT + "/unpause";
private static final String REAL = "real";
private static final String NAME = "name";
private static final String MISSING = "missing";
@Mock
BaleenPipelineManager pipelineManager;
BaleenPipeline realPipeline;
@Mock
BaleenPipeline mockPipeline;
@Before
public void before() {
realPipeline = new BaleenPipeline(REAL, "", new NoOpOrderer(), new DummyCollectionReader(), Collections.emptyList(), Collections.emptyList());
doReturn(true).when(pipelineManager).has(REAL);
doReturn(Optional.of(realPipeline)).when(pipelineManager).get(REAL);
doReturn(Collections.singleton(realPipeline)).when(pipelineManager).getAll();
doReturn(Optional.empty()).when(pipelineManager).get(MISSING);
doReturn(Optional.of(mockPipeline)).when(pipelineManager).get("mock");
doReturn("pipeline-name").when(mockPipeline).getName();
doReturn(false).when(mockPipeline).isPaused();
}
@Test
public void testGetWithName() throws Exception {
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, REAL);
caller.doGet(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
verify(pipelineManager).get(REAL);
// Poor check that the
assertTrue(caller.getResponseBody().contains(REAL));
}
@Test
public void testGetWithNames() throws Exception {
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, REAL, MISSING);
caller.doGet(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
assertEquals(1, caller.getJSONResponse(List.class).size());
}
@Test
public void testGetWithNoNames() throws Exception {
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, new String[] {});
caller.doGet(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
ServletCaller nullCaller = new ServletCaller();
caller.setRequestUri(ROOT);
nullCaller.addParameter(NAME, (String) null);
nullCaller.doGet(new PipelineManagerServlet(pipelineManager));
assertEquals(200, nullCaller.getResponseStatus().intValue());
ServletCaller nullArrayCaller = new ServletCaller();
caller.setRequestUri(ROOT);
nullArrayCaller.addParameter(NAME, (String[]) null);
nullArrayCaller.doGet(new PipelineManagerServlet(pipelineManager));
assertEquals(200, nullArrayCaller.getResponseStatus().intValue());
}
@Test
public void testGetAll() throws Exception {
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.doGet(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
verify(pipelineManager).getAll();
assertTrue(caller.getResponseBody().contains(REAL));
}
@Test
public void testPostForCreate() throws Exception {
String yaml = "yaml";
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, "new");
caller.addParameter("yaml", yaml);
caller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
verify(pipelineManager).create("new", yaml);
}
@Test
public void testPostForCreateWithSameName() throws Exception {
String yaml = "yaml";
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, REAL);
caller.addParameter("yaml", yaml);
caller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(400, caller.getSentError().intValue());
verify(pipelineManager, never()).create(REAL, yaml);
}
@Test
public void testPostForCreateWithInvalid() throws Exception {
String yaml = "yaml";
ServletCaller missingNameCaller = new ServletCaller();
missingNameCaller.setRequestUri(ROOT);
missingNameCaller.addParameter("yaml", yaml);
missingNameCaller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(400, missingNameCaller.getSentError().intValue());
verify(pipelineManager, never()).create(anyString(), anyString());
ServletCaller missingYamlCaller = new ServletCaller();
missingYamlCaller.setRequestUri(ROOT);
missingYamlCaller.addParameter(NAME, NAME);
missingYamlCaller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(400, missingYamlCaller.getSentError().intValue());
verify(pipelineManager, never()).create(anyString(), anyString());
ServletCaller emptyYamlCaller = new ServletCaller();
emptyYamlCaller.setRequestUri(ROOT);
emptyYamlCaller.addParameter(NAME, NAME);
emptyYamlCaller.addParameter("yaml", "");
emptyYamlCaller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(400, missingYamlCaller.getSentError().intValue());
verify(pipelineManager, never()).create(anyString(), anyString());
ServletCaller emptyNameCaller = new ServletCaller();
emptyNameCaller.setRequestUri(ROOT);
emptyNameCaller.addParameter(NAME, NAME);
emptyNameCaller.addParameter("yaml", "");
emptyNameCaller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(400, emptyNameCaller.getSentError().intValue());
verify(pipelineManager, never()).create(anyString(), anyString());
}
@Test
public void testPostCreationFailure() throws Exception {
doThrow(BaleenException.class).when(pipelineManager).create(anyString(), anyString());
String yaml = "yaml";
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, yaml);
caller.addParameter("yaml", yaml);
caller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(400, caller.getSentError().intValue());
}
@Test
public void testPause() throws Exception {
assertEquals(false, realPipeline.isPaused());
ServletCaller caller = new ServletCaller();
caller.setRequestUri(PAUSE);
caller.addParameter(NAME, REAL);
caller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
assertEquals(true, realPipeline.isPaused());
}
@Test
public void testUnpause() throws Exception {
realPipeline.pause();
assertEquals(true, realPipeline.isPaused());
ServletCaller caller = new ServletCaller();
caller.setRequestUri(UNPAUSE);
caller.addParameter(NAME, REAL);
caller.doPost(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
assertEquals(false, realPipeline.isPaused());
}
@Test
public void testDelete() throws Exception {
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.addParameter(NAME, "mock");
caller.doDelete(new PipelineManagerServlet(pipelineManager));
assertEquals(200, caller.getResponseStatus().intValue());
}
@Test
public void testDeleteMissingName() throws Exception {
ServletCaller caller = new ServletCaller();
caller.setRequestUri(ROOT);
caller.doDelete(new PipelineManagerServlet(pipelineManager));
assertEquals(400, caller.getSentError().intValue());
ServletCaller emptyCaller = new ServletCaller();
caller.setRequestUri(ROOT);
emptyCaller.addParameter(NAME, new String[] {});
emptyCaller.doDelete(new PipelineManagerServlet(pipelineManager));
assertEquals(400, caller.getSentError().intValue());
}
}