package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.authority.organizations;
import com.jaspersoft.jasperserver.dto.authority.ClientTenant;
import com.jaspersoft.jasperserver.dto.authority.OrganizationsListWrapper;
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.concurrent.atomic.AtomicInteger;
import javax.ws.rs.core.MultivaluedHashMap;
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.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 org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
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.mockStatic;
import static org.testng.Assert.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNotSame;
import static org.testng.AssertJUnit.assertSame;
/**
* Unit tests for {@link BatchOrganizationsAdapter}
*/
@SuppressWarnings("unchecked")
@PrepareForTest({BatchOrganizationsAdapter.class, JerseyRequest.class})
public class BatchOrganizationsAdapterTest extends PowerMockTestCase {
@Mock
private SessionStorage sessionStorageMock;
@Mock
private JerseyRequest<OrganizationsListWrapper> requestMock;
@Mock
private OperationResult<OrganizationsListWrapper> operationResultMock;
@Mock
public ClientTenant tenantMock;
@BeforeMethod
public void before() {
initMocks(this);
}
@Test
public void should_pass_proper_session_storage_to_parent_class_and_set_own_fields() {
// When
BatchOrganizationsAdapter adapter = spy(new BatchOrganizationsAdapter(sessionStorageMock));
// Then
Assert.assertNotNull(adapter);
assertEquals(sessionStorageMock, getInternalState(adapter, "sessionStorage"));
}
@Test
/**
* for {@link BatchOrganizationsAdapter#asyncGet(Callback)}
*/
public void should_run_get_method_asynchronously() throws Exception {
// Given
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(OrganizationsListWrapper.class), eq(new String[]{"organizations"}), any(DefaultErrorHandler.class))).thenReturn(requestMock);
doReturn(operationResultMock).when(requestMock).get();
BatchOrganizationsAdapter adapterSpy = spy(new BatchOrganizationsAdapter(sessionStorageMock));
final AtomicInteger newThreadId = new AtomicInteger();
final int currentThreadId = (int) Thread.currentThread().getId();
final Callback<OperationResult<OrganizationsListWrapper>, Void> callback = spy(new Callback<OperationResult<OrganizationsListWrapper>, Void>() {
@Override
public Void execute(OperationResult<OrganizationsListWrapper> data) {
newThreadId.set((int) Thread.currentThread().getId());
synchronized (this) {
this.notifyAll();
}
return null;
}
});
doReturn(null).when(callback).execute(operationResultMock);
// When
RequestExecution retrieved = adapterSpy.asyncGet(callback);
synchronized (callback) {
callback.wait(1000);
}
// Then
verify(requestMock).get();
verify(callback).execute(operationResultMock);
assertNotNull(retrieved);
assertNotSame(currentThreadId, newThreadId.get());
}
@Test
/**
* for {@link BatchOrganizationsAdapter#parameter(OrganizationParameter, String)}
*/
public void should_add_parameter_to_map() throws Exception {
// Given
BatchOrganizationsAdapter adapter = new BatchOrganizationsAdapter(sessionStorageMock);
// When
BatchOrganizationsAdapter retrieved = adapter.parameter(OrganizationParameter.CREATE_DEFAULT_USERS, "true");
MultivaluedHashMap<String, String> params = Whitebox.getInternalState(adapter, "params");
// Then
assertSame(retrieved, adapter);
Assert.assertTrue(params.size() == 1);
Assert.assertEquals(params.getFirst(OrganizationParameter.CREATE_DEFAULT_USERS.getParamName()), "true");
}
@Test
public void should_get_resource() {
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(OrganizationsListWrapper.class), eq(new String[]{"organizations"}), any(DefaultErrorHandler.class))).thenReturn(requestMock);
doReturn(operationResultMock).when(requestMock).get();
BatchOrganizationsAdapter adapterSpy = spy(new BatchOrganizationsAdapter(sessionStorageMock));
OperationResult<OrganizationsListWrapper> retrievedResult = adapterSpy.get();
assertSame(retrievedResult, operationResultMock);
verify(requestMock, times(1)).get();
verify(requestMock, times(1)).addParams(any(MultivaluedHashMap.class));
}
@Test
public void should_get_resource_with_params() {
BatchOrganizationsAdapter adapterSpy = spy(new BatchOrganizationsAdapter(sessionStorageMock));
mockStatic(JerseyRequest.class);
when(buildRequest(eq(sessionStorageMock), eq(OrganizationsListWrapper.class), eq(new String[]{"organizations"}), any(DefaultErrorHandler.class))).thenReturn(requestMock);
doReturn(adapterSpy).when(adapterSpy).parameter(OrganizationParameter.INCLUDE_PARENTS, true);
doReturn(operationResultMock).when(requestMock).get();
OperationResult<OrganizationsListWrapper> retrievedResult = adapterSpy.get();
assertSame(retrievedResult, operationResultMock);
verify(requestMock, times(1)).get();
verify(requestMock, times(1)).addParams(any(MultivaluedHashMap.class));
}
@AfterMethod
public void after() {
sessionStorageMock = null;
requestMock = null;
operationResultMock = null;
tenantMock = null;
}
}