package org.jooby.internal; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import java.util.Collections; import java.util.Map; import org.jooby.test.MockUnit; import org.junit.Test; import com.google.inject.Key; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.internal.CircularDependencyProxy; public class RequestScopeTest { @Test public void enter() { RequestScope requestScope = new RequestScope(); requestScope.enter(Collections.emptyMap()); requestScope.exit(); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void scopedValue() throws Exception { RequestScope requestScope = new RequestScope(); Key<Object> key = Key.get(Object.class); Object value = new Object(); try { new MockUnit(Provider.class, Map.class) .expect(unit -> { Map scopedObjects = unit.get(Map.class); requestScope.enter(scopedObjects); expect(scopedObjects.get(key)).andReturn(null); expect(scopedObjects.containsKey(key)).andReturn(false); expect(scopedObjects.put(key, value)).andReturn(null); }) .expect(unit -> { Provider provider = unit.get(Provider.class); expect(provider.get()).andReturn(value); }) .run(unit -> { Object result = requestScope.<Object> scope(key, unit.get(Provider.class)).get(); assertEquals(value, result); }); } finally { requestScope.exit(); } } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void scopedNullValue() throws Exception { RequestScope requestScope = new RequestScope(); Key<Object> key = Key.get(Object.class); try { new MockUnit(Provider.class, Map.class) .expect(unit -> { Map scopedObjects = unit.get(Map.class); requestScope.enter(scopedObjects); expect(scopedObjects.get(key)).andReturn(null); expect(scopedObjects.containsKey(key)).andReturn(true); }) .run(unit -> { Object result = requestScope.<Object> scope(key, unit.get(Provider.class)).get(); assertEquals(null, result); }); } finally { requestScope.exit(); } } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void scopeExistingValue() throws Exception { RequestScope requestScope = new RequestScope(); Key<Object> key = Key.get(Object.class); Object value = new Object(); try { new MockUnit(Provider.class, Map.class) .expect(unit -> { Map scopedObjects = unit.get(Map.class); requestScope.enter(scopedObjects); expect(scopedObjects.get(key)).andReturn(value); }) .run(unit -> { Object result = requestScope.<Object> scope(key, unit.get(Provider.class)).get(); assertEquals(value, result); }); } finally { requestScope.exit(); } } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void circularScopedValue() throws Exception { RequestScope requestScope = new RequestScope(); Key<Object> key = Key.get(Object.class); try { new MockUnit(Provider.class, Map.class, CircularDependencyProxy.class) .expect(unit -> { Map scopedObjects = unit.get(Map.class); requestScope.enter(scopedObjects); expect(scopedObjects.get(key)).andReturn(null); expect(scopedObjects.containsKey(key)).andReturn(false); }) .expect(unit -> { Provider provider = unit.get(Provider.class); expect(provider.get()).andReturn(unit.get(CircularDependencyProxy.class)); }) .run(unit -> { Object result = requestScope.<Object> scope(key, unit.get(Provider.class)).get(); assertEquals(unit.get(CircularDependencyProxy.class), result); }); } finally { requestScope.exit(); } } @SuppressWarnings({"unchecked" }) @Test(expected = OutOfScopeException.class) public void outOfScope() throws Exception { RequestScope requestScope = new RequestScope(); Key<Object> key = Key.get(Object.class); Object value = new Object(); new MockUnit(Provider.class, Map.class) .run(unit -> { Object result = requestScope.<Object> scope(key, unit.get(Provider.class)).get(); assertEquals(value, result); }); } }