package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.attributes;
import com.jaspersoft.jasperserver.dto.authority.hypermedia.HypermediaAttribute;
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.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.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.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.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.mockito.internal.util.reflection.Whitebox.getInternalState;
import static org.powermock.api.mockito.PowerMockito.doReturn;
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.verifyNoMoreInteractions;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNotSame;
import static org.testng.Assert.assertSame;
/**
* Unit tests for {@link SingleAttributeAdapter}
*/
@PrepareForTest({SingleAttributeAdapter.class, JerseyRequest.class})
public class SingleAttributeAdapterTest extends PowerMockTestCase {
@Mock
private SessionStorage sessionStorageMock;
@Mock
private JerseyRequest<HypermediaAttribute> requestMock;
@Mock
private OperationResult<HypermediaAttribute> resultMock;
@BeforeMethod
public void before() {
initMocks(this);
}
@Test
public void should_pass_proper_session_storage_to_parent_class_and_set_own_fields() {
// When
SingleAttributeAdapter adapter = new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State");
ArrayList<String> uri = (ArrayList<String>) getInternalState(adapter, "path");
// Then
assertNotNull(adapter);
assertEquals(uri.get(0), "organizations");
assertEquals(uri.get(1), "MyCoolOrg");
assertEquals(uri.get(2), "users");
assertEquals(uri.get(3), "Simon");
assertSame(adapter.getSessionStorage(), sessionStorageMock);
}
@Test
public void should_invoke_private_method_and_return_a_mock() throws Exception {
// Given
SingleAttributeAdapter adapter = spy(new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State"));
doReturn(requestMock).when(adapter, "buildRequest");
doReturn(resultMock).when(requestMock).get();
// When
adapter.get();
// Then
verifyPrivate(adapter, times(1)).invoke("buildRequest");
verify(requestMock, times(1)).get();
verifyNoMoreInteractions(requestMock);
}
@Test
public void should_return_attribute_asynchronously() throws Exception {
// Given
SingleAttributeAdapter adapter = spy(new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State"));
doReturn(requestMock).when(adapter, "buildRequest");
doReturn(resultMock).when(requestMock).get();
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<HypermediaAttribute>, Void> callback = spy(new Callback<OperationResult<HypermediaAttribute>, Void>() {
@Override
public Void execute(OperationResult<HypermediaAttribute> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notify();
}
return null;
}
});
doReturn(null).when(callback).execute(resultMock);
// When
RequestExecution retrieved = adapter.asyncGet(callback);
synchronized (callback) {
callback.wait(1000);
}
// Then
verify(requestMock).get();
verify(callback).execute(resultMock);
assertNotNull(retrieved);
assertNotSame(currentThreadId, newThreadId.get());
}
@Test
public void should_delete_attribute_asynchronously() throws Exception {
// Given
SingleAttributeAdapter adapter = spy(new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State"));
doReturn(requestMock).when(adapter, "buildRequest");
doReturn(resultMock).when(requestMock).delete();
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<HypermediaAttribute>, Void> callback = spy(new Callback<OperationResult<HypermediaAttribute>, Void>() {
@Override
public Void execute(OperationResult<HypermediaAttribute> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notify();
}
return null;
}
});
doReturn(null).when(callback).execute(resultMock);
// When
RequestExecution retrieved = adapter.asyncDelete(callback);
synchronized (callback) {
callback.wait(1000);
}
// Then
verify(requestMock).delete();
verify(callback).execute(resultMock);
assertNotNull(retrieved);
assertNotSame(currentThreadId, newThreadId.get());
}
@Test
public void should_create_or_update_attribute_for_user_asynchronously() throws Exception {
// Given
SingleAttributeAdapter adapter = spy(new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State"));
final HypermediaAttribute userAttributeMock = mock(HypermediaAttribute.class);
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<HypermediaAttribute>, Void> callback = spy(new Callback<OperationResult<HypermediaAttribute>, Void>() {
@Override
public Void execute(OperationResult<HypermediaAttribute> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notify();
}
return null;
}
});
doReturn(requestMock).when(adapter, "buildRequest");
doReturn(resultMock).when(requestMock).put(userAttributeMock);
doReturn(null).when(callback).execute(resultMock);
// When
RequestExecution retrieved = adapter.asyncCreateOrUpdate(userAttributeMock, callback);
synchronized (callback) {
callback.wait(1000);
}
// Then
verify(requestMock).put(userAttributeMock);
verify(callback).execute(resultMock);
assertNotNull(retrieved);
assertNotSame(currentThreadId, newThreadId.get());
}
@Test
public void should_invoke_private_method() {
// Given
final HypermediaAttribute userAttributeMock = mock(HypermediaAttribute.class);
final SingleAttributeAdapter adapter = new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State");
RestClientConfiguration configurationMock = mock(RestClientConfiguration.class);
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(HypermediaAttribute.class),
eq(new String[]{"organizations", "MyCoolOrg", "users", "Simon", "attributes", "State"}), any(DefaultErrorHandler.class)))
.thenReturn(requestMock);
doReturn(configurationMock).when(sessionStorageMock).getConfiguration();
doReturn(MimeType.JSON).when(configurationMock).getContentMimeType();
doReturn(requestMock).when(requestMock).setContentType(anyString());
doReturn(resultMock).when(requestMock).put(userAttributeMock);
// When
OperationResult<HypermediaAttribute> retrieved = adapter.createOrUpdate(userAttributeMock);
// Then
assertNotNull(retrieved);
verifyStatic(times(1));
buildRequest(eq(sessionStorageMock),
eq(HypermediaAttribute.class),
eq(new String[]{"organizations", "MyCoolOrg", "users", "Simon", "attributes", "State"}),
any(DefaultErrorHandler.class));
verify(requestMock, times(1)).put(userAttributeMock);
}
@Test
public void should_set_headers_and_invoke_private_method() {
// Given
final SingleAttributeAdapter adapter = new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State");
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(HypermediaAttribute.class),
eq(new String[]{"organizations", "MyCoolOrg", "users", "Simon", "attributes", "State"}), any(DefaultErrorHandler.class)))
.thenReturn(requestMock);
doReturn(requestMock).when(requestMock).setAccept(anyString());
RestClientConfiguration configurationMock = mock(RestClientConfiguration.class);
doReturn(MimeType.JSON).when(configurationMock).getAcceptMimeType();
doReturn(configurationMock).when(sessionStorageMock).getConfiguration();
doReturn(requestMock).when(requestMock).addParam(anyString(), anyString());
doReturn(resultMock).when(requestMock).get();
// When
OperationResult<HypermediaAttribute> retrieved = adapter.setIncludePermissions(true).get();
// Then
assertNotNull(retrieved);
verifyStatic(times(1));
buildRequest(eq(sessionStorageMock),
eq(HypermediaAttribute.class),
eq(new String[]{"organizations", "MyCoolOrg", "users", "Simon", "attributes", "State"}),
any(DefaultErrorHandler.class));
verify(requestMock, times(1)).get();
verify(requestMock, times(1)).setAccept("application/hal+json");
verify(requestMock, times(1)).addParam("_embedded", "permission");
}
@Test
public void should_set_headers_and_invoke_private_method_for_user_in_root_by_default() {
// Given
final SingleAttributeAdapter adapter = new SingleAttributeAdapter(null, "Simon", sessionStorageMock, "State");
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(HypermediaAttribute.class),
eq(new String[]{"users", "Simon", "attributes", "State"}), any(DefaultErrorHandler.class)))
.thenReturn(requestMock);
doReturn(requestMock).when(requestMock).setAccept(anyString());
RestClientConfiguration configurationMock = mock(RestClientConfiguration.class);
doReturn(MimeType.JSON).when(configurationMock).getAcceptMimeType();
doReturn(configurationMock).when(sessionStorageMock).getConfiguration();
doReturn(requestMock).when(requestMock).addParam(anyString(), anyString());
doReturn(resultMock).when(requestMock).get();
// When
OperationResult<HypermediaAttribute> retrieved = adapter.setIncludePermissions(true).get();
// Then
assertNotNull(retrieved);
verifyStatic(times(1));
buildRequest(eq(sessionStorageMock),
eq(HypermediaAttribute.class),
eq(new String[]{"users", "Simon", "attributes", "State"}),
any(DefaultErrorHandler.class));
verify(requestMock, times(1)).get();
verify(requestMock, times(1)).setAccept("application/hal+json");
verify(requestMock, times(1)).addParam("_embedded", "permission");
}
@Test
public void should_set_headers_and_invoke_private_method_for_user_in_root() {
// Given
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(HypermediaAttribute.class),
eq(new String[]{"users", "Simon", "attributes", "State"}), any(DefaultErrorHandler.class)))
.thenReturn(requestMock);
doReturn(requestMock).when(requestMock).setAccept(anyString());
RestClientConfiguration configurationMock = mock(RestClientConfiguration.class);
doReturn(MimeType.JSON).when(configurationMock).getAcceptMimeType();
doReturn(configurationMock).when(sessionStorageMock).getConfiguration();
doReturn(requestMock).when(requestMock).addParam(anyString(), anyString());
doReturn(resultMock).when(requestMock).get();
// When
AttributesService service = new AttributesService(sessionStorageMock);
OperationResult<HypermediaAttribute> retrieved = service
.forOrganization("/")
.forUser("Simon")
.attribute("State")
.setIncludePermissions(true).get();
// Then
assertNotNull(retrieved);
verifyStatic(times(1));
buildRequest(eq(sessionStorageMock),
eq(HypermediaAttribute.class),
eq(new String[]{"users", "Simon", "attributes", "State"}),
any(DefaultErrorHandler.class));
verify(requestMock, times(1)).get();
verify(requestMock, times(1)).setAccept("application/hal+json");
verify(requestMock, times(1)).addParam("_embedded", "permission");
}
@Test
public void should_invoke_private_method_for_delete_method() {
// Given
final SingleAttributeAdapter adapter = new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State");
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(HypermediaAttribute.class),
eq(new String[]{"organizations", "MyCoolOrg", "users", "Simon", "attributes", "State"}),
any(DefaultErrorHandler.class)))
.thenReturn(requestMock);
doReturn(resultMock).when(requestMock).delete();
// When
OperationResult<HypermediaAttribute> retrieved = adapter.delete();
// Then
assertNotNull(retrieved);
verifyStatic(times(1));
buildRequest(eq(sessionStorageMock),
eq(HypermediaAttribute.class),
eq(new String[]{"organizations", "MyCoolOrg", "users", "Simon", "attributes", "State"}),
any(DefaultErrorHandler.class));
verify(requestMock, times(1)).delete();
}
@Test
public void should_delete_user_attribute() throws Exception {
// Given
SingleAttributeAdapter adapter = spy(new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State"));
doReturn(requestMock).when(adapter, "buildRequest");
doReturn(resultMock).when(requestMock).delete();
// When
OperationResult retrieved = adapter.delete();
// Then
assertSame(retrieved, resultMock);
verifyPrivate(adapter, times(1)).invoke("buildRequest");
}
@Test
public void should_create_or_update_attribute_for_user() throws Exception {
// Given
final HypermediaAttribute userAttributeMock = mock(HypermediaAttribute.class);
RestClientConfiguration configurationMock = mock(RestClientConfiguration.class);
SingleAttributeAdapter adapter = spy(new SingleAttributeAdapter("MyCoolOrg", "Simon", sessionStorageMock, "State"));
doReturn(requestMock).when(adapter, "buildRequest");
doReturn(configurationMock).when(sessionStorageMock).getConfiguration();
doReturn(MimeType.JSON).when(configurationMock).getContentMimeType();
doReturn(requestMock).when(requestMock).setContentType(anyString());
doReturn(resultMock).when(requestMock).put(userAttributeMock);
// When
OperationResult retrieved = adapter.createOrUpdate(userAttributeMock);
// Then
assertSame(retrieved, resultMock);
verifyPrivate(adapter, times(1)).invoke("buildRequest");
}
@AfterMethod
public void after() {
reset(sessionStorageMock, requestMock, resultMock);
}
}