package org.jooby.memcached; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import java.util.Collections; import java.util.HashMap; import java.util.Map; import net.spy.memcached.MemcachedClient; import org.jooby.Session; import org.jooby.Session.Builder; import org.jooby.test.MockUnit; import org.junit.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; public class SpySessionStoreTest { @Test public void defaults() throws Exception { new MockUnit(MemcachedClient.class) .run(unit -> { new SpySessionStore(unit.get(MemcachedClient.class), "sessions:", "30m"); }); } @Test public void get() throws Exception { Map<String, String> msession = Maps.newHashMap( ImmutableMap.of( "_accessedAt", "1", "_createdAt", "2", "_savedAt", "3", "foo", "bar" ) ); new MockUnit(MemcachedClient.class, Session.class, Session.Builder.class) .expect(unit -> { MemcachedClient client = unit.get(MemcachedClient.class); expect(client.get("sessions:sid")).andReturn(msession); expect(client.touch("sessions:sid", 1800)).andReturn(null); }) .expect(unit -> { Builder builder = unit.get(Session.Builder.class); expect(builder.sessionId()).andReturn("sid"); expect(builder.accessedAt(1L)).andReturn(builder); expect(builder.createdAt(2L)).andReturn(builder); expect(builder.savedAt(3L)).andReturn(builder); expect(builder.set(ImmutableMap.of("foo", "bar"))).andReturn(builder); expect(builder.build()).andReturn(unit.get(Session.class)); }) .run(unit -> { Session session = new SpySessionStore( unit.get(MemcachedClient.class), "sessions:", "30m" ).get(unit.get(Session.Builder.class)); assertEquals(unit.get(Session.class), session); }); } @Test public void getNullSession() throws Exception { Map<String, String> msession = null; new MockUnit(MemcachedClient.class, Session.Builder.class) .expect(unit -> { MemcachedClient client = unit.get(MemcachedClient.class); expect(client.get("sessions:sid")).andReturn(msession); }) .expect(unit -> { Builder builder = unit.get(Session.Builder.class); expect(builder.sessionId()).andReturn("sid"); }) .run(unit -> { Session session = new SpySessionStore( unit.get(MemcachedClient.class), "sessions:", "30m" ).get(unit.get(Session.Builder.class)); assertEquals(null, session); }); } @Test public void getEmptySession() throws Exception { Map<String, String> msession = Collections.emptyMap(); new MockUnit(MemcachedClient.class, Session.Builder.class) .expect(unit -> { MemcachedClient client = unit.get(MemcachedClient.class); expect(client.get("sessions:sid")).andReturn(msession); }) .expect(unit -> { Builder builder = unit.get(Session.Builder.class); expect(builder.sessionId()).andReturn("sid"); }) .run(unit -> { Session session = new SpySessionStore( unit.get(MemcachedClient.class), "sessions:", "30m" ).get(unit.get(Session.Builder.class)); assertEquals(null, session); }); } @Test public void save() throws Exception { Map<String, String> msession = ImmutableMap.of( "_accessedAt", "1", "_createdAt", "2", "_savedAt", "3", "foo", "bar" ); new MockUnit(MemcachedClient.class, Session.class, Session.Builder.class) .expect(unit -> { MemcachedClient client = unit.get(MemcachedClient.class); expect(client.set("sessions:sid", 1800, msession)).andReturn(null); }) .expect(unit -> { Session session = unit.get(Session.class); expect(session.id()).andReturn("sid"); expect(session.createdAt()).andReturn(2L); expect(session.accessedAt()).andReturn(1L); expect(session.savedAt()).andReturn(3L); expect(session.attributes()).andReturn(msession); }) .run(unit -> { new SpySessionStore( unit.get(MemcachedClient.class), "sessions:", "30m" ).save(unit.get(Session.class)); }); } @Test public void create() throws Exception { Map<String, String> msession = ImmutableMap.of( "_accessedAt", "1", "_createdAt", "2", "_savedAt", "3", "foo", "bar" ); new MockUnit(MemcachedClient.class, Session.class, Session.Builder.class) .expect(unit -> { MemcachedClient client = unit.get(MemcachedClient.class); expect(client.set("sessions:sid", 1800, msession)).andReturn(null); }) .expect(unit -> { Session session = unit.get(Session.class); expect(session.id()).andReturn("sid"); expect(session.createdAt()).andReturn(2L); expect(session.accessedAt()).andReturn(1L); expect(session.savedAt()).andReturn(3L); expect(session.attributes()).andReturn(msession); }) .run(unit -> { new SpySessionStore( unit.get(MemcachedClient.class), "sessions:", "1800" ).create(unit.get(Session.class)); }); } @Test public void delete() throws Exception { new MockUnit(MemcachedClient.class, Session.class, Session.Builder.class) .expect(unit -> { MemcachedClient client = unit.get(MemcachedClient.class); expect(client.replace("sessions:sid", 1, new HashMap<>())).andReturn(null); }) .run(unit -> { new SpySessionStore( unit.get(MemcachedClient.class), "sessions:", "30m" ).delete("sid"); }); } }