/* * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * * Alfresco is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Alfresco is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */ package org.alfresco.bm.dataload.rm.unfiled; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.List; import org.alfresco.bm.cm.FileFolderService; import org.alfresco.bm.cm.FolderData; import org.alfresco.bm.dataload.RMEventConstants; import org.alfresco.bm.event.Event; import org.alfresco.bm.event.EventResult; import org.alfresco.bm.session.SessionService; import org.apache.commons.lang3.time.StopWatch; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.mongodb.DBObject; /** * Unit tests for ScheduleUnfiledRecordFolderLoaders * @author Silviu Dinuta * @since 1.0 */ @RunWith(MockitoJUnitRunner.class) public class ScheduleUnfiledRecordFolderLoadersUnitTest implements RMEventConstants { @Mock private SessionService mockedSessionService; @Mock private FileFolderService mockedFileFolderService; @InjectMocks private ScheduleUnfiledRecordFolderLoaders scheduleUnfiledRecordFolderLoaders; @Test public void testUnfiledRecordFoldersNotWanted() throws Exception { scheduleUnfiledRecordFolderLoaders.setCreateUnfiledRecordFolderStructure(false); EventResult result = scheduleUnfiledRecordFolderLoaders.processEvent(null, new StopWatch()); verify(mockedFileFolderService, never()).createNewFolder(any(FolderData.class)); verify(mockedSessionService, never()).startSession(any(DBObject.class)); assertEquals(false, result.isSuccess()); assertEquals("Unfiled Record Folders structure creation not wanted.",result.getData()); assertEquals(0, result.getNextEvents().size()); } @Test public void testScheduleRootUnfiledRecordFolders() throws Exception { int maxActiveLoaders = 8; int rootUnfiledRecordFolderNumber = 4; int unfiledRecordFoldersDepth = 1; String username = "bob"; scheduleUnfiledRecordFolderLoaders.setCreateUnfiledRecordFolderStructure(true); scheduleUnfiledRecordFolderLoaders.setMaxActiveLoaders(maxActiveLoaders); scheduleUnfiledRecordFolderLoaders.setUnfiledRecordFolderDepth(unfiledRecordFoldersDepth); scheduleUnfiledRecordFolderLoaders.setRootUnfiledRecordFolderNumber(rootUnfiledRecordFolderNumber); scheduleUnfiledRecordFolderLoaders.setUsername(username); FolderData mockedUnfiledRecordContainerFolder = mock(FolderData.class); when(mockedUnfiledRecordContainerFolder.getContext()).thenReturn(UNFILED_CONTEXT); when(mockedUnfiledRecordContainerFolder.getPath()).thenReturn("/a"); List<FolderData> folders = Arrays.asList(mockedUnfiledRecordContainerFolder); when(mockedFileFolderService.getFoldersByCounts(UNFILED_CONTEXT, 4L, 4L, 0L, Long.valueOf(rootUnfiledRecordFolderNumber-1), null, null, 0, 100)).thenReturn(folders); EventResult result = scheduleUnfiledRecordFolderLoaders.processEvent(null, new StopWatch()); verify(mockedFileFolderService, times(1)).createNewFolder(any(FolderData.class)); verify(mockedSessionService, times(1)).startSession(any(DBObject.class)); assertEquals(true, result.isSuccess()); assertEquals("Raised further 1 events and rescheduled self.",result.getData()); assertEquals(2, result.getNextEvents().size()); Event firstEvent = result.getNextEvents().get(0); assertEquals("loadUnfiledRecordFolders", firstEvent.getName()); DBObject dataObj = (DBObject)firstEvent.getData(); assertNotNull(dataObj); assertEquals(UNFILED_CONTEXT, (String) dataObj.get(FIELD_CONTEXT)); assertEquals("/a", (String) dataObj.get(FIELD_PATH)); assertEquals(Integer.valueOf(rootUnfiledRecordFolderNumber), (Integer) dataObj.get(FIELD_UNFILED_ROOT_FOLDERS_TO_CREATE)); assertEquals(Integer.valueOf(0), (Integer) dataObj.get(FIELD_UNFILED_FOLDERS_TO_CREATE)); assertEquals(username, (String) dataObj.get(FIELD_SITE_MANAGER)); assertEquals("scheduleUnfiledFoldersLoaders", result.getNextEvents().get(1).getName()); } @Test public void testScheduleRootUnfiledRecordFoldersWithDepth0() throws Exception { int maxActiveLoaders = 8; int rootUnfiledRecordFolderNumber = 4; int unfiledRecordFoldersDepth = 0; String username = "bob"; scheduleUnfiledRecordFolderLoaders.setCreateUnfiledRecordFolderStructure(true); scheduleUnfiledRecordFolderLoaders.setMaxActiveLoaders(maxActiveLoaders); scheduleUnfiledRecordFolderLoaders.setUnfiledRecordFolderDepth(unfiledRecordFoldersDepth); scheduleUnfiledRecordFolderLoaders.setRootUnfiledRecordFolderNumber(rootUnfiledRecordFolderNumber); scheduleUnfiledRecordFolderLoaders.setUsername(username); FolderData mockedUnfiledRecordContainerFolder = mock(FolderData.class); when(mockedUnfiledRecordContainerFolder.getContext()).thenReturn(UNFILED_CONTEXT); when(mockedUnfiledRecordContainerFolder.getPath()).thenReturn("/a"); List<FolderData> folders = Arrays.asList(mockedUnfiledRecordContainerFolder); when(mockedFileFolderService.getFoldersByCounts(UNFILED_CONTEXT, 4L, 4L, 0L, Long.valueOf(rootUnfiledRecordFolderNumber-1), null, null, 0, 100)).thenReturn(folders); EventResult result = scheduleUnfiledRecordFolderLoaders.processEvent(null, new StopWatch()); verify(mockedFileFolderService, never()).createNewFolder(any(FolderData.class)); verify(mockedSessionService, never()).startSession(any(DBObject.class)); assertEquals(true, result.isSuccess()); assertEquals("Loading completed. Raising 'done' event.",result.getData()); assertEquals(1, result.getNextEvents().size()); assertEquals("loadingUnfiledRecordFoldersComplete", result.getNextEvents().get(0).getName()); } @Test public void testScheduleUnfiledRecordFoldersChildren() throws Exception { int maxActiveLoaders = 8; int rootUnfiledRecordFolderNumber = 0; int unfiledRecordFolderChildrenNumber = 2; int unfiledRecordFolderDepth = 4; String username = "bob"; scheduleUnfiledRecordFolderLoaders.setCreateUnfiledRecordFolderStructure(true); scheduleUnfiledRecordFolderLoaders.setMaxActiveLoaders(maxActiveLoaders); scheduleUnfiledRecordFolderLoaders.setRootUnfiledRecordFolderNumber(rootUnfiledRecordFolderNumber); scheduleUnfiledRecordFolderLoaders.setUnfiledRecordFolderDepth(unfiledRecordFolderDepth); scheduleUnfiledRecordFolderLoaders.setUnfiledRecordFolderNumber(unfiledRecordFolderChildrenNumber); scheduleUnfiledRecordFolderLoaders.setUsername(username); FolderData mockedUnfiledRecordContainerFolder = mock(FolderData.class); when(mockedUnfiledRecordContainerFolder.getContext()).thenReturn(UNFILED_CONTEXT); when(mockedUnfiledRecordContainerFolder.getPath()).thenReturn("/a"); FolderData mockedUnfiledRecordContainerFolder2 = mock(FolderData.class); when(mockedUnfiledRecordContainerFolder2.getContext()).thenReturn(UNFILED_CONTEXT); when(mockedUnfiledRecordContainerFolder2.getPath()).thenReturn("/b"); List<FolderData> folders = Arrays.asList(mockedUnfiledRecordContainerFolder, mockedUnfiledRecordContainerFolder2); when(mockedFileFolderService.getFoldersByCounts(UNFILED_CONTEXT, Long.valueOf(UNFILED_RECORD_CONTAINER_LEVEL+1), Long.valueOf(scheduleUnfiledRecordFolderLoaders.getMaxLevel() - 1), 0L, Long.valueOf(unfiledRecordFolderChildrenNumber-1), null, null, 0, 100)).thenReturn(folders); EventResult result = scheduleUnfiledRecordFolderLoaders.processEvent(null, new StopWatch()); verify(mockedFileFolderService, times(2)).createNewFolder(any(FolderData.class)); verify(mockedSessionService, times(2)).startSession(any(DBObject.class)); assertEquals(true, result.isSuccess()); assertEquals("Raised further 2 events and rescheduled self.",result.getData()); assertEquals(3, result.getNextEvents().size()); Event firstEvent = result.getNextEvents().get(0); assertEquals("loadUnfiledRecordFolders", firstEvent.getName()); DBObject dataObj = (DBObject)firstEvent.getData(); assertNotNull(dataObj); assertEquals(UNFILED_CONTEXT, (String) dataObj.get(FIELD_CONTEXT)); assertEquals("/a", (String) dataObj.get(FIELD_PATH)); assertEquals(Integer.valueOf(rootUnfiledRecordFolderNumber), (Integer) dataObj.get(FIELD_UNFILED_ROOT_FOLDERS_TO_CREATE)); assertEquals(Integer.valueOf(unfiledRecordFolderChildrenNumber), (Integer) dataObj.get(FIELD_UNFILED_FOLDERS_TO_CREATE)); assertEquals(username, (String) dataObj.get(FIELD_SITE_MANAGER)); Event secondEvent = result.getNextEvents().get(1); assertEquals("loadUnfiledRecordFolders", secondEvent.getName()); dataObj = (DBObject)secondEvent.getData(); assertNotNull(dataObj); assertEquals(UNFILED_CONTEXT, (String) dataObj.get(FIELD_CONTEXT)); assertEquals("/b", (String) dataObj.get(FIELD_PATH)); assertEquals(Integer.valueOf(rootUnfiledRecordFolderNumber), (Integer) dataObj.get(FIELD_UNFILED_ROOT_FOLDERS_TO_CREATE)); assertEquals(Integer.valueOf(unfiledRecordFolderChildrenNumber), (Integer) dataObj.get(FIELD_UNFILED_FOLDERS_TO_CREATE)); assertEquals(username, (String) dataObj.get(FIELD_SITE_MANAGER)); assertEquals("scheduleUnfiledFoldersLoaders", result.getNextEvents().get(2).getName()); } @Test public void testScheduleUnfiledRecordFoldersChildrenWithDepthLessThan2() throws Exception { int maxActiveLoaders = 8; int rootUnfiledRecordFolderNumber = 0; int unfiledRecordFolderChildrenNumber = 2; int unfiledRecordFolderDepth = 1; String username = "bob"; scheduleUnfiledRecordFolderLoaders.setCreateUnfiledRecordFolderStructure(true); scheduleUnfiledRecordFolderLoaders.setMaxActiveLoaders(maxActiveLoaders); scheduleUnfiledRecordFolderLoaders.setRootUnfiledRecordFolderNumber(rootUnfiledRecordFolderNumber); scheduleUnfiledRecordFolderLoaders.setUnfiledRecordFolderDepth(unfiledRecordFolderDepth); scheduleUnfiledRecordFolderLoaders.setUnfiledRecordFolderNumber(unfiledRecordFolderChildrenNumber); scheduleUnfiledRecordFolderLoaders.setUsername(username); FolderData mockedUnfiledRecordContainerFolder = mock(FolderData.class); when(mockedUnfiledRecordContainerFolder.getContext()).thenReturn(UNFILED_CONTEXT); when(mockedUnfiledRecordContainerFolder.getPath()).thenReturn("/a"); FolderData mockedUnfiledRecordContainerFolder2 = mock(FolderData.class); when(mockedUnfiledRecordContainerFolder2.getContext()).thenReturn(UNFILED_CONTEXT); when(mockedUnfiledRecordContainerFolder2.getPath()).thenReturn("/b"); List<FolderData> folders = Arrays.asList(mockedUnfiledRecordContainerFolder, mockedUnfiledRecordContainerFolder2); when(mockedFileFolderService.getFoldersByCounts(UNFILED_CONTEXT, Long.valueOf(UNFILED_RECORD_CONTAINER_LEVEL+1), Long.valueOf(scheduleUnfiledRecordFolderLoaders.getMaxLevel() - 1), 0L, Long.valueOf(unfiledRecordFolderChildrenNumber-1), null, null, 0, 100)).thenReturn(folders); EventResult result = scheduleUnfiledRecordFolderLoaders.processEvent(null, new StopWatch()); verify(mockedFileFolderService, never()).createNewFolder(any(FolderData.class)); verify(mockedSessionService, never()).startSession(any(DBObject.class)); assertEquals(true, result.isSuccess()); assertEquals("Loading completed. Raising 'done' event.",result.getData()); assertEquals(1, result.getNextEvents().size()); assertEquals("loadingUnfiledRecordFoldersComplete", result.getNextEvents().get(0).getName()); } }