/**
* Copyright (C) 2009-2012 the original author or authors.
* See the notice.md file distributed with this work for additional
* information regarding copyright ownership.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.fusesource.restygwt.client.basic;
import com.google.gwt.core.client.GWT;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.junit.client.GWTTestCase;
import org.fusesource.restygwt.client.*;
import org.fusesource.restygwt.rebind.RestServiceClassCreator;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import java.util.*;
/**
*
*
* @author mkristian
* @author Bogdan Mustiata <bogdan.mustiata@gmail.com>
*
*/
public class FormParamTestGwt extends GWTTestCase {
private FormParamTestRestService service;
@Override
public String getModuleName() {
return "org.fusesource.restygwt.EchoTestGwt";
}
@Path("/get")
static interface FormParamTestRestService extends RestService {
@POST
void get(@FormParam(value = "id") int id, MethodCallback<Echo> callback);
@POST
void get(@FormParam(value = "id") Integer id, MethodCallback<Echo> callback);
@POST
void twoParams(@FormParam(value = "id") int id, @FormParam(value = "dto") ExampleDto exampleDto, MethodCallback<Echo> callback);
@POST
void listParams(@FormParam(value = "dtoList") List<ExampleDto> exampleDtoList, MethodCallback<Echo> callback);
@POST
void listStringParams(@FormParam(value = "stringList") List<String> exampleStringList, MethodCallback<Echo> callback);
/**
* Method to check special handling of package "java.lang." in {@link RestServiceClassCreator#toIteratedFormStringExpression}
*/
@POST
void listStringBuilderParams(@FormParam(value = "stringBuilderList") List<java.lang.StringBuilder> exampleStringBuilderList, MethodCallback<Echo> callback);
@POST
void arrayParams(@FormParam(value = "dtoArray") ExampleDto[] exampleDtoArray, MethodCallback<Echo> callback);
@POST
void enumParam(@FormParam("param") FormParamTestEnum param, MethodCallback<Echo> callback);
}
enum FormParamTestEnum {
VALUE
}
class EchoMethodCallback implements MethodCallback<Echo> {
private final String id;
EchoMethodCallback(String id) {
this.id = id;
}
@Override
public void onSuccess(Method method, Echo response) {
GWT.log("method was called: " + response.params.get("id"));
assertEquals(response.params.get("id"), id);
assertEquals(response.params.size(), 1);
finishTest();
}
@Override
public void onFailure(Method method, Throwable exception) {
System.out.println("test failed");
fail();
}
}
@Override
protected void gwtSetUp() throws Exception {
super.gwtSetUp();
service = GWT.create(FormParamTestRestService.class);
Resource resource = new Resource(GWT.getModuleBaseURL() + "echo");
((RestServiceProxy) service).setResource(resource);
delayTestFinish(10000);
}
public void testGetWithInt() {
service.get(123, new EchoMethodCallback("123"));
}
public void testGetWithInteger() {
service.get(new Integer(2), new EchoMethodCallback("2"));
}
public void testGetWithNull() {
service.get(null, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertFalse(response.params.containsKey("id"));
assertEquals(response.params.size(), 0);
finishTest();
}
});
}
public interface ExampleDtoDecoder extends JsonEncoderDecoder<ExampleDto> {
}
public void testPostWithDto() {
final ExampleDtoDecoder dtoDecoder = GWT.create(ExampleDtoDecoder.class);
final ExampleDto dto = createDtoObject();
service.twoParams(3, dto, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertEquals(2, response.params.size());
assertEquals("3", response.params.get("id"));
JSONValue jsonDto = JSONParser.parseStrict(response.params.get("dto"));
assertEquals(dto, dtoDecoder.decode(jsonDto));
finishTest();
}
});
}
public void testPostWithDtoList() {
final ObjectEncoderDecoder objectEncoderDecoder = new ObjectEncoderDecoder();
final List<ExampleDto> dtoList = Collections.singletonList(createDtoObject());
service.listParams(dtoList, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertEquals(1, response.params.size());
JSONValue jsonDto = JSONParser.parseStrict(response.params.get("dtoList"));
final Object decoded_object = objectEncoderDecoder.decode(jsonDto);
if (decoded_object instanceof Collection) {
final Collection<String> decoded_list = (Collection<String>) decoded_object;
final List decoded_elem_list = new ArrayList();
for (final String json_elem : decoded_list) {
decoded_elem_list.add(objectEncoderDecoder.decode(json_elem));
}
assertEquals(createDtoObjectAsList(), decoded_elem_list);
} else {
assertEquals(createDtoObjectAsList(), Arrays.asList(decoded_object));
}
finishTest();
}
});
}
public void testPostWithStringList() {
final ObjectEncoderDecoder objectEncoderDecoder = new ObjectEncoderDecoder();
final List<String> stringList = Arrays.asList("test");
service.listStringParams(stringList, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertEquals(1, response.params.size());
JSONValue jsonValue = AbstractJsonEncoderDecoder.JSON_VALUE.decode(response.params.get("stringList"));
final Object decoded_object = objectEncoderDecoder.decode(jsonValue);
if (decoded_object instanceof Collection) {
final Collection<String> decoded_list = (Collection<String>) decoded_object;
final List decoded_elem_list = new ArrayList();
for (final String json_elem : decoded_list) {
decoded_elem_list.add(objectEncoderDecoder.decode(json_elem));
}
assertEquals(stringList, decoded_elem_list);
} else {
assertEquals(stringList, Arrays.asList(decoded_object));
}
finishTest();
}
});
}
/**
* Simple check of List equality, ignores difference of literal {@code null} and String "null"
* @param expected
* @param actual
*/
private void assertListEquals(List<Object> expected, List<Object> actual) {
assertEquals(expected.size(), actual.size());
for (int i = 0, size = expected.size(); i < size; i++) {
assertEquals(String.valueOf(expected.get(i)), String.valueOf(actual.get(i)));
}
}
/**
* Test to check special handling of package "java.lang." in {@link RestServiceClassCreator#toIteratedFormStringExpression}
*
* @see FormParamTestRestService#listStringBuilderParams(List, MethodCallback)
*/
public void testPostWithStringBuilderList() {
final ObjectEncoderDecoder objectEncoderDecoder = new ObjectEncoderDecoder();
final List stringBuilderList = Arrays.asList(new StringBuilder("Test StringBuilder"));
service.listStringBuilderParams(stringBuilderList, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertEquals(1, response.params.size());
JSONValue jsonValue = AbstractJsonEncoderDecoder.JSON_VALUE.decode(response.params.get("stringBuilderList"));
final Object decoded_object = objectEncoderDecoder.decode(jsonValue);
if (decoded_object instanceof Collection) {
final Collection<String> decoded_list = (Collection<String>) decoded_object;
final List decoded_elem_list = new ArrayList();
for (final String json_elem : decoded_list) {
decoded_elem_list.add(objectEncoderDecoder.decode(json_elem));
}
assertListEquals(stringBuilderList, decoded_elem_list);
} else {
assertListEquals(stringBuilderList, Arrays.asList(decoded_object));
}
finishTest();
}
});
}
public void testPostWithDtoArray() {
final ObjectEncoderDecoder objectEncoderDecoder = new ObjectEncoderDecoder();
final ExampleDto[] dtoList = new ExampleDto[] { createDtoObject() };
service.arrayParams(dtoList, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertEquals(1, response.params.size());
JSONValue jsonDto = JSONParser.parseStrict(response.params.get("dtoArray"));
assertEquals(createDtoObjectAsList(), objectEncoderDecoder.decode(jsonDto));
finishTest();
}
});
}
public void testPostWithEnum() {
service.enumParam(FormParamTestEnum.VALUE, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertEquals(1, response.params.size());
assertEquals("VALUE", response.params.get("param"));
finishTest();
}
});
}
public void testPostWithNullEnum() {
service.enumParam(null, new MethodCallback<Echo>() {
@Override
public void onFailure(Method method, Throwable exception) {
fail();
}
@Override
public void onSuccess(Method method, Echo response) {
assertTrue(response.params.isEmpty());
finishTest();
}
});
}
private List createDtoObjectAsList() {
ArrayList result = new ArrayList();
result.add(
map("name", "dtoName",
"complexMap1", map(
"1", "one",
"2", "two",
"3", "three"
),
"complexMap2", null,
"complexMap3", null,
"complexMap4", null,
"complexMap5", null,
"complexMap7", null,
"complexMap8", null,
"complexMap9", null,
"complexMap10", null,
"complexMap11", null
)
);
return result;
}
public HashMap map(Object... keyValues) {
HashMap result = new HashMap();
for (int i = 0; i < keyValues.length; i += 2) {
result.put(keyValues[i], keyValues[i + 1]);
}
return result;
}
private ExampleDto createDtoObject() {
final ExampleDto dto = new ExampleDto();
dto.name = "dtoName";
dto.complexMap1 = new HashMap<Integer, String>();
dto.complexMap1.put(1, "one");
dto.complexMap1.put(2, "two");
dto.complexMap1.put(3, "three");
return dto;
}
}