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; } } }