package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.reporting; import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; import com.jaspersoft.jasperserver.jaxrs.client.dto.reports.ExportExecutionDescriptor; import com.jaspersoft.jasperserver.jaxrs.client.dto.reports.ExportExecutionOptions; import com.jaspersoft.jasperserver.jaxrs.client.dto.reports.ReportExecutionDescriptor; import com.jaspersoft.jasperserver.jaxrs.client.dto.reports.ReportExecutionStatusEntity; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.internal.util.reflection.Whitebox; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockTestCase; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.concurrent.atomic.AtomicInteger; import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.doReturn; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.spy; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.mockito.PowerMockito.whenNew; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertSame; /** * Unit tests for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.reporting.ReportExecutionRequestBuilder} * * @author Alexander Krasnyanskiy */ @PrepareForTest({JerseyRequest.class, ReportExecutionRequestBuilder.class, ReportExecutionStatusEntity.class}) public class ReportExecutionRequestBuilderTest extends PowerMockTestCase { @Mock private SessionStorage sessionStorageMock; @Mock private ExportExecutionOptions optionsMock; @Mock private ReportExecutionStatusEntity statusEntityMock; @Mock private JerseyRequest<ReportExecutionStatusEntity> requestMock; @Mock private JerseyRequest<ReportExecutionDescriptor> reportExecutionDescriptorJerseyRequestMock; @Mock private JerseyRequest<ExportExecutionDescriptor> exportExecutionDescriptorJerseyRequestMock; @Mock private JerseyRequest<ReportExecutionStatusEntity> reportExecutionStatusEntityJerseyRequestMock; @Mock private OperationResult<ReportExecutionStatusEntity> resultMock; @Mock private OperationResult<ReportExecutionDescriptor> reportExecutionDescriptorOperationResultMock; @Mock private OperationResult<ExportExecutionDescriptor> exportExecutionDescriptorOperationResultMock; @Mock private OperationResult<ReportExecutionStatusEntity> reportExecutionStatusEntityOperationResultMock; @BeforeMethod public void before() { initMocks(this); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.reporting.ReportExecutionRequestBuilder#asyncStatus(com.jaspersoft.jasperserver.jaxrs.client.core.Callback)} */ public void should_return_ReportExecution_instance_with_proper_Future() throws InterruptedException { /* Given */ final AtomicInteger newThreadId = new AtomicInteger(); int currentThreadId = (int) Thread.currentThread().getId(); mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ReportExecutionStatusEntity.class), eq(new String[]{"reportExecutions", "requestId", "status"}))).thenReturn(requestMock); ReportExecutionRequestBuilder builderSpy = PowerMockito.spy(new ReportExecutionRequestBuilder(sessionStorageMock, "requestId")); Callback<OperationResult<ReportExecutionStatusEntity>, Void> callback = spy(new Callback<OperationResult<ReportExecutionStatusEntity>, Void>() { @Override public Void execute(OperationResult<ReportExecutionStatusEntity> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(resultMock).when(requestMock).get(); doReturn(null).when(callback).execute(resultMock); /* When */ RequestExecution retrieved = builderSpy.asyncStatus(callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(resultMock); verify(requestMock, times(1)).get(); //verifyStatic(times(1)); //buildRequest(eq(storageMock), eq(ReportExecutionStatusEntity.class), eq(new String[]{"/reportExecutions", "requestId", "/status"})); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.reporting.ReportExecutionRequestBuilder#asyncExecutionDetails(com.jaspersoft.jasperserver.jaxrs.client.core.Callback)} */ public void should_retrieve_proper_ReportExecutionDescriptor_in_separate_thread() throws InterruptedException { /* Given */ final AtomicInteger newThreadId = new AtomicInteger(); int currentThreadId = (int) Thread.currentThread().getId(); mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ReportExecutionDescriptor.class), eq(new String[]{"reportExecutions", "requestId"}))).thenReturn(reportExecutionDescriptorJerseyRequestMock); ReportExecutionRequestBuilder builderSpy = PowerMockito.spy(new ReportExecutionRequestBuilder(sessionStorageMock, "requestId")); Callback<OperationResult<ReportExecutionDescriptor>, Void> callback = spy(new Callback<OperationResult<ReportExecutionDescriptor>, Void>() { @Override public Void execute(OperationResult<ReportExecutionDescriptor> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(reportExecutionDescriptorOperationResultMock).when(reportExecutionDescriptorJerseyRequestMock).get(); doReturn(null).when(callback).execute(reportExecutionDescriptorOperationResultMock); /* When */ RequestExecution retrieved = builderSpy.asyncExecutionDetails(callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(reportExecutionDescriptorOperationResultMock); verify(reportExecutionDescriptorJerseyRequestMock, times(1)).get(); // todo: please find out the way to verify invocation of static protectedMethod //verifyStatic(times(1)); //buildRequest(eq(storageMock), eq(ReportExecutionDescriptor.class), eq(new String[]{"/reportExecutions", "requestId"})); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.reporting.ReportExecutionRequestBuilder#asyncRunExport(com.jaspersoft.jasperserver.jaxrs.client.dto.reports.ExportExecutionOptions, com.jaspersoft.jasperserver.jaxrs.client.core.Callback)} */ public void should_send_ExportExecutionOptions_asynchronously_and_return_proper_RequestExecution_instance() throws InterruptedException { /* Given */ final AtomicInteger newThreadId = new AtomicInteger(); int currentThreadId = (int) Thread.currentThread().getId(); mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ExportExecutionDescriptor.class), eq(new String[]{"reportExecutions", "requestId", "exports"}))).thenReturn(exportExecutionDescriptorJerseyRequestMock); ReportExecutionRequestBuilder builderSpy = PowerMockito.spy(new ReportExecutionRequestBuilder(sessionStorageMock, "requestId")); Callback<OperationResult<ExportExecutionDescriptor>, Void> callback = spy(new Callback<OperationResult<ExportExecutionDescriptor>, Void>() { @Override public Void execute(OperationResult<ExportExecutionDescriptor> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(exportExecutionDescriptorOperationResultMock).when(exportExecutionDescriptorJerseyRequestMock).post(optionsMock); doReturn(null).when(callback).execute(exportExecutionDescriptorOperationResultMock); /* When */ RequestExecution retrieved = builderSpy.asyncRunExport(optionsMock, callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(exportExecutionDescriptorOperationResultMock); verify(exportExecutionDescriptorJerseyRequestMock, times(1)).post(optionsMock); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.reporting.ReportExecutionRequestBuilder#asyncCancelExecution(com.jaspersoft.jasperserver.jaxrs.client.core.Callback)} */ public void should_cancel_execution_of_report_asynchronously() throws Exception { /* Given */ final AtomicInteger newThreadId = new AtomicInteger(); int currentThreadId = (int) Thread.currentThread().getId(); whenNew(ReportExecutionStatusEntity.class).withNoArguments().thenReturn(statusEntityMock); mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ReportExecutionStatusEntity.class), eq(new String[]{"reportExecutions", "requestId", "status"}))).thenReturn(reportExecutionStatusEntityJerseyRequestMock); ReportExecutionRequestBuilder builderSpy = PowerMockito.spy(new ReportExecutionRequestBuilder(sessionStorageMock, "requestId")); Callback<OperationResult<ReportExecutionStatusEntity>, Void> callback = spy(new Callback<OperationResult<ReportExecutionStatusEntity>, Void>() { @Override public Void execute(OperationResult<ReportExecutionStatusEntity> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(reportExecutionStatusEntityOperationResultMock).when(reportExecutionStatusEntityJerseyRequestMock).put(statusEntityMock); doReturn(null).when(callback).execute(reportExecutionStatusEntityOperationResultMock); /* When */ RequestExecution retrieved = builderSpy.asyncCancelExecution(callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(reportExecutionStatusEntityOperationResultMock); verify(reportExecutionStatusEntityJerseyRequestMock, times(1)).put(statusEntityMock); } @Test public void should_return_operation_result_with_proper_entity() { mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ReportExecutionStatusEntity.class), eq(new String[]{"reportExecutions", "requestId", "status"}))).thenReturn(reportExecutionStatusEntityJerseyRequestMock); doReturn(reportExecutionStatusEntityOperationResultMock).when(reportExecutionStatusEntityJerseyRequestMock).get(); ReportExecutionRequestBuilder builderSpy = PowerMockito.spy(new ReportExecutionRequestBuilder(sessionStorageMock, "requestId")); OperationResult<ReportExecutionStatusEntity> retrieved = builderSpy.status(); assertSame(retrieved, reportExecutionStatusEntityOperationResultMock); } @Test public void test_return_execution_details() { mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ReportExecutionDescriptor.class), eq(new String[]{"reportExecutions", "requestId"}))).thenReturn(reportExecutionDescriptorJerseyRequestMock); doReturn(reportExecutionDescriptorOperationResultMock).when(reportExecutionDescriptorJerseyRequestMock).get(); ReportExecutionRequestBuilder builderSpy = PowerMockito.spy(new ReportExecutionRequestBuilder(sessionStorageMock, "requestId")); OperationResult<ReportExecutionDescriptor> retrieved = builderSpy.executionDetails(); assertSame(retrieved, reportExecutionDescriptorOperationResultMock); } @Test public void test_cancel_execution() { ArgumentCaptor<ReportExecutionStatusEntity> captor = ArgumentCaptor.forClass(ReportExecutionStatusEntity.class); mockStatic(JerseyRequest.class); Mockito.when(buildRequest(eq(sessionStorageMock), eq(ReportExecutionStatusEntity.class), eq(new String[]{"reportExecutions", "requestId", "status"}))).thenReturn(reportExecutionStatusEntityJerseyRequestMock); Mockito.doReturn(resultMock).when(reportExecutionStatusEntityJerseyRequestMock).put(any(ReportExecutionStatusEntity.class)); ReportExecutionRequestBuilder builder = new ReportExecutionRequestBuilder(sessionStorageMock, "requestId"); OperationResult<ReportExecutionStatusEntity> retrieved = builder.cancelExecution(); assertSame(retrieved, resultMock); verifyStatic(); buildRequest(eq(sessionStorageMock), eq(ReportExecutionStatusEntity.class), eq(new String[]{"reportExecutions", "requestId", "status"})); verify(reportExecutionStatusEntityJerseyRequestMock).put(captor.capture()); assertEquals(captor.getValue().getValue(), "cancelled"); } @Test public void test_run_export_and_return_descriptor() { mockStatic(JerseyRequest.class); Mockito.when(buildRequest(eq(sessionStorageMock), eq(ExportExecutionDescriptor.class), eq(new String[]{"reportExecutions", "requestId", "exports"}))).thenReturn(exportExecutionDescriptorJerseyRequestMock); Mockito.doReturn(resultMock).when(exportExecutionDescriptorJerseyRequestMock).post(optionsMock); ReportExecutionRequestBuilder builder = new ReportExecutionRequestBuilder(sessionStorageMock, "requestId"); OperationResult<ExportExecutionDescriptor> retrieved = builder.runExport(optionsMock); verifyStatic(); buildRequest(eq(sessionStorageMock), eq(ExportExecutionDescriptor.class), eq(new String[]{"reportExecutions", "requestId", "exports"})); assertNotNull(retrieved); assertSame(retrieved, resultMock); } @Test public void should_set_export_id() { ReportExecutionRequestBuilder builder = new ReportExecutionRequestBuilder(sessionStorageMock, "requestId"); ExportExecutionRequestBuilder retrieved = builder.export("_id"); assertNotNull(retrieved); assertEquals(Whitebox.getInternalState(retrieved, "exportId"), "_id"); } @AfterMethod public void after() { reset(sessionStorageMock, optionsMock, requestMock, reportExecutionDescriptorJerseyRequestMock, exportExecutionDescriptorJerseyRequestMock, resultMock, reportExecutionDescriptorOperationResultMock, exportExecutionDescriptorOperationResultMock, reportExecutionStatusEntityJerseyRequestMock, reportExecutionStatusEntityOperationResultMock, statusEntityMock); } }