package org.gbif.checklistbank.ws.client;
import org.gbif.api.model.common.paging.Pageable;
import org.gbif.api.model.common.paging.PagingRequest;
import org.gbif.api.model.common.paging.PagingResponse;
import org.gbif.ws.client.BaseWsGetClient;
import java.util.List;
import java.util.Locale;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import com.google.common.collect.Lists;
import com.sun.jersey.api.client.WebResource;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mock;
@RunWith(PowerMockRunner.class)
@PrepareForTest(WebResource.Builder.class)
public abstract class WsClientBaseTest<T> {
protected final Class<T> resourceClass;
protected WebResource resource;
protected WebResource.Builder resourceBuilder;
private BaseWsGetClient<T, Integer> client;
protected final Pageable page = new PagingRequest(0l, 1);
protected static final int key = 1111;
public WsClientBaseTest(Class<T> resourceClass) {
this.resourceClass = resourceClass;
}
@Before
public void setUp() {
resource = mock(WebResource.class);
when(resource.path(Matchers.<String>any())).thenReturn(resource);
when(resource.queryParam(Matchers.<String>any(), Matchers.<String>any())).thenReturn(resource);
when(resource.queryParams(Matchers.<MultivaluedMap<String, String>>any())).thenReturn(resource);
resourceBuilder = mock(WebResource.Builder.class);
when(resource.type(eq(MediaType.APPLICATION_JSON))).thenReturn(resourceBuilder);
when(resourceBuilder.acceptLanguage(Matchers.<Locale>any())).thenReturn(resourceBuilder);
when(resourceBuilder.type(eq(MediaType.APPLICATION_JSON))).thenReturn(resourceBuilder);
client = getClient(resource);
when(resource.get(resourceClass)).thenReturn(getMockObject());
when(resourceBuilder.get(eq(resourceClass))).thenReturn(getMockObject());
}
protected PagingResponse<T> getMockResponse() {
List<T> results = Lists.newArrayList();
T obj = getMockObject();
results.add(obj);
return new PagingResponse<T>(page, 1L, results);
}
/**
* @return mocked object with key and usageKey being set in this class
*/
abstract T getMockObject();
abstract BaseWsGetClient<T, Integer> getClient(WebResource resource);
@Test
public void testGet() {
T obj = client.get(key);
T obj2 = getMockObject();
assertEquals(obj2, obj);
}
}