package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.permissions; import com.jaspersoft.jasperserver.dto.permissions.RepositoryPermission; import com.jaspersoft.jasperserver.dto.permissions.RepositoryPermissionListWrapper; import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; import com.jaspersoft.jasperserver.jaxrs.client.core.enums.MimeType; import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; import com.jaspersoft.jasperserver.jaxrs.client.core.RestClientConfiguration; 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.InOrder; 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.lang.reflect.Field; 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.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.mock; 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.support.membermodification.MemberMatcher.field; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertSame; /** * Unit tests for {@link PermissionsService} */ @PrepareForTest({JerseyRequest.class}) public class PermissionsServiceTest extends PowerMockTestCase { @Mock private SessionStorage sessionStorageMock; @Mock private JerseyRequest<Object> requestMock; @Mock private RepositoryPermission permissionMock; @Mock private OperationResult resultMock; @Mock private RestClientConfiguration configurationMock; @Mock private RepositoryPermissionListWrapper wrapperMock; private String fakeUri = "uri"; @BeforeMethod public void after() { initMocks(this); } @Test(testName = "resource") public void should_return_proper_adapter() throws IllegalAccessException { // Given PermissionsService service = new PermissionsService(sessionStorageMock); // When PermissionResourceRequestAdapter adapter = service.resource(fakeUri); SessionStorage retrieved = adapter.getSessionStorage(); Field field = field(PermissionResourceRequestAdapter.class, "resourceUri"); String resourceUri = (String) field.get(adapter); // Then assertSame(retrieved, sessionStorageMock); assertEquals(resourceUri, fakeUri); } @Test(testName = "resource", expectedExceptions = IllegalArgumentException.class) public void should_throw_an_exception_when_invalid_param_has_been_passed() throws IllegalAccessException { // When PermissionsService service = new PermissionsService(sessionStorageMock); // Then service.resource(""); } @Test(testName = "createNew_with_RepositoryPermission_param") @SuppressWarnings("unchecked") public void should_create_new_permission() { // Given mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"/permissions"}), any(DefaultErrorHandler.class))).thenReturn(requestMock); when(requestMock.post(permissionMock)).thenReturn(resultMock); // When PermissionsService service = new PermissionsService(sessionStorageMock); OperationResult retrieved = service.createNew(permissionMock); // Then verifyStatic(times(1)); JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"/permissions"}), any(DefaultErrorHandler.class)); assertSame(retrieved, resultMock); verify(requestMock, times(1)).post(permissionMock); } @Test(testName = "createNew_with_list_of_wrapped_RepositoryPermission") public void should_persist_list_of_permissions() { // Given mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"/permissions"}))).thenReturn(requestMock); when(sessionStorageMock.getConfiguration()).thenReturn(configurationMock); when(configurationMock.getContentMimeType()).thenReturn(MimeType.JSON); doReturn(resultMock).when(requestMock).post(wrapperMock); // When PermissionsService service = new PermissionsService(sessionStorageMock); OperationResult retrieved = service.createNew(wrapperMock); // Then verifyStatic(times(1)); JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"/permissions"})); verify(requestMock, times(1)).setContentType("application/collection+json"); verify(requestMock, times(1)).post(wrapperMock); assertSame(retrieved, resultMock); } @Test public void should_create_new_permission_in_separate_thread() throws InterruptedException { /* Given */ RepositoryPermission permissionMock = mock(RepositoryPermission.class); mockStatic(JerseyRequest.class); PowerMockito.when(buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"/permissions"}))).thenReturn(requestMock); PowerMockito.doReturn(resultMock).when(requestMock).post(permissionMock); PermissionsService serviceSpy = spy(new PermissionsService(sessionStorageMock)); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult, Void> callback = 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 = serviceSpy.asyncCreateNew(permissionMock, callback); synchronized (callback) { callback.wait(1000); } /* Then */ verify(requestMock, times(1)).post(permissionMock); verify(callback).execute(resultMock); assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); } @Test public void should_create_new_list_of_permission_in_separate_thread() throws InterruptedException { /* Given */ RepositoryPermissionListWrapper permissionListWrapperMock = mock(RepositoryPermissionListWrapper.class); mockStatic(JerseyRequest.class); PowerMockito.when(buildRequest(eq(sessionStorageMock), eq(Object.class), eq(new String[]{"/permissions"}))).thenReturn(requestMock); PowerMockito.doReturn(resultMock).when(requestMock).post(permissionListWrapperMock); PowerMockito.doReturn(configurationMock).when(sessionStorageMock).getConfiguration(); PermissionsService serviceSpy = spy(new PermissionsService(sessionStorageMock)); InOrder inOrder = Mockito.inOrder(requestMock); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult, Void> callback = 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 = serviceSpy.asyncCreateNew(permissionListWrapperMock, callback); synchronized (callback) { callback.wait(1000); } /* Then */ inOrder.verify(requestMock, times(1)).setContentType("application/collection+xml"); inOrder.verify(requestMock, times(1)).post(permissionListWrapperMock); verify(callback).execute(resultMock); assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); } @AfterMethod public void before() { reset(sessionStorageMock, wrapperMock, requestMock); } }