package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.permissions; import com.jaspersoft.jasperserver.dto.permissions.RepositoryPermission; 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 org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockTestCase; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.concurrent.atomic.AtomicInteger; import static org.mockito.Matchers.anyString; 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.verifyPrivate; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import static org.powermock.api.mockito.PowerMockito.when; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertSame; /** * Unit tests for {@link SinglePermissionRecipientRequestAdapter} */ @PrepareForTest({SinglePermissionRecipientRequestAdapter.class, JerseyRequest.class}) public class SinglePermissionRecipientRequestAdapterTest extends PowerMockTestCase { @Mock private SessionStorage storageMock; @Mock private JerseyRequest<RepositoryPermission> requestMock; @Mock private OperationResult<RepositoryPermission> resultMock; @Mock private RepositoryPermission permissionMock; @BeforeMethod public void after() { initMocks(this); } @Test public void should_return_a_proper_op_result_with_repo_permission() throws Exception { // Given SinglePermissionRecipientRequestAdapter adapterSpy = spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); doReturn(requestMock).when(adapterSpy, "getBuilder", RepositoryPermission.class); doReturn(resultMock).when(requestMock).get(); // When OperationResult<RepositoryPermission> retrieved = adapterSpy.get(); // Then verifyPrivate(adapterSpy, times(1)).invoke("getBuilder", eq(RepositoryPermission.class)); verify(requestMock, times(1)).get(); assertNotNull(retrieved); } @Test public void should_create_or_update_RepositoryPermission_and_return_result_of_operation() throws Exception { // Given SinglePermissionRecipientRequestAdapter adapterSpy = spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); doReturn(requestMock).when(adapterSpy, "getBuilder", RepositoryPermission.class); doReturn(resultMock).when(requestMock).put(permissionMock); // When OperationResult<RepositoryPermission> retrieved = adapterSpy.createOrUpdate(permissionMock); // Then verifyPrivate(adapterSpy, times(1)).invoke("getBuilder", eq(RepositoryPermission.class)); verify(requestMock, times(1)).put(permissionMock); assertNotNull(retrieved); assertSame(retrieved, resultMock); } @Test public void should_delete_RepositoryPermission_and_return_result() throws Exception { // Given OperationResult opResultMock = PowerMockito.mock(OperationResult.class); SinglePermissionRecipientRequestAdapter adapterSpy = spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); doReturn(requestMock).when(adapterSpy, "getBuilder", Object.class); doReturn(opResultMock).when(requestMock).delete(); // When OperationResult<RepositoryPermission> retrieved = adapterSpy.delete(); // Then verifyPrivate(adapterSpy, times(1)).invoke("getBuilder", eq(Object.class)); verify(requestMock, times(1)).delete(); assertNotNull(retrieved); assertSame(retrieved, opResultMock); } @Test public void should_invoke_private_method_only_once() throws Exception { // Given mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(storageMock), eq(RepositoryPermission.class), eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock); when(requestMock.get()).thenReturn(resultMock); SinglePermissionRecipientRequestAdapter spy = spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); // When OperationResult<RepositoryPermission> retrieved = spy.get(); // Then verifyStatic(times(1)); JerseyRequest.buildRequest(eq(storageMock), eq(RepositoryPermission.class), eq(new String[]{"permissions", "resourceUri"})); // Verify that private print is called only once. verifyPrivate(spy, times(1)).invoke("getBuilder", RepositoryPermission.class); // Verify that addMatrixParam print is called with the specified parameters. verify(requestMock).addMatrixParam(eq("recipient"), eq("recipient")); assertSame(retrieved, resultMock); } @Test(expectedExceptions = IllegalArgumentException.class) public void should_throw_NPE_exception_when_session_is_null() throws Exception { // Given final SessionStorage NULL_STORAGE = null; SinglePermissionRecipientRequestAdapter spy = spy(new SinglePermissionRecipientRequestAdapter(NULL_STORAGE, "resourceUri", "recipient")); // When spy.get(); // Then expect NPE } @Test public void should_retrieve_permission_asynchronously() throws InterruptedException { /* Given */ PowerMockito.mockStatic(JerseyRequest.class); PowerMockito.when(JerseyRequest.buildRequest(eq(storageMock), eq(RepositoryPermission.class), eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock); PowerMockito.doReturn(resultMock).when(requestMock).get(); SinglePermissionRecipientRequestAdapter adapterSpy = PowerMockito.spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult<RepositoryPermission>, Void> callback = PowerMockito.spy(new Callback<OperationResult<RepositoryPermission>, Void>() { @Override public Void execute(OperationResult<RepositoryPermission> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); PowerMockito.doReturn(null).when(callback).execute(resultMock); /* When */ RequestExecution retrieved = adapterSpy.asyncGet(callback); synchronized (callback) { callback.wait(1000); } /* Then */ Mockito.verify(requestMock).get(); Mockito.verify(callback).execute(resultMock); Assert.assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); } @Test public void should_delete_permission_asynchronously() throws InterruptedException { /* Given */ JerseyRequest<Object> requestMock = (JerseyRequest<Object>) PowerMockito.mock(JerseyRequest.class); PowerMockito.mockStatic(JerseyRequest.class); PowerMockito.when(JerseyRequest.buildRequest(eq(storageMock), eq(Object.class), eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock); PowerMockito.doReturn(resultMock).when(requestMock).delete(); SinglePermissionRecipientRequestAdapter adapterSpy = PowerMockito.spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult, Void> callback = PowerMockito.spy(new Callback<OperationResult, Void>() { @Override public Void execute(OperationResult data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); PowerMockito.doReturn(null).when(callback).execute(resultMock); /* When */ RequestExecution retrieved = adapterSpy.asyncDelete(callback); synchronized (callback) { callback.wait(1000); } /* Then */ Mockito.verify(requestMock).delete(); Mockito.verify(callback).execute(resultMock); Assert.assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); } @Test public void should_create_resource_asynchronously() throws InterruptedException { PowerMockito.mockStatic(JerseyRequest.class); PowerMockito.when(JerseyRequest.buildRequest(eq(storageMock), eq(RepositoryPermission.class), eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock); PowerMockito.doReturn(resultMock).when(requestMock).put(permissionMock); SinglePermissionRecipientRequestAdapter adapterSpy = PowerMockito.spy(new SinglePermissionRecipientRequestAdapter(storageMock, "resourceUri", "recipient")); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult<RepositoryPermission>, Void> callback = PowerMockito.spy(new Callback<OperationResult<RepositoryPermission>, Void>() { @Override public Void execute(OperationResult<RepositoryPermission> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); PowerMockito.doReturn(null).when(callback).execute(resultMock); /* When */ RequestExecution retrieved = adapterSpy.asyncCreateOrUpdate(permissionMock, callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ Assert.assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); Mockito.verify(requestMock).put(permissionMock); Mockito.verify(requestMock).addMatrixParam(anyString(), anyString()); Mockito.verify(callback).execute(resultMock); } @AfterMethod public void before() { reset(requestMock, resultMock, storageMock, permissionMock); } }