package com.anaplan.connector.unit; import com.anaplan.client.*; import com.anaplan.client.transport.AnaplanAPITransportException; import com.anaplan.client.transport.ApacheHttpProvider; import com.anaplan.client.transport.TransportProvider; import com.anaplan.client.transport.TransportProviderFactory; import com.anaplan.connector.connection.AnaplanConnection; import com.anaplan.connector.utils.AnaplanUtil; import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.HashMap; import java.util.Map; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; @RunWith(PowerMockRunner.class) @PowerMockIgnore("javax.management.*") @PrepareForTest({ AnaplanConnection.class, ApacheHttpProvider.class, Service.class, TransportProvider.class, TransportProviderFactory.class, URI.class, Workspace.class, Model.class, AnaplanUtil.class, Credentials.class, TaskStatus.class, TaskResult.class}) public abstract class BaseUnitTestDriver { private static Map<String, byte[]> fixtures = new HashMap<>(); protected TransportProvider mockTransportProvider; private static InputStream configStream; protected TransportProviderFactory mockTransportProviderFactory; protected static ResourceBundle properties; protected Service mockService; protected URI serviceUri; protected AnaplanConnection mockAnaplanConnection; protected static final String sampleProperties = "test.properties"; protected static final String workspacesResponseFile = "workspaces_response.json"; protected static final String modelsResponseFile = "models_response.json"; protected static final String sampleDataFilePath = "sample_data.csv"; protected String sampleDataFile; protected byte[] workspacesResponse; protected String apiUrl; protected static final String contentType = "application/json"; protected static final String createTaskResponseFile = "createTask_response.json"; protected static final String filesResponseFile = "files_response.json"; protected TaskStatus mockStatus; protected TaskResult mockTaskResult; @Rule protected ExpectedException expectedEx = ExpectedException.none(); static { configStream = BaseUnitTestDriver.class.getClassLoader() .getResourceAsStream(sampleProperties); try { properties = new PropertyResourceBundle( BaseUnitTestDriver.class.getClassLoader() .getResourceAsStream(sampleProperties)); properties = new PropertyResourceBundle(configStream); } catch (IOException e) { throw new RuntimeException("Failed to load properties!"); } } protected static final String workspaceUrlPathToken = properties.getString( "workspace.urlPathToken"); // API v1.3 protected static final String modelUrlPathToken = properties.getString( "model.urlPathToken"); protected static final String workspaceId = properties.getString( "anaplan.workspaceId"); protected static final String modelId = properties.getString( "anaplan.modelId"); protected static final String certificatePath = properties.getString( "certificate.path"); @Before public void setUpBase() { try { sampleDataFile = new String(getFixture(sampleDataFilePath)); mockAnaplanConnection = Mockito.mock(AnaplanConnection.class); apiUrl = properties.getString("anaplan.apiUrl"); serviceUri = new URI(apiUrl); workspacesResponse = getFixture(workspacesResponseFile); mockTransportProvider = Mockito.mock(ApacheHttpProvider.class); mockStatus = Mockito.mock(TaskStatus.class); mockTaskResult = Mockito.mock(TaskResult.class); mockTransportProviderFactory = Mockito.mock(TransportProviderFactory.class); mockService = PowerMockito.spy(new Service(serviceUri)); PowerMockito.whenNew(URI.class) .withArguments(apiUrl) .thenReturn(serviceUri); PowerMockito.whenNew(Service.class) .withArguments(serviceUri) .thenReturn(mockService); recordActionsFetchMockTransportProvider(); recordActionsFetchMockWorkspaces(); } catch (Exception e) { throw new RuntimeException(e); } } @After public void tearDownBase() throws IOException { Mockito.reset(mockTransportProvider); Mockito.reset(mockTransportProviderFactory); Mockito.reset(mockService); Mockito.reset(mockAnaplanConnection); Mockito.reset(mockStatus); Mockito.reset(mockTaskResult); } /** * Lazily loads fixtures. * @param fixtureName Name of the file to load. * @return Fixture data as a Byte array * @throws IOException */ protected byte[] getFixture(String fixtureName) { InputStream fixtureStream; if (!fixtures.containsKey(fixtureName)) { fixtureStream = getClass().getClassLoader().getResourceAsStream( fixtureName); byte[] streamBytes; try { streamBytes = IOUtils.toByteArray(fixtureStream); } catch (IOException e) { throw new RuntimeException("Could not convert to Byte array!", e); } fixtures.put(fixtureName, streamBytes); } return fixtures.get(fixtureName); } protected void setupMockConnection() throws Exception { PowerMockito.doReturn(mockService) .when(mockAnaplanConnection) .getConnection(); mockService.setServiceCredentials(Mockito.mock(Credentials.class)); } protected void recordActionsFetchMockTransportProvider() throws AnaplanAPITransportException { PowerMockito.mockStatic(TransportProviderFactory.class); Mockito.when(TransportProviderFactory.getInstance()) .thenReturn(mockTransportProviderFactory); PowerMockito.doReturn(mockTransportProvider) .when(mockTransportProviderFactory) .createDefaultProvider(); } protected void recordActionsFetchMockWorkspaces() throws AnaplanAPITransportException, IOException { PowerMockito.doReturn(workspacesResponse) .when(mockTransportProvider) .get(workspaceUrlPathToken, "application/json"); } protected void recordActionsFetchMockWorkspaceFail() throws AnaplanAPITransportException, IOException { PowerMockito.doThrow(new AnaplanAPITransportException("Test exception")) .when(mockTransportProvider) .get(workspaceUrlPathToken, "application/json"); } protected void recordActionsFetchWorkspacesEmptyResult() throws AnaplanAPITransportException, IOException { PowerMockito.doReturn(IOUtils.toByteArray("[]")) .when(mockTransportProvider) .get(workspaceUrlPathToken, "application/json"); } protected void recordActionsFetchMockModels() throws Exception { String uriToken = workspaceUrlPathToken + properties.getString("anaplan.workspaceId") + "/models"; PowerMockito.doReturn(getFixture(modelsResponseFile)) .when(mockTransportProvider) .get(uriToken, "application/json"); } protected void recordActionsTaskResultSuccess() { PowerMockito.doReturn(TaskStatus.State.COMPLETE).when(mockStatus) .getTaskState(); PowerMockito.doReturn(mockTaskResult).when(mockStatus).getResult(); PowerMockito.doReturn(true).when(mockTaskResult).isSuccessful(); } protected void recordActionsTaskResultFailure() { PowerMockito.doReturn(TaskStatus.State.COMPLETE).when(mockStatus) .getTaskState(); PowerMockito.doReturn(mockTaskResult).when(mockStatus).getResult(); PowerMockito.doReturn(false).when(mockTaskResult).isSuccessful(); } protected void recordActionsFetchMockItems(String entityName, String fixtureName) throws Exception { PowerMockito.doReturn(getFixture(fixtureName)) .when(mockTransportProvider) .get(modelUrlPathToken + "/" + entityName, "application/json"); } protected void recordActionsRunServerTask(String urlPathToken) throws Exception { String taskParamsJson = "{\"localeName\":\"en_US\"}"; PowerMockito.doReturn(getFixture(createTaskResponseFile)) .when(mockTransportProvider) .post(urlPathToken + "/tasks", taskParamsJson.getBytes(), contentType, contentType); PowerMockito.mockStatic(AnaplanUtil.class); Mockito.when(AnaplanUtil.runServerTask(Mockito.any(Task.class))) .thenReturn(mockStatus); } }