package org.jooby.internal.hazelcast; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import java.util.Map; import java.util.concurrent.TimeUnit; import org.jooby.Session; import org.jooby.hazelcast.HcastSessionStore; import org.jooby.test.MockUnit; import org.jooby.test.MockUnit.Block; import org.junit.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IMap; @SuppressWarnings("unchecked") public class HcastSessionStoreTest { private Block sessions = unit -> { HazelcastInstance hcast = unit.get(HazelcastInstance.class); expect(hcast.getMap("sessions")).andReturn(unit.get(IMap.class)); }; @Test public void defaults() throws Exception { new MockUnit(HazelcastInstance.class, IMap.class) .expect(sessions) .run(unit -> { new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "30m"); }); } @Test public void defaultsNoTimeout() throws Exception { new MockUnit(HazelcastInstance.class, IMap.class) .expect(sessions) .run(unit -> { new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "0"); }); } @Test public void get() throws Exception { Map<String, String> sessionMap = Maps .newHashMap( ImmutableMap.of("_accessedAt", "1", "_createdAt", "2", "_savedAt", "3", "k", "v")); new MockUnit(HazelcastInstance.class, IMap.class, Session.class, Session.Builder.class) .expect(sessions) .expect(unit -> { Session.Builder builder = unit.get(Session.Builder.class); expect(builder.sessionId()).andReturn("sid"); expect(builder.accessedAt(1)).andReturn(builder); expect(builder.createdAt(2)).andReturn(builder); expect(builder.savedAt(3)).andReturn(builder); expect(builder.set(ImmutableMap.of("k", "v"))).andReturn(builder); expect(builder.build()).andReturn(unit.get(Session.class)); }) .expect(unit -> { IMap<String, Object> session = unit.get(IMap.class); expect(session.get("sid")).andReturn(sessionMap); }) .run(unit -> { HcastSessionStore store = new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "30m"); assertEquals(unit.get(Session.class), store.get(unit.get(Session.Builder.class))); }); } @Test public void getNoSession() throws Exception { new MockUnit(HazelcastInstance.class, IMap.class, Session.class, Session.Builder.class) .expect(sessions) .expect(unit -> { Session.Builder builder = unit.get(Session.Builder.class); expect(builder.sessionId()).andReturn("sid"); }) .expect(unit -> { IMap<String, Object> session = unit.get(IMap.class); expect(session.get("sid")).andReturn(null); }) .run(unit -> { HcastSessionStore store = new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "30m"); assertEquals(null, store.get(unit.get(Session.Builder.class))); }); } @Test public void save() throws Exception { Map<String, String> sessionMap = ImmutableMap.of("k", "v"); new MockUnit(HazelcastInstance.class, IMap.class, Session.class) .expect(sessions) .expect(unit -> { Session session = unit.get(Session.class); expect(session.attributes()).andReturn(sessionMap); expect(session.createdAt()).andReturn(1L); expect(session.accessedAt()).andReturn(2L); expect(session.savedAt()).andReturn(3L); expect(session.id()).andReturn("sid"); }) .expect(unit -> { IMap<String, Object> session = unit.get(IMap.class); session.set("sid", ImmutableMap.of("_createdAt", "1", "_accessedAt", "2", "_savedAt", "3", "k", "v"), 1800, TimeUnit.SECONDS); }) .run(unit -> { HcastSessionStore store = new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "30m"); store.save(unit.get(Session.class)); }); } @Test public void create() throws Exception { Map<String, String> sessionMap = ImmutableMap.of("k", "v"); new MockUnit(HazelcastInstance.class, IMap.class, Session.class) .expect(sessions) .expect(unit -> { Session session = unit.get(Session.class); expect(session.attributes()).andReturn(sessionMap); expect(session.createdAt()).andReturn(1L); expect(session.accessedAt()).andReturn(2L); expect(session.savedAt()).andReturn(3L); expect(session.id()).andReturn("sid"); }) .expect(unit -> { IMap<String, Object> session = unit.get(IMap.class); session.set("sid", ImmutableMap.of("_createdAt", "1", "_accessedAt", "2", "_savedAt", "3", "k", "v"), 1800, TimeUnit.SECONDS); }) .run(unit -> { HcastSessionStore store = new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "30m"); store.create(unit.get(Session.class)); }); } @Test public void remove() throws Exception { new MockUnit(HazelcastInstance.class, IMap.class, Session.class) .expect(sessions) .expect(unit -> { IMap<String, Object> session = unit.get(IMap.class); expect(session.remove("sid")).andReturn(null); }) .run(unit -> { HcastSessionStore store = new HcastSessionStore(unit.get(HazelcastInstance.class), "sessions", "30m"); store.delete("sid"); }); } }