/**
*
*/
package org.minnal.instrument.resource;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Providers;
import org.activejpa.entity.Condition;
import org.activejpa.entity.Filter;
import org.minnal.instrument.MinnalInstrumentationException;
import org.minnal.instrument.entity.metadata.ParameterMetaData;
import org.testng.annotations.Test;
import com.google.common.collect.Lists;
/**
* @author ganeshs
*
*/
public class ResourceUtilTest {
@Test
public void shouldCreateFilter() {
MultivaluedMap<String, String> map = mock(MultivaluedMap.class);
when(map.getFirst(ResourceUtil.PAGE_NO)).thenReturn("1");
when(map.getFirst(ResourceUtil.PER_PAGE)).thenReturn("10");
assertEquals(ResourceUtil.getFilter(map), new Filter(10, 1));
}
@Test
public void shouldCreateFilterWithSearchParams() {
MultivaluedMap<String, String> map = mock(MultivaluedMap.class);
when(map.getFirst(ResourceUtil.PAGE_NO)).thenReturn("1");
when(map.getFirst(ResourceUtil.PER_PAGE)).thenReturn("10");
when(map.getFirst("param1")).thenReturn("value1");
when(map.getFirst("param2")).thenReturn("value2");
List<String> params = Arrays.asList("param1", "param2");
assertEquals(ResourceUtil.getFilter(map, params), new Filter(10, 1, new Condition("param1", "value1"), new Condition("param2", "value2")));
}
@Test
public void shouldCreateFilterWithUnderscoreSeparatedSearchParams() {
MultivaluedMap<String, String> map = mock(MultivaluedMap.class);
when(map.getFirst(ResourceUtil.PAGE_NO)).thenReturn("1");
when(map.getFirst(ResourceUtil.PER_PAGE)).thenReturn("10");
when(map.getFirst("param_name1")).thenReturn("value1");
when(map.getFirst("param_name2")).thenReturn("value2");
List<String> params = Arrays.asList("param_name1", "param_name2");
assertEquals(ResourceUtil.getFilter(map, params), new Filter(10, 1, new Condition("paramName1", "value1"), new Condition("paramName2", "value2")));
}
@Test
public void shouldGetContentAsList() throws Exception {
List<String> list = Lists.newArrayList("test1", "test2", "test3");
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(String.class), eq(String.class), eq(new Annotation[]{}), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenThrow(IOException.class);
when(reader.readFrom(eq(List.class), any(Type.class), eq(new Annotation[]{}), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(list);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(String.class, String.class, new Annotation[]{}, mediaType)).thenReturn(reader);
when(providers.getMessageBodyReader(List.class, ResourceUtil.listType(String.class).getType(), new Annotation[]{}, mediaType)).thenReturn(reader);
Object content = ResourceUtil.getContent(bytes, providers, httpHeaders, String.class);
assertTrue(content instanceof List);
assertEquals(content, list);
}
@Test
public void shouldGetContentAsMap() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(Map.class), eq(Map.class), eq(new Annotation[]{}), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(map);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(Map.class, Map.class, new Annotation[]{}, mediaType)).thenReturn(reader);
Object content = ResourceUtil.getContent(bytes, providers, httpHeaders, Map.class);
assertTrue(content instanceof Map);
assertEquals(content, map);
}
@Test
public void shouldCheckIfStringIsCommaSeparated() {
assertTrue(ResourceUtil.isCommaSeparated("test,test1"));
assertFalse(ResourceUtil.isCommaSeparated("testtest1"));
}
@Test
public void shouldGetCommaSeparatedValues() {
assertEquals(ResourceUtil.getCommaSeparatedValues("test,test1"), new String[]{"test", "test1"});
assertEquals(ResourceUtil.getCommaSeparatedValues("testtest1"), new String[]{"testtest1"});
}
@Test
public void shouldInvokeMethodWithNoArguments() throws Throwable {
Map<String, Object> values = new HashMap<String, Object>();
DummyModel model = new DummyModel();
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(Map.class), eq(Map.class), isNull(Annotation[].class), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(values);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(Map.class, Map.class, null, mediaType)).thenReturn(reader);
assertEquals(ResourceUtil.invokeAction(model, "dummyAction", new ArrayList<ParameterMetaData>(), bytes, providers, httpHeaders, values), "dummy");
}
@Test
public void shouldInvokeMethodWithArguments() throws Throwable {
Map<String, Object> content = new HashMap<String, Object>();
content.put("value", "test123");
content.put("someNumber", 1L);
Map<String, Object> values = new HashMap<String, Object>();
DummyModel model = new DummyModel();
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(Map.class), eq(Map.class), isNull(Annotation[].class), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(content);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(Map.class, Map.class, null, mediaType)).thenReturn(reader);
assertEquals(ResourceUtil.invokeAction(model, "dummyActionWithArguments", Lists.newArrayList(new ParameterMetaData("value", "value", String.class),
new ParameterMetaData("someNumber", "someNumber", Long.class)), bytes, providers, httpHeaders, values), "dummyActionWithArguments");
}
@Test
public void shouldInvokeMethodWithArgumentsAndModel() throws Throwable {
Map<String, Object> content = new HashMap<String, Object>();
content.put("value", "test123");
content.put("someNumber", 1L);
Map<String, Object> values = new HashMap<String, Object>();
values.put("anotherModel", new DummyModel());
DummyModel model = new DummyModel();
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(Map.class), eq(Map.class), isNull(Annotation[].class), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(content);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(Map.class, Map.class, null, mediaType)).thenReturn(reader);
assertEquals(ResourceUtil.invokeAction(model, "dummyActionWithArgumentsAndModel", Lists.newArrayList(new ParameterMetaData("anotherModel", "anotherModel", DummyModel.class),
new ParameterMetaData("value", "value", String.class), new ParameterMetaData("someNumber", "someNumber", Long.class)), bytes, providers, httpHeaders, values), "dummyActionWithArgumentsAndModel");
}
@Test(expectedExceptions=MinnalInstrumentationException.class)
public void shouldThrowExceptionIfMethodNotFound() throws Throwable {
Map<String, Object> values = new HashMap<String, Object>();
DummyModel model = new DummyModel();
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(Map.class), eq(Map.class), isNull(Annotation[].class), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(values);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(Map.class, Map.class, null, mediaType)).thenReturn(reader);
ResourceUtil.invokeAction(model, "nonExistingMethod", Lists.newArrayList(new ParameterMetaData("anotherModel", "anotherModel", DummyModel.class)), bytes, providers, httpHeaders, values);
}
@Test(expectedExceptions=IllegalStateException.class)
public void shouldThrowExceptionIfMethodThrowsAnyException() throws Throwable {
Map<String, Object> values = new HashMap<String, Object>();
DummyModel model = new DummyModel();
byte[] bytes = new byte[10];
MediaType mediaType = mock(MediaType.class);
HttpHeaders httpHeaders = mock(HttpHeaders.class);
when(httpHeaders.getMediaType()).thenReturn(mediaType);
MessageBodyReader reader = mock(MessageBodyReader.class);
when(reader.readFrom(eq(Map.class), eq(Map.class), isNull(Annotation[].class), eq(mediaType), isNull(MultivaluedMap.class), any(InputStream.class))).thenReturn(values);
Providers providers = mock(Providers.class);
when(providers.getMessageBodyReader(Map.class, Map.class, null, mediaType)).thenReturn(reader);
ResourceUtil.invokeAction(model, "throwsException", new ArrayList<ParameterMetaData>(), bytes, providers, httpHeaders, values);
}
public static class DummyModel {
public String dummyAction() {
return "dummy";
}
public String dummyActionWithArguments(String value, Long someNumber) {
if (value == null || someNumber == null) {
throw new IllegalArgumentException();
}
return "dummyActionWithArguments";
}
public String dummyActionWithArgumentsAndModel(DummyModel anotherModel, String value, Long someNumber) {
if (value == null || someNumber == null || anotherModel == null) {
throw new IllegalArgumentException();
}
return "dummyActionWithArgumentsAndModel";
}
public void throwsException() {
throw new IllegalStateException();
}
}
}