package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources; import com.jaspersoft.jasperserver.dto.resources.ClientResourceListWrapper; 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.exceptions.handling.DefaultErrorHandler; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.internal.util.reflection.Whitebox; 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 javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import java.util.concurrent.ExecutionException; 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.doReturn; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; /** * Unit tests for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.BatchResourcesAdapter} */ @PrepareForTest(JerseyRequest.class) public class BatchResourcesAdapterTest extends PowerMockTestCase { @Mock private SessionStorage sessionStorageMock; @Mock private JerseyRequest<ClientResourceListWrapper> requestMock; @Mock private OperationResult<ClientResourceListWrapper> resultMock; @Mock private JerseyRequest<Object> objectJerseyRequestMock; @Mock private OperationResult<Object> objectOperationResultMock; @BeforeMethod public void before() { initMocks(this); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.BatchResourcesAdapter#parameter(com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.ResourceSearchParameter, String)} */ @SuppressWarnings("unchecked") public void should_set_parameter_of_adapter() { /** Given **/ BatchResourcesAdapter adapter = new BatchResourcesAdapter(sessionStorageMock); /** When **/ BatchResourcesAdapter retrieved = adapter.parameter(ResourceSearchParameter.FOLDER_URI, "uri_"); /** Then **/ assertSame(retrieved, adapter); MultivaluedMap<String, String> retrievedParams = (MultivaluedMap<String, String>) Whitebox.getInternalState(retrieved, "params"); String retrievedUri = retrievedParams.get("folderUri").get(0); assertSame(retrievedUri, "uri_"); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.BatchResourcesAdapter#search()} */ @SuppressWarnings("unchecked") public void should_invoke_all_private_logic_and_return_proper_operation_result() { /** Given **/ mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ClientResourceListWrapper.class), eq(new String[]{"resources"}), any(DefaultErrorHandler.class))).thenReturn(requestMock); doReturn(resultMock).when(requestMock).get(); BatchResourcesAdapter adapter = new BatchResourcesAdapter(sessionStorageMock); /** When **/ OperationResult<ClientResourceListWrapper> retrievedResult = adapter.search(); /** Then **/ assertNotNull(retrievedResult); assertSame(retrievedResult, resultMock); verifyStatic(); buildRequest(eq(sessionStorageMock), eq(ClientResourceListWrapper.class), eq(new String[]{"resources"}), any(DefaultErrorHandler.class)); verify(requestMock).get(); verify(requestMock).addParams(any(MultivaluedHashMap.class)); verifyNoMoreInteractions(resultMock); } @Test (enabled = false) /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.BatchResourcesAdapter#asyncSearch(com.jaspersoft.jasperserver.jaxrs.client.core.Callback)} */ public void should_return_proper_RequestExecution_with_entity() throws ExecutionException, InterruptedException { /** Given **/ mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ClientResourceListWrapper.class), eq(new String[]{"/resources"}), any(DefaultErrorHandler.class))).thenReturn(requestMock); doReturn(resultMock).when(requestMock).get(); final AtomicInteger newThreadId = new AtomicInteger(); int currentThreadId = (int) Thread.currentThread().getId(); Callback<OperationResult<ClientResourceListWrapper>, Void> callback = Mockito.spy(new Callback<OperationResult<ClientResourceListWrapper>, Void>() { @Override public Void execute(OperationResult<ClientResourceListWrapper> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); BatchResourcesAdapter adapter = new BatchResourcesAdapter(sessionStorageMock); /** When **/ RequestExecution retrieved = adapter.asyncSearch(callback); /** Wait **/ synchronized (callback) { callback.wait(1000); } /** Then **/ assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); assertNotNull(retrieved.getFuture()); assertTrue(retrieved.getFuture().isDone()); Mockito.verify(callback, times(1)).execute(resultMock); Mockito.verify(requestMock, times(1)).get(); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.BatchResourcesAdapter#asyncDelete(com.jaspersoft.jasperserver.jaxrs.client.core.Callback)} */ public void should_delete_resource_asynchronously_and_return_proper_RequestExecution() throws InterruptedException { /** Given **/ mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"resources"}), any(DefaultErrorHandler.class))).thenReturn(objectJerseyRequestMock); doReturn(objectOperationResultMock).when(objectJerseyRequestMock).delete(); final AtomicInteger newThreadId = new AtomicInteger(); int currentThreadId = (int) Thread.currentThread().getId(); Callback<OperationResult, Void> callback = Mockito.spy(new Callback<OperationResult, Void>() { @Override public Void execute(OperationResult data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); BatchResourcesAdapter adapter = new BatchResourcesAdapter(sessionStorageMock); /** When **/ RequestExecution retrieved = adapter.asyncDelete(callback); /** Wait **/ synchronized (callback) { callback.wait(1000); } /** Then **/ assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); assertNotNull(retrieved.getFuture()); Mockito.verify(callback, times(1)).execute(objectOperationResultMock); Mockito.verify(objectJerseyRequestMock, times(1)).delete(); } @Test /** * for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.resources.BatchResourcesAdapter#delete()} */ public void should_delete_resource_and_return_operation_result() { /** Given **/ mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"resources"}), any(DefaultErrorHandler.class))).thenReturn(objectJerseyRequestMock); doReturn(objectOperationResultMock).when(objectJerseyRequestMock).delete(); BatchResourcesAdapter adapter = new BatchResourcesAdapter(sessionStorageMock); /** When **/ OperationResult retrieved = adapter.delete(); /** Then **/ assertNotNull(retrieved); assertSame(retrieved, objectOperationResultMock); } @AfterMethod public void after() { reset(sessionStorageMock, requestMock, resultMock, objectJerseyRequestMock, objectOperationResultMock); } }