package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.authority.users; import com.jaspersoft.jasperserver.dto.authority.ClientUser; 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 java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; import org.mockito.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockTestCase; import org.powermock.reflect.Whitebox; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; 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.Mockito.when; 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.testng.Assert.assertNotNull; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotSame; import static org.testng.AssertJUnit.assertSame; /** * Unit tests for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.authority.users.SingleUserRequestAdapter} */ @PrepareForTest({SingleUserRequestAdapter.class,JerseyRequest.class}) public class SingleUserRequestAdapterTest extends PowerMockTestCase { @Mock public SessionStorage sessionStorageMock; @Mock private JerseyRequest<ClientUser> userJerseyRequestMock; @Mock private OperationResult<ClientUser> operationResultMock; @Mock private ClientUser userMock; @BeforeMethod public void before() { initMocks(this); } @Test(testName = "constructor") public void should_invoke_constructor_with_proper_three_params() { // When SingleUserRequestAdapter adapter = new SingleUserRequestAdapter(sessionStorageMock, userMock); // Then assertSame(adapter.getSessionStorage(), sessionStorageMock); assertEquals(((ArrayList<String>)Whitebox.getInternalState(adapter, "uri")).get(0), "users"); assertEquals(Whitebox.getInternalState(adapter, "user"), userMock); } @Test public void should_get_user() throws Exception { // Given SingleUserRequestAdapter adapterSpy = spy(new SingleUserRequestAdapter(sessionStorageMock, userMock)); doReturn(userJerseyRequestMock).when(adapterSpy, "buildRequest"); doReturn(operationResultMock).when(userJerseyRequestMock).get(); // When OperationResult<ClientUser> retrieved = adapterSpy.get(); // Then verifyPrivate(adapterSpy, times(1)).invoke("buildRequest"); verify(userJerseyRequestMock, times(1)).get(); assertSame(retrieved, operationResultMock); } @Test public void should_delete_user() throws Exception { // Given SingleUserRequestAdapter adapterSpy = spy(new SingleUserRequestAdapter(sessionStorageMock, userMock)); doReturn(userJerseyRequestMock).when(adapterSpy, "buildRequest"); doReturn(operationResultMock).when(userJerseyRequestMock).delete(); // When OperationResult<ClientUser> retrieved = adapterSpy.delete(); // Then verifyPrivate(adapterSpy, times(1)).invoke("buildRequest"); verify(userJerseyRequestMock, times(1)).delete(); assertSame(retrieved, operationResultMock); } @Test public void should_create_or_update_user() throws Exception { // Given SingleUserRequestAdapter adapterSpy = spy(new SingleUserRequestAdapter(sessionStorageMock, userMock)); doReturn(userJerseyRequestMock).when(adapterSpy, "buildRequest"); doReturn(operationResultMock).when(userJerseyRequestMock).put(userMock); // When OperationResult<ClientUser> retrieved = adapterSpy.createOrUpdate(userMock); // Then verifyPrivate(adapterSpy, times(1)).invoke("buildRequest"); verify(userJerseyRequestMock, times(1)).put(userMock); assertSame(retrieved, operationResultMock); } @Test public void should_invoke_private_method() { // Given SingleUserRequestAdapter adapter = spy(new SingleUserRequestAdapter(sessionStorageMock, new ClientUser().setTenantId("myOrg").setUsername("Simon"))); mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ClientUser.class), eq(new String[]{"organizations", "myOrg", "users", "Simon"}), any(DefaultErrorHandler.class))) .thenReturn(userJerseyRequestMock); doReturn(operationResultMock).when(userJerseyRequestMock).delete(); // When OperationResult<ClientUser> retrieved = adapter.delete(); // Then assertNotNull(retrieved); verifyStatic(times(1)); buildRequest(eq(sessionStorageMock), eq(ClientUser.class), eq(new String[]{"organizations", "myOrg", "users", "Simon"}), any(DefaultErrorHandler.class)); verify(userJerseyRequestMock, times(1)).delete(); } @Test public void should_refuse_wrong_organization_and_get_user() { // Given SingleUserRequestAdapter adapter = spy(new SingleUserRequestAdapter(sessionStorageMock, new ClientUser().setTenantId("").setUsername("Simon"))); mockStatic(JerseyRequest.class); when(buildRequest(eq(sessionStorageMock), eq(ClientUser.class), eq(new String[]{"users", "Simon"}), any(DefaultErrorHandler.class))) .thenReturn(userJerseyRequestMock); doReturn(operationResultMock).when(userJerseyRequestMock).get(); // When OperationResult<ClientUser> retrieved = adapter.get(); // Then assertNotNull(retrieved); verifyStatic(times(1)); buildRequest(eq(sessionStorageMock), eq(ClientUser.class), eq(new String[]{"users", "Simon"}), any(DefaultErrorHandler.class)); verify(userJerseyRequestMock, times(1)).get(); } @Test public void should_get_user_asynchronously() throws Exception { // Given final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); SingleUserRequestAdapter adapterSpy = spy(new SingleUserRequestAdapter(sessionStorageMock, userMock)); final Callback<OperationResult<ClientUser>, Void> callback = spy(new Callback<OperationResult<ClientUser>, Void>() { @Override public Void execute(OperationResult<ClientUser> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(userJerseyRequestMock).when(adapterSpy, "buildRequest"); doReturn(operationResultMock).when(userJerseyRequestMock).get(); doReturn(null).when(callback).execute(operationResultMock); // When RequestExecution retrieved = adapterSpy.asyncGet(callback); synchronized (callback) { callback.wait(1000); } // Then assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(operationResultMock); verify(userJerseyRequestMock, times(1)).get(); } @Test public void should_create_or_update_user_asynchronously() throws Exception { // Given final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); SingleUserRequestAdapter adapterSpy = spy(new SingleUserRequestAdapter(sessionStorageMock, userMock)); final Callback<OperationResult<ClientUser>, Void> callback = spy(new Callback<OperationResult<ClientUser>, Void>() { @Override public Void execute(OperationResult<ClientUser> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(userJerseyRequestMock).when(adapterSpy, "buildRequest"); doReturn(operationResultMock).when(userJerseyRequestMock).put(userMock); doReturn(null).when(callback).execute(operationResultMock); // When RequestExecution retrieved = adapterSpy.asyncCreateOrUpdate(userMock, callback); // Wait synchronized (callback) { callback.wait(1000); } // Then assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(operationResultMock); verify(userJerseyRequestMock, times(1)).put(userMock); } @Test public void should_delete_user_asynchronously() throws Exception { // Given final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final SingleUserRequestAdapter adapterSpy = spy(new SingleUserRequestAdapter(sessionStorageMock, userMock)); final Callback<OperationResult<ClientUser>, Void> callback = spy(new Callback<OperationResult<ClientUser>, Void>() { @Override public Void execute(OperationResult<ClientUser> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); doReturn(userJerseyRequestMock).when(adapterSpy, "buildRequest"); doReturn(operationResultMock).when(userJerseyRequestMock).delete(); doReturn(null).when(callback).execute(operationResultMock); // When RequestExecution retrieved = adapterSpy.asyncDelete(callback); // Wait synchronized (callback) { callback.wait(1000); } // Then assertNotNull(retrieved); assertNotSame(currentThreadId, newThreadId.get()); verify(callback, times(1)).execute(operationResultMock); verify(userJerseyRequestMock, times(1)).delete(); } @AfterMethod public void after() { reset(sessionStorageMock, userJerseyRequestMock, operationResultMock, userMock); } }