package com.github.mongobee.dao; import static com.github.mongobee.changeset.ChangeEntry.CHANGELOG_COLLECTION; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.bson.Document; import org.junit.Test; import org.mockito.Mockito; import com.github.fakemongo.Fongo; import com.github.mongobee.exception.MongobeeConfigurationException; import com.mongodb.FongoMongoCollection; import com.mongodb.MongoClient; import com.mongodb.client.MongoDatabase; /** * @author lstolowski * @since 10.12.14 */ public class ChangeEntryDaoTest { private static final String TEST_SERVER = "testServer"; private static final String DB_NAME = "mongobeetest"; @Test public void shouldCreateChangeIdAuthorIndexIfNotFound() throws MongobeeConfigurationException { // given ChangeEntryDao dao = new ChangeEntryDao(); MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryIndexDao indexDaoMock = mock(ChangeEntryIndexDao.class); when(indexDaoMock.findRequiredChangeAndAuthorIndex(db)).thenReturn(null); dao.setIndexDao(indexDaoMock); // when dao.connectMongoDb(mongoClient, DB_NAME); //then verify(indexDaoMock, times(1)).createRequiredUniqueIndex(any(FongoMongoCollection.class)); // and not verify(indexDaoMock, times(0)).dropIndex(any(FongoMongoCollection.class), any(Document.class)); } @Test public void shouldNotCreateChangeIdAuthorIndexIfFound() throws MongobeeConfigurationException { // given MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryDao dao = new ChangeEntryDao(); ChangeEntryIndexDao indexDaoMock = mock(ChangeEntryIndexDao.class); when(indexDaoMock.findRequiredChangeAndAuthorIndex(db)).thenReturn(new Document()); when(indexDaoMock.isUnique(any(Document.class))).thenReturn(true); dao.setIndexDao(indexDaoMock); // when dao.connectMongoDb(mongoClient, DB_NAME); //then verify(indexDaoMock, times(0)).createRequiredUniqueIndex(db.getCollection(CHANGELOG_COLLECTION)); // and not verify(indexDaoMock, times(0)).dropIndex(db.getCollection(CHANGELOG_COLLECTION), new Document()); } @Test public void shouldRecreateChangeIdAuthorIndexIfFoundNotUnique() throws MongobeeConfigurationException { // given MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryDao dao = new ChangeEntryDao(); ChangeEntryIndexDao indexDaoMock = mock(ChangeEntryIndexDao.class); when(indexDaoMock.findRequiredChangeAndAuthorIndex(db)).thenReturn(new Document()); when(indexDaoMock.isUnique(any(Document.class))).thenReturn(false); dao.setIndexDao(indexDaoMock); // when dao.connectMongoDb(mongoClient, DB_NAME); //then verify(indexDaoMock, times(1)).dropIndex(any(FongoMongoCollection.class), any(Document.class)); // and verify(indexDaoMock, times(1)).createRequiredUniqueIndex(any(FongoMongoCollection.class)); } @Test public void shouldInitiateLock() throws MongobeeConfigurationException { // given MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryDao dao = new ChangeEntryDao(); ChangeEntryIndexDao indexDaoMock = mock(ChangeEntryIndexDao.class); dao.setIndexDao(indexDaoMock); LockDao lockDao = mock(LockDao.class); dao.setLockDao(lockDao); // when dao.connectMongoDb(mongoClient, DB_NAME); // then verify(lockDao).intitializeLock(db); } @Test public void shouldGetLockWhenLockDaoGetsLock() throws Exception { // given MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryDao dao = new ChangeEntryDao(); LockDao lockDao = mock(LockDao.class); when(lockDao.acquireLock(any(MongoDatabase.class))).thenReturn(true); dao.setLockDao(lockDao); dao.connectMongoDb(mongoClient, DB_NAME); // when boolean hasLock = dao.acquireProcessLock(); // then assertTrue(hasLock); } @Test public void shouldReleaseLockFromLockDao() throws Exception { // given MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryDao dao = new ChangeEntryDao(); LockDao lockDao = mock(LockDao.class); dao.setLockDao(lockDao); dao.connectMongoDb(mongoClient, DB_NAME); // when dao.releaseProcessLock(); // then verify(lockDao).releaseLock(any(MongoDatabase.class)); } @Test public void shouldCheckLockHeldFromFromLockDao() throws Exception { // given MongoClient mongoClient = mock(MongoClient.class); MongoDatabase db = new Fongo(TEST_SERVER).getDatabase(DB_NAME); when(mongoClient.getDatabase(anyString())).thenReturn(db); ChangeEntryDao dao = new ChangeEntryDao(); LockDao lockDao = mock(LockDao.class); dao.setLockDao(lockDao); dao.connectMongoDb(mongoClient, DB_NAME); // when when(lockDao.isLockHeld(db)).thenReturn(true); boolean lockHeld = dao.isProccessLockHeld(); // then assertTrue(lockHeld); } }