/*
* Copyright IBM Corp. 2014
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bluemix.todo.store;
import static org.easymock.EasyMock.createControl;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.getCurrentArguments;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.bluemix.todo.model.ToDo;
import org.bson.types.ObjectId;
import org.easymock.IAnswer;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteResult;
public class MongoStoreTest {
private DBCollection createMockCollection() {
IMocksControl control = createControl();
return control.createMock(DBCollection.class);
}
private DBCursor createMockCursor() {
IMocksControl control = createControl();
return control.createMock(DBCursor.class);
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testGetAll() {
DBCollection coll = createMockCollection();
DBCursor cursor = createMockCursor();
expect(cursor.hasNext()).andAnswer(new IAnswer<Boolean>() {
private int count = 0;
@Override
public Boolean answer() throws Throwable {
count++;
return count == 3 ? false : true;
}
}).anyTimes();
expect(cursor.next()).andAnswer(new IAnswer<DBObject>() {
private int count = 0;
@Override
public DBObject answer() throws Throwable {
count++;
BasicDBObject dbObj = new BasicDBObject();
dbObj.put("title", "This is todo " + count);
dbObj.put("completed", false);
dbObj.put("order", count);
//Object IDs must be 24 characters long
dbObj.put("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa" + count));
return dbObj;
}
}).anyTimes();
cursor.close();
expectLastCall();
replay(cursor);
expect(coll.find()).andReturn(cursor);
replay(coll);
MongoStore store = new MongoStore(coll);
Collection<ToDo> todos = store.getAll();
List<ToDo> testToDos = new ArrayList<ToDo>();
ToDo td1 = new ToDo();
td1.setId("aaaaaaaaaaaaaaaaaaaaaaa1");
td1.setTitle("This is todo 1");
td1.setOrder(1);
ToDo td2 = new ToDo();
td2.setId("aaaaaaaaaaaaaaaaaaaaaaa2");
td2.setTitle("This is todo 2");
td2.setOrder(2);
testToDos.add(td1);
testToDos.add(td2);
assertEquals(testToDos, todos);
verify(cursor);
verify(coll);
}
@Test
public void testGet() {
DBCollection coll = createMockCollection();
DBCursor cursor = createMockCursor();
expect(cursor.hasNext()).andAnswer(new IAnswer<Boolean>() {
private int count = 0;
@Override
public Boolean answer() throws Throwable {
count++;
return count == 2 ? false : true;
}
}).anyTimes();
expect(cursor.next()).andAnswer(new IAnswer<DBObject>() {
private int count = 0;
@Override
public DBObject answer() throws Throwable {
count++;
BasicDBObject dbObj = new BasicDBObject();
dbObj.put("title", "This is todo " + count);
dbObj.put("completed", false);
dbObj.put("order", count);
//Object IDs must be 24 characters long
dbObj.put("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa" + count));
return dbObj;
}
}).anyTimes();
cursor.close();
expectLastCall();
replay(cursor);
DBCursor emptyCursor = createMockCursor();
expect(emptyCursor.hasNext()).andReturn(false);
replay(emptyCursor);
expect(coll.find(eq(new BasicDBObject("_id", "aaaaaaaaaaaaaaaaaaaaaaa1")))).andReturn(cursor);
expect(coll.find(eq(new BasicDBObject("_id", "1")))).andReturn(emptyCursor);
replay(coll);
MongoStore store = new MongoStore(coll);
ToDo td = store.get("1");
assertNull(td);
td = store.get("aaaaaaaaaaaaaaaaaaaaaaa1");
ToDo td1 = new ToDo();
td1.setId("aaaaaaaaaaaaaaaaaaaaaaa1");
td1.setTitle("This is todo 1");
td1.setOrder(1);
assertEquals(td, td1);
verify(cursor);
verify(emptyCursor);
verify(coll);
}
@Test
public void testPersist() {
DBCollection coll = createMockCollection();
ToDo td = new ToDo();
td.setTitle("This is a test");
td.setId("aaaaaaaaaaaaaaaaaaaaaaa1");
expect(coll.insert(isA(DBObject.class))).andAnswer(new IAnswer<WriteResult>() {
@Override
public WriteResult answer() throws Throwable {
DBObject obj = (DBObject)getCurrentArguments()[0];
obj.put("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa1"));
return null;
}
});
replay(coll);
MongoStore store = new MongoStore(coll);
assertEquals(td, store.persist(td));
verify(coll);
}
@Test
public void testUpdate() {
DBCollection coll = createMockCollection();
DBCursor cursor = createMockCursor();
DBObject query = new BasicDBObject("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa2"));
DBObject dbObj = new BasicDBObject();
dbObj.put("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa2"));
dbObj.put("title", "new title");
dbObj.put("completed", true);
dbObj.put("order", 0);
expect(cursor.next()).andReturn(dbObj);
cursor.close();
expectLastCall();
replay(cursor);
expect(coll.find(eq(query))).andReturn(cursor);
ToDo newTd = new ToDo();
newTd.setId("aaaaaaaaaaaaaaaaaaaaaaa2");
newTd.setCompleted(true);
newTd.setTitle("new title");
newTd.setOrder(0);
expect(coll.update(eq(query), eq(dbObj))).andReturn(null);
replay(coll);
MongoStore store = new MongoStore(coll);
assertEquals(newTd, store.update("aaaaaaaaaaaaaaaaaaaaaaa2", newTd));
verify(cursor);
verify(coll);
}
@Test
public void testDelete() {
ToDo td = new ToDo();
td.setId("aaaaaaaaaaaaaaaaaaaaaaa2");
td.setTitle("this is a test");
BasicDBObject dbObj = new BasicDBObject();
dbObj.put("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa2"));
DBCollection coll = createMockCollection();
expect(coll.remove(eq(dbObj))).andReturn(null);
replay(coll);
MongoStore store = new MongoStore(coll);
store.delete("aaaaaaaaaaaaaaaaaaaaaaa2");
verify(coll);
}
@Test
public void testCount() throws Exception {
DBCollection coll = createMockCollection();
DBCursor cursor = createMockCursor();
expect(cursor.hasNext()).andAnswer(new IAnswer<Boolean>() {
private int count = 0;
@Override
public Boolean answer() throws Throwable {
count++;
return count == 3 ? false : true;
}
}).anyTimes();
expect(cursor.next()).andAnswer(new IAnswer<DBObject>() {
private int count = 0;
@Override
public DBObject answer() throws Throwable {
count++;
BasicDBObject dbObj = new BasicDBObject();
dbObj.put("title", "This is todo " + count);
dbObj.put("completed", false);
dbObj.put("order", count);
//Object IDs must be 24 characters long
dbObj.put("_id", new ObjectId("aaaaaaaaaaaaaaaaaaaaaaa" + count));
return dbObj;
}
}).anyTimes();
cursor.close();
expectLastCall();
replay(cursor);
expect(coll.find()).andReturn(cursor);
replay(coll);
MongoStore store = new MongoStore(coll);
assertEquals(2, store.count());
verify(cursor);
verify(coll);
}
}