package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.permissions;
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.RequestExecution;
import com.jaspersoft.jasperserver.jaxrs.client.core.RestClientConfiguration;
import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage;
import com.jaspersoft.jasperserver.jaxrs.client.core.enums.MimeType;
import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import javax.ws.rs.core.MultivaluedMap;
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 static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest;
import static java.util.Arrays.asList;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
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.powermock.api.support.membermodification.MemberMatcher.field;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
/**
* Unit tests for {@link PermissionResourceRequestAdapter}
*/
@PrepareForTest({JerseyRequest.class})
public class PermissionResourceRequestAdapterTest extends PowerMockTestCase {
@Mock
private SessionStorage sessionStorageMock;
@Mock
private JerseyRequest<RepositoryPermissionListWrapper> requestMock;
@Mock
private RepositoryPermissionListWrapper wrapperMock;
@Mock
private OperationResult<RepositoryPermissionListWrapper> expectedResultMock;
@Mock
private RestClientConfiguration configurationMock;
private String fakeUri = "resourceUri";
@BeforeMethod
public void before() {
initMocks(this);
}
@Test(testName = "constructor")
@SuppressWarnings("unchecked")
public void should_set_fields_in_constructor_and_pass_session_to_parent_class() throws IllegalAccessException {
// When
PermissionResourceRequestAdapter adapter = new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri);
// Reflection hack
Field resUri = field(PermissionResourceRequestAdapter.class, "resourceUri");
Field params = field(PermissionResourceRequestAdapter.class, "params");
String uri = (String) resUri.get(adapter);
MultivaluedMap<String, String> paramsMap = (MultivaluedMap<String, String>) params.get(adapter);
// Then
assertSame(adapter.getSessionStorage(), sessionStorageMock);
assertNotNull(uri);
assertNotNull(paramsMap);
}
@Test(testName = "permissionRecipient")
public void should_return_proper_adapter() throws IllegalAccessException {
// Given
PermissionResourceRequestAdapter adapter = new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri);
// When
SinglePermissionRecipientRequestAdapter retrieved = adapter.permissionRecipient(PermissionRecipient.ROLE, "abc");
Field recipientField = field(SinglePermissionRecipientRequestAdapter.class, "recipient");
Field pathField = field(SinglePermissionRecipientRequestAdapter.class, "path");
String recipient = (String) recipientField.get(retrieved);
ArrayList<String> path = (ArrayList<String>) pathField.get(retrieved);
// Then
assertEquals(recipient, "role:%2Fabc");
assertEquals(path, asList("permissions", fakeUri));
}
@Test(testName = "updateOrCreate")
public void should_return_proper_OperationResult_instance() {
// Given
mockStatic(JerseyRequest.class);
when(JerseyRequest.buildRequest(sessionStorageMock,
RepositoryPermissionListWrapper.class,
new String[]{"permissions", fakeUri})).thenReturn(requestMock);
when(sessionStorageMock.getConfiguration()).thenReturn(configurationMock);
when(configurationMock.getContentMimeType()).thenReturn(MimeType.JSON);
doReturn(expectedResultMock).when(requestMock).put(wrapperMock);
// When
PermissionResourceRequestAdapter adapter = new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri);
OperationResult<RepositoryPermissionListWrapper> retrieved = adapter.createOrUpdate(wrapperMock);
// Then
verifyStatic(times(1));
JerseyRequest.buildRequest(sessionStorageMock, RepositoryPermissionListWrapper.class, new String[]{"permissions", fakeUri});
verify(requestMock, times(1)).setContentType("application/collection+json");
verify(requestMock, times(1)).put(wrapperMock);
verifyNoMoreInteractions(requestMock);
assertNotNull(retrieved);
assertEquals(retrieved, expectedResultMock);
}
@Test(testName = "param")
@SuppressWarnings("unchecked")
public void should_set_field_of_adapter_and_invoke_param_method_only_once() throws IllegalAccessException {
// Given
PermissionResourceRequestAdapter adapter = spy(new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri));
// When
adapter.param(PermissionResourceParameter.EFFECTIVE_PERMISSIONS, "somePermissions");
Field paramsField = field(PermissionResourceRequestAdapter.class, "params");
MultivaluedMap<String, String> retrieved = (MultivaluedMap<String, String>) paramsField.get(adapter);
// Then
assertTrue(retrieved.size() == 1);
verify(adapter, times(1)).param(PermissionResourceParameter.EFFECTIVE_PERMISSIONS, "somePermissions");
verify(adapter, never()).param(PermissionResourceParameter.EFFECTIVE_PERMISSIONS, "wrongPermissions");
}
@Test(testName = "get")
@SuppressWarnings("unchecked")
public void should_return_proper_op_result() throws IllegalAccessException {
// Given
mockStatic(JerseyRequest.class);
when(JerseyRequest.buildRequest(sessionStorageMock,
RepositoryPermissionListWrapper.class,
new String[]{"permissions", fakeUri})).thenReturn(requestMock);
when(requestMock.get()).thenReturn(expectedResultMock);
// When
PermissionResourceRequestAdapter adapter = new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri);
OperationResult<RepositoryPermissionListWrapper> retrieved = adapter.get();
// Retrieving params field
Field field = field(PermissionResourceRequestAdapter.class, "params");
MultivaluedMap<String, String> paramsField = (MultivaluedMap<String, String>) field.get(adapter);
// Then
verify(requestMock, times(1)).get();
verify(requestMock, times(1)).addParams(paramsField);
verify(requestMock, never()).delete();
verifyNoMoreInteractions(requestMock); // IMPORTANT: must be only two corresponding invocations and
// no more on this Request object.
assertSame(retrieved, expectedResultMock);
}
@Test(testName = "delete")
public void should_delete_permission_and_return_op_result() {
// Given
mockStatic(JerseyRequest.class);
when(JerseyRequest.buildRequest(sessionStorageMock,
RepositoryPermissionListWrapper.class,
new String[]{"permissions", fakeUri})).thenReturn(requestMock);
when(requestMock.delete()).thenReturn(expectedResultMock);
// When
PermissionResourceRequestAdapter adapter = new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri);
OperationResult retrieved = adapter.delete(); // why isn't generified? what comes as a result?
// Then
// Verify that static print is called with the specified parameter.
verifyStatic(times(1));
JerseyRequest.buildRequest(eq(sessionStorageMock),
eq(RepositoryPermissionListWrapper.class),
eq(new String[]{"permissions", fakeUri}));
// Verify that instance print is called only once
verify(requestMock, times(1)).delete();
assertSame(retrieved, expectedResultMock);
}
@Test
public void should_retrieve_resource_asynchronously() throws InterruptedException {
/* Given */
PowerMockito.mockStatic(JerseyRequest.class);
PowerMockito.when(buildRequest(eq(sessionStorageMock),
eq(RepositoryPermissionListWrapper.class),
eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock);
PowerMockito.doReturn(expectedResultMock).when(requestMock).get();
PermissionResourceRequestAdapter adapterSpy = PowerMockito.spy(new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri));
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<RepositoryPermissionListWrapper>, Void> callback = PowerMockito.spy(new Callback<OperationResult<RepositoryPermissionListWrapper>, Void>() {
@Override
public Void execute(OperationResult<RepositoryPermissionListWrapper> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notify();
}
return null;
}
});
PowerMockito.doReturn(null).when(callback).execute(expectedResultMock);
/* When */
RequestExecution retrieved = adapterSpy.asyncGet(callback);
synchronized (callback) {
callback.wait(1000);
}
/* Then */
Mockito.verify(requestMock).get();
Mockito.verify(callback).execute(expectedResultMock);
Assert.assertNotNull(retrieved);
Assert.assertNotSame(currentThreadId, newThreadId.get());
}
@Test
public void should_delete_resource_asynchronously() throws InterruptedException {
/* Given */
PowerMockito.mockStatic(JerseyRequest.class);
PowerMockito.when(buildRequest(eq(sessionStorageMock),
eq(RepositoryPermissionListWrapper.class),
eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock);
PowerMockito.doReturn(expectedResultMock).when(requestMock).delete();
PermissionResourceRequestAdapter adapterSpy = PowerMockito.spy(new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri));
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<RepositoryPermissionListWrapper>, Void> callback = PowerMockito.spy(new Callback<OperationResult<RepositoryPermissionListWrapper>, Void>() {
@Override
public Void execute(OperationResult<RepositoryPermissionListWrapper> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notify();
}
return null;
}
});
PowerMockito.doReturn(null).when(callback).execute(expectedResultMock);
/* When */
RequestExecution retrieved = adapterSpy.asyncDelete(callback);
synchronized (callback) {
callback.wait(1000);
}
/* Then */
Mockito.verify(requestMock).delete();
Mockito.verify(callback).execute(expectedResultMock);
Assert.assertNotNull(retrieved);
Assert.assertNotSame(currentThreadId, newThreadId.get());
}
@Test
public void should_create_resource_asynchronously() throws InterruptedException {
/* Given */
PowerMockito.mockStatic(JerseyRequest.class);
PowerMockito.when(buildRequest(eq(sessionStorageMock),
eq(RepositoryPermissionListWrapper.class),
eq(new String[]{"permissions", "resourceUri"}))).thenReturn(requestMock);
PowerMockito.doReturn(expectedResultMock).when(requestMock).put(wrapperMock);
PowerMockito.doReturn(configurationMock).when(sessionStorageMock).getConfiguration();
PowerMockito.doReturn(MimeType.JSON).when(configurationMock).getContentMimeType();
PermissionResourceRequestAdapter adapterSpy = PowerMockito.spy(new PermissionResourceRequestAdapter(sessionStorageMock, fakeUri));
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<RepositoryPermissionListWrapper>, Void> callback = PowerMockito.spy(new Callback<OperationResult<RepositoryPermissionListWrapper>, Void>() {
@Override
public Void execute(OperationResult<RepositoryPermissionListWrapper> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notify();
}
return null;
}
});
PowerMockito.doReturn(null).when(callback).execute(expectedResultMock);
/* When */
RequestExecution retrieved = adapterSpy.asyncCreateOrUpdate(wrapperMock, callback);
synchronized (callback) {
callback.wait(1000);
}
/* Then */
Assert.assertNotNull(retrieved);
Assert.assertNotSame(currentThreadId, newThreadId.get());
Mockito.verify(requestMock).put(wrapperMock);
Mockito.verify(callback).execute(expectedResultMock);
Mockito.verify(sessionStorageMock).getConfiguration();
Mockito.verify(configurationMock).getContentMimeType();
}
@AfterMethod
public void after() {
Mockito.reset(sessionStorageMock, requestMock, wrapperMock, expectedResultMock, configurationMock);
}
}