package com.anaplan.connector.unit; import com.anaplan.client.ServerFile; import com.anaplan.connector.exceptions.AnaplanOperationException; import com.anaplan.connector.utils.AnaplanImportOperation; import com.anaplan.connector.utils.AnaplanUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; import static org.junit.Assert.assertEquals; @RunWith(PowerMockRunner.class) @PrepareForTest({ ServerFile.class}) public class ImportOperationUnitTestCases extends BaseUnitTestDriver { private static final String importId = properties.getString( "anaplan.importId"); private static final String csvColumnSeparator = properties.getString( "anaplan.columnSeparatorCOMMA"); private static final String csvDelimiter = properties.getString( "anaplan.delimiter"); private static final String importUrlPathToken = properties.getString( "import.urlPathToken"); private static final String dumpFileUrlPathToken = properties.getString( "dumpFile.urlPathToken"); private static final String importsResponse = "imports_response.json"; private static final String dumpFileResponse = "dump_file_response.csv"; private OutputStream mockOutputStream; private AnaplanImportOperation anaplanImportOperation; private ServerFile mockFailDumpServerFile; @Before public void setUp() throws Exception { mockOutputStream = Mockito.mock(FilterOutputStream.class); setupMockConnection(); anaplanImportOperation = new AnaplanImportOperation(mockAnaplanConnection); mockFailDumpServerFile = Mockito.mock(ServerFile.class); } @After public void tearDown() { Mockito.reset(mockOutputStream); Mockito.reset(mockFailDumpServerFile); } private void recordActionsFetchMockImports() throws Exception { PowerMockito.doReturn(getFixture(importsResponse)) .when(mockTransportProvider) .get(modelUrlPathToken + "/imports", contentType); } private void recordActionsImportTaskResultSuccess() { PowerMockito.doReturn(mockTaskResult).when(mockStatus).getResult(); PowerMockito.doReturn(null).when(mockTaskResult).getDetails(); PowerMockito.doReturn(false).when(mockTaskResult).isFailureDumpAvailable(); PowerMockito.doReturn(true).when(mockTaskResult).isSuccessful(); } private void recordActionsStrinkChunkReader() { PowerMockito.when(AnaplanUtil.stringChunkReader(Mockito.anyString())) .thenCallRealMethod(); PowerMockito.when(AnaplanUtil.stringChunkReader(Mockito.anyString(), Mockito.anyInt())).thenCallRealMethod(); } @Test public void testGoodImportCsv() throws Exception { // mock out API calls recordActionsFetchMockModels(); recordActionsFetchMockImports(); recordActionsFetchMockItems("files", filesResponseFile); recordActionsRunServerTask(importUrlPathToken); recordActionsImportTaskResultSuccess(); recordActionsStrinkChunkReader(); anaplanImportOperation.runImport(sampleDataFile, workspaceId, modelId, importId, csvColumnSeparator, csvDelimiter); } private void recordActionsImportTaskResultFailureDump() throws Exception { PowerMockito.doReturn(mockTaskResult).when(mockStatus).getResult(); PowerMockito.doReturn(null).when(mockTaskResult).getDetails(); PowerMockito.doReturn(true).when(mockTaskResult).isFailureDumpAvailable(); PowerMockito.doReturn(mockFailDumpServerFile) .when(mockTaskResult).getFailureDump(); InputStream dumpFileStream = new ByteArrayInputStream( getFixture(dumpFileResponse)); dumpFileStream.close(); PowerMockito.doReturn(dumpFileStream).when(mockFailDumpServerFile) .getDownloadStream(); } @Test public void testImportWithFailureDump() throws Exception { // mock out API calls recordActionsFetchMockModels(); recordActionsFetchMockImports(); recordActionsFetchMockItems("files", filesResponseFile); recordActionsRunServerTask(importUrlPathToken); recordActionsStrinkChunkReader(); recordActionsImportTaskResultFailureDump(); String response = anaplanImportOperation.runImport(sampleDataFile, workspaceId, modelId, importId, csvColumnSeparator, csvDelimiter); String expectedResponseMsg = "Operation ran successfully but with warnings!\n" + "Response Message:\nSome records were not imported: check " + "connector output data for details: importId\nDump File " + "contents:\n" + new String(getFixture(dumpFileResponse)); assertEquals(expectedResponseMsg, response); } @Test public void testErrorFetchingModelImport() throws Exception { // mock out API calls recordActionsFetchMockModels(); // setup Exception expectations expectedEx.expect(AnaplanOperationException.class); expectedEx.expectMessage("Error fetching Import action:"); anaplanImportOperation.runImport(sampleDataFile, workspaceId, modelId, importId, csvColumnSeparator, csvDelimiter); } @Test public void testFetchNullModelImport() throws Exception { // mock out API calls recordActionsFetchMockModels(); recordActionsFetchMockImports(); // setup Exception expectations expectedEx.expect(AnaplanOperationException.class); expectedEx.expectMessage("Invalid import ID provided: badImportId"); anaplanImportOperation.runImport(sampleDataFile, workspaceId, modelId, "badImportId", csvColumnSeparator, csvDelimiter); } @Test public void testErrorRunningTask() throws Exception { // mock out API calls recordActionsFetchMockModels(); recordActionsFetchMockImports(); recordActionsFetchMockItems("files", filesResponseFile); // setup Exception expectations expectedEx.expect(AnaplanOperationException.class); expectedEx.expectMessage("Error running Import action:"); anaplanImportOperation.runImport(sampleDataFile, workspaceId, modelId, importId, csvColumnSeparator, csvDelimiter); } }