package org.jooby.internal.couchbase; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.List; import org.jooby.couchbase.AsyncDatastore; import org.jooby.couchbase.AsyncDatastore.AsyncCommand; import org.jooby.couchbase.Datastore.ViewQueryResult; import org.jooby.test.MockUnit; import org.junit.Test; import com.couchbase.client.core.message.kv.MutationToken; import com.couchbase.client.java.PersistTo; import com.couchbase.client.java.ReplicaMode; import com.couchbase.client.java.ReplicateTo; import com.couchbase.client.java.error.DocumentDoesNotExistException; import com.couchbase.client.java.query.N1qlQuery; import com.couchbase.client.java.query.Statement; import com.couchbase.client.java.view.ViewQuery; import rx.Observable; @SuppressWarnings("rawtypes") public class DatastoreImplTest { @Test public void async() throws Exception { new MockUnit(AsyncDatastore.class) .run(unit -> { AsyncDatastore async = new DatastoreImpl(unit.get(AsyncDatastore.class)) .async(); assertEquals(unit.get(AsyncDatastore.class), async); }); } @SuppressWarnings("unchecked") @Test public void get() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.get(entity.getClass(), gid)).andReturn(just(entity)); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .get(entity.getClass(), gid); assertEquals(entity, result); }); } @Test(expected = DocumentDoesNotExistException.class) public void getNotFound() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.get(entity.getClass(), gid)).andReturn(Observable.empty()); }) .run(unit -> { new DatastoreImpl(unit.get(AsyncDatastore.class)) .get(entity.getClass(), gid); }); } @SuppressWarnings("unchecked") @Test public void getFromReplica() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.getFromReplica(entity.getClass(), gid, ReplicaMode.FIRST)) .andReturn(just(entity)); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .getFromReplica(entity.getClass(), gid, ReplicaMode.FIRST); assertEquals(entity, result); }); } @Test(expected = DocumentDoesNotExistException.class) public void getFromReplicaNotFound() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.getFromReplica(entity.getClass(), gid, ReplicaMode.FIRST)) .andReturn(Observable.empty()); }) .run(unit -> { new DatastoreImpl(unit.get(AsyncDatastore.class)) .getFromReplica(entity.getClass(), gid, ReplicaMode.FIRST); }); } @SuppressWarnings("unchecked") @Test public void getAndLock() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.getAndLock(entity.getClass(), gid, 1)) .andReturn(just(entity)); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .getAndLock(entity.getClass(), gid, 1); assertEquals(entity, result); }); } @Test(expected = DocumentDoesNotExistException.class) public void getAndLockNotFound() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.getAndLock(entity.getClass(), gid, 1)) .andReturn(Observable.empty()); }) .run(unit -> { new DatastoreImpl(unit.get(AsyncDatastore.class)) .getAndLock(entity.getClass(), gid, 1); }); } @SuppressWarnings("unchecked") @Test public void getAndTouch() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.getAndTouch(entity.getClass(), gid, 1)) .andReturn(just(entity)); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .getAndTouch(entity.getClass(), gid, 1); assertEquals(entity, result); }); } @Test(expected = DocumentDoesNotExistException.class) public void getAndTouchNotFound() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.getAndTouch(entity.getClass(), gid, 1)) .andReturn(Observable.empty()); }) .run(unit -> { new DatastoreImpl(unit.get(AsyncDatastore.class)) .getAndTouch(entity.getClass(), gid, 1); }); } @SuppressWarnings("unchecked") @Test public void exists() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.exists(entity.getClass(), gid)) .andReturn(just(true)); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .exists(entity.getClass(), gid); assertEquals(true, result); }); } @SuppressWarnings("unchecked") @Test public void query() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, N1qlQuery.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.query(unit.get(N1qlQuery.class))) .andReturn(just(Arrays.asList(entity))); }) .run(unit -> { List<Object> result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .query(unit.get(N1qlQuery.class)); assertEquals(Arrays.asList(entity), result); }); } @SuppressWarnings("unchecked") @Test public void queryStmt() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, Statement.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.query(unit.get(Statement.class))) .andReturn(just(Arrays.asList(entity))); }) .run(unit -> { List<Object> result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .query(unit.get(Statement.class)); assertEquals(Arrays.asList(entity), result); }); } @SuppressWarnings("unchecked") @Test public void viewQuery() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, ViewQuery.class) .expect(unit -> { AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.query(unit.get(ViewQuery.class))) .andReturn(just( new AsyncDatastore.AsyncViewQueryResult<Object>(10, just(Arrays.asList(entity))))); }) .run(unit -> { ViewQueryResult<Object> result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .query(unit.get(ViewQuery.class)); assertEquals(Arrays.asList(entity), result.getRows()); assertEquals(10, result.getTotalRows()); }); } @SuppressWarnings("unchecked") @Test public void upsert() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncCommand.class) .expect(unit -> { AsyncCommand cmd = unit.get(AsyncCommand.class); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.NONE)).andReturn(just(entity)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.upsert()).andReturn(cmd); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .upsert(entity); assertEquals(entity, result); }); } @SuppressWarnings("unchecked") @Test public void upsertWithReplicate() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncCommand.class) .expect(unit -> { AsyncCommand cmd = unit.get(AsyncCommand.class); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.ONE)).andReturn(just(entity)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.upsert()).andReturn(cmd); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .upsert() .execute(entity, ReplicateTo.ONE); assertEquals(entity, result); }); } @SuppressWarnings("unchecked") @Test public void insert() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncCommand.class) .expect(unit -> { AsyncCommand cmd = unit.get(AsyncCommand.class); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.NONE)).andReturn(just(entity)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.insert()).andReturn(cmd); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .insert(entity); assertEquals(entity, result); }); } @SuppressWarnings("unchecked") @Test public void replace() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncCommand.class) .expect(unit -> { AsyncCommand cmd = unit.get(AsyncCommand.class); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.NONE)).andReturn(just(entity)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.replace()).andReturn(cmd); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .replace(entity); assertEquals(entity, result); }); } @SuppressWarnings("unchecked") @Test public void remove() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncDatastore.AsyncRemoveCommand.class) .expect(unit -> { AsyncDatastore.AsyncRemoveCommand cmd = unit.get(AsyncDatastore.AsyncRemoveCommand.class); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.NONE)).andReturn(just(1L)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.remove()).andReturn(cmd); }) .run(unit -> { long result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .remove(entity); assertEquals(1L, result); }); } @SuppressWarnings("unchecked") @Test public void removeWithReplicate() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncDatastore.AsyncRemoveCommand.class) .expect(unit -> { AsyncDatastore.AsyncRemoveCommand cmd = unit.get(AsyncDatastore.AsyncRemoveCommand.class); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.ONE)).andReturn(just(1L)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.remove()).andReturn(cmd); }) .run(unit -> { long result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .remove() .execute(entity, ReplicateTo.ONE); assertEquals(1L, result); }); } @SuppressWarnings("unchecked") @Test public void removeById() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncDatastore.AsyncRemoveCommand.class) .expect(unit -> { AsyncDatastore.AsyncRemoveCommand cmd = unit.get(AsyncDatastore.AsyncRemoveCommand.class); expect(cmd.execute(entity.getClass(), gid, PersistTo.NONE, ReplicateTo.NONE)) .andReturn(just(1L)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.remove()).andReturn(cmd); }) .run(unit -> { long result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .remove(entity.getClass(), gid); assertEquals(1L, result); }); } @SuppressWarnings("unchecked") @Test public void removeByIdWithReplicate() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; new MockUnit(AsyncDatastore.class, AsyncDatastore.AsyncRemoveCommand.class) .expect(unit -> { AsyncDatastore.AsyncRemoveCommand cmd = unit.get(AsyncDatastore.AsyncRemoveCommand.class); expect(cmd.execute(entity.getClass(), gid, PersistTo.NONE, ReplicateTo.ONE)) .andReturn(just(1L)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.remove()).andReturn(cmd); }) .run(unit -> { long result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .remove() .execute(entity.getClass(), gid, ReplicateTo.ONE); assertEquals(1L, result); }); } @SuppressWarnings("unchecked") @Test public void commandprops() throws Exception { String gid = "id"; Object entity = new Object() { String id = gid; @Override public String toString() { return id; } }; MutationToken token = new MutationToken(0, 0, 0, gid); new MockUnit(AsyncDatastore.class, AsyncCommand.class) .expect(unit -> { AsyncCommand cmd = unit.get(AsyncCommand.class); expect(cmd.cas(10L)).andReturn(cmd); expect(cmd.expiry(3)).andReturn(cmd); expect(cmd.mutationToken(token)).andReturn(cmd); expect(cmd.execute(entity, PersistTo.NONE, ReplicateTo.NONE)).andReturn(just(entity)); AsyncDatastore store = unit.get(AsyncDatastore.class); expect(store.upsert()).andReturn(cmd); }) .run(unit -> { Object result = new DatastoreImpl(unit.get(AsyncDatastore.class)) .upsert() .cas(10L) .expiry(3) .mutationToken(token) .execute(entity); assertEquals(entity, result); }); } private Observable just(final Object entity) { return Observable.just(entity); } }