package com.google.sitebricks.binding;
import com.google.inject.Guice;
import com.google.inject.Provider;
import com.google.sitebricks.Evaluator;
import com.google.sitebricks.TestRequestCreator;
import org.testng.annotations.Test;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import static org.easymock.EasyMock.*;
/**
* @author Dhanji R. Prasanna (dhanji@gmail.com)
*/
public class MvelRequestBinderTest {
@Test
public final void bindRequestToPrimitives() {
final HttpServletRequest request = createMock(HttpServletRequest.class);
expect(request.getParameterMap())
.andReturn(new HashMap<String, String[]>() {{
put("name", new String[]{"Dhanji"});
put("age", new String[]{"27"});
put("alive", new String[]{"true"});
put("id", new String[]{"12"});
put("height", new String[]{"6.0"});
}});
replay(request);
final AnObject o = new AnObject();
final Evaluator evaluator = Guice.createInjector()
.getInstance(Evaluator.class);
new MvelRequestBinder(evaluator, new Provider<FlashCache>() {
public FlashCache get() {
return new HttpSessionFlashCache();
}
}).bind(TestRequestCreator.from(request, null), o);
assert "Dhanji".equals(o.getName());
assert 27 == (o.getAge());
assert 12L == (o.getId());
assert 6.0 == (o.getHeight());
assert (o.isAlive());
verify(request);
}
@Test
public final void bindRequestToCollections() {
final HttpServletRequest request = createMock(HttpServletRequest.class);
final String choice = "AChoice";
//setup preliminary request
final HttpSessionFlashCache cache = new HttpSessionFlashCache();
cache.put("names", Arrays.asList("First", choice, "BobLee", "JasonLee", "Mowglee"));
expect(request.getParameterMap())
.andReturn(new HashMap<String, String[]>() {{
put("select",
new String[]{RequestBinder.COLLECTION_BIND_PREFIX + "names/" + choice.hashCode()});
}});
replay(request);
final AnObject o = new AnObject();
final Evaluator evaluator = Guice.createInjector()
.getInstance(Evaluator.class);
new MvelRequestBinder(evaluator, new Provider<FlashCache>() {
public FlashCache get() {
return cache;
}
})
.bind(TestRequestCreator.from(request, null), o);
assert choice.equals(o.getSelect()) : "Collection selectee was not bound: " + o.getSelect();
verify(request);
}
@Test
public final void bindRequestToPrimitivesAndIgnoreExtras() {
final HttpServletRequest request = createMock(HttpServletRequest.class);
expect(request.getParameterMap())
.andReturn(new HashMap<String, String[]>() {{
put("name", new String[]{"Dhanji"});
put("age", new String[]{"27"});
put("alive", new String[]{"true"});
put("id", new String[]{"12"});
put("height", new String[]{"6.0"});
put("weight", new String[]{"6.0"});
put("hiphop", new String[]{"6.0"});
}});
replay(request);
final AnObject o = new AnObject();
final Evaluator evaluator = Guice.createInjector()
.getInstance(Evaluator.class);
new MvelRequestBinder(evaluator, new Provider<FlashCache>() {
public FlashCache get() {
return new HttpSessionFlashCache();
}
})
.bind(TestRequestCreator.from(request, null), o);
assert "Dhanji".equals(o.getName());
assert 27 == (o.getAge());
assert 12L == (o.getId());
assert 6.0 == (o.getHeight());
assert (o.isAlive());
verify(request);
}
@Test
public final void bindRequestDetectPartiallyInvalid() {
final HttpServletRequest request = createMock(HttpServletRequest.class);
expect(request.getParameterMap())
.andReturn(new HashMap<String, String[]>() {{
put("name.toString()", new String[]{"Dhanji"});
put("2 + 12", new String[]{"27"});
put("#@!*^&", new String[]{"true"});
put("id", new String[]{"12"});
put("heig-ht", new String[]{"6.0"});
}});
replay(request);
final AnObject o = new AnObject();
final AnObject expected = new AnObject();
expected.setId(12L);
final Evaluator evaluator = Guice.createInjector()
.getInstance(Evaluator.class);
new MvelRequestBinder(evaluator, new Provider<FlashCache>() {
public FlashCache get() {
return new HttpSessionFlashCache();
}
}).bind(TestRequestCreator.from(request, null), o);
System.out.println(o.getId());
assert expected.equals(o) : "Invalid binding was allowed!";
}
@Test
public final void bindRequestDetectTotallyInvalid() {
final HttpServletRequest request = createMock(HttpServletRequest.class);
expect(request.getParameterMap())
.andReturn(new HashMap<String, String[]>() {{
put("name.toString()", new String[]{"Dhanji"});
put("2 + 12", new String[]{"27"});
put("#@!*^&", new String[]{"true"});
put("i.d", new String[]{"12"});
put("hei-ght", new String[]{"6.0"});
}});
replay(request);
final AnObject o = new AnObject();
final Evaluator evaluator = Guice.createInjector()
.getInstance(Evaluator.class);
new MvelRequestBinder(evaluator, new Provider<FlashCache>() {
public FlashCache get() {
return new HttpSessionFlashCache();
}
})
.bind(TestRequestCreator.from(request, null), o);
assert new AnObject().equals(o) : "Invalid binding was allowed!";
}
@SuppressWarnings({"UnusedDeclaration"})
public static class AnObject {
private String name;
private int age;
private boolean alive;
private Long id;
private double height;
private String select;
public String getSelect() {
return select;
}
public void setSelect(String select) {
this.select = select;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AnObject anObject = (AnObject) o;
if (age != anObject.age) return false;
if (alive != anObject.alive) return false;
if (Double.compare(anObject.height, height) != 0) return false;
if (id != null ? !id.equals(anObject.id) : anObject.id != null) return false;
if (name != null ? !name.equals(anObject.name) : anObject.name != null) return false;
if (select != null ? !select.equals(anObject.select) : anObject.select != null) return false;
return true;
}
@Override
public int hashCode() {
int result;
long temp;
result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
result = 31 * result + (alive ? 1 : 0);
result = 31 * result + (id != null ? id.hashCode() : 0);
temp = height != +0.0d ? Double.doubleToLongBits(height) : 0L;
result = 31 * result + (int) (temp ^ (temp >>> 32));
result = 31 * result + (select != null ? select.hashCode() : 0);
return result;
}
}
}