package org.jooby.couchbase;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
import org.jooby.Session;
import org.jooby.Session.Builder;
import org.jooby.test.MockUnit;
import org.jooby.test.MockUnit.Block;
import org.junit.Test;
import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.document.JsonDocument;
import com.couchbase.client.java.document.json.JsonObject;
import com.google.common.collect.ImmutableMap;
public class CouchbaseSessionStoreTest {
@Test
public void createDocument() throws Exception {
new MockUnit(Bucket.class, Session.class)
.expect(session("sid", 2, 3, 4, "foo", "bar"))
.expect(unit -> {
Bucket bucket = unit.get(Bucket.class);
JsonDocument doc = JsonDocument.create("session::sid", 60, JsonObject.create()
.put("foo", "bar")
.put("_createdAt", 2L)
.put("_accessedAt", 3L)
.put("_savedAt", 4L));
expect(bucket.upsert(doc)).andReturn(doc);
})
.run(unit -> {
new CouchbaseSessionStore(unit.get(Bucket.class), "1m")
.create(unit.get(Session.class));
});
}
@Test
public void getDocument() throws Exception {
new MockUnit(Bucket.class, Session.Builder.class, Session.class)
.expect(unit -> {
JsonDocument doc = JsonDocument.create("session::sid", 60, JsonObject.create()
.put("foo", "bar")
.put("_createdAt", 2L)
.put("_accessedAt", 3L)
.put("_savedAt", 4L));
Builder builder = unit.get(Session.Builder.class);
expect(builder.sessionId()).andReturn("sid");
expect(builder.accessedAt(3L)).andReturn(builder);
expect(builder.createdAt(2L)).andReturn(builder);
expect(builder.savedAt(4L)).andReturn(builder);
expect(builder.set(ImmutableMap.of("foo", "bar"))).andReturn(builder);
expect(builder.build()).andReturn(unit.get(Session.class));
Bucket bucket = unit.get(Bucket.class);
expect(bucket.getAndTouch("session::sid", 60)).andReturn(doc);
})
.run(unit -> {
Session session = new CouchbaseSessionStore(unit.get(Bucket.class), "1m")
.get(unit.get(Session.Builder.class));
assertEquals(unit.get(Session.class), session);
});
}
@Test
public void deleteDocument() throws Exception {
new MockUnit(Bucket.class, Session.Builder.class, Session.class)
.expect(unit -> {
Bucket bucket = unit.get(Bucket.class);
expect(bucket.remove("session::rid")).andReturn(null);
})
.run(unit -> {
new CouchbaseSessionStore(unit.get(Bucket.class), "1m")
.delete("rid");
});
}
@Test
public void saveDocument() throws Exception {
new MockUnit(Bucket.class, Session.class)
.expect(session("sid", 2, 3, 4, "foo", "bar"))
.expect(unit -> {
Bucket bucket = unit.get(Bucket.class);
JsonDocument doc = JsonDocument.create("session::sid", 60, JsonObject.create()
.put("foo", "bar")
.put("_createdAt", 2L)
.put("_accessedAt", 3L)
.put("_savedAt", 4L));
expect(bucket.upsert(doc)).andReturn(doc);
})
.run(unit -> {
new CouchbaseSessionStore(unit.get(Bucket.class), "1m")
.save(unit.get(Session.class));
});
}
@Test
public void createDocumentWithSeconds() throws Exception {
new MockUnit(Bucket.class, Session.class)
.expect(session("sid", 2, 3, 4, "foo", "bar"))
.expect(unit -> {
Bucket bucket = unit.get(Bucket.class);
JsonDocument doc = JsonDocument.create("session::sid", 45, JsonObject.create()
.put("foo", "bar")
.put("_createdAt", 2L)
.put("_accessedAt", 3L)
.put("_savedAt", 4L));
expect(bucket.upsert(doc)).andReturn(doc);
})
.run(unit -> {
new CouchbaseSessionStore(unit.get(Bucket.class), "45")
.create(unit.get(Session.class));
});
}
@Test
public void createDocumentNoTimeout() throws Exception {
new MockUnit(Bucket.class, Session.class)
.expect(session("sid", 2, 3, 4, "foo", "bar"))
.expect(unit -> {
Bucket bucket = unit.get(Bucket.class);
JsonDocument doc = JsonDocument.create("session::sid", 0, JsonObject.create()
.put("foo", "bar")
.put("_createdAt", 2L)
.put("_accessedAt", 3L)
.put("_savedAt", 4L));
expect(bucket.upsert(doc)).andReturn(doc);
})
.run(unit -> {
new CouchbaseSessionStore(unit.get(Bucket.class), -1)
.create(unit.get(Session.class));
});
}
private Block session(final String id, final long createdAt, final long accessedAt,
final long savedAt,
final String... attributes) {
return unit -> {
Session session = unit.get(Session.class);
Map<String, String> hash = new HashMap<>();
for (int i = 0; i < attributes.length; i += 2) {
hash.put(attributes[i], attributes[i + 1]);
}
expect(session.attributes()).andReturn(hash);
expect(session.accessedAt()).andReturn(accessedAt);
expect(session.createdAt()).andReturn(createdAt);
expect(session.savedAt()).andReturn(savedAt);
expect(session.id()).andReturn(id);
};
}
}