/*
* #%L
* Alfresco Records Management Module
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* License rights for this program may be obtained from Alfresco Software, Ltd.
* pursuant to a written agreement and any use of this program without such an
* agreement is prohibited.
* #L%
*/
package org.alfresco.bm.dataload.rm.site;
import static java.util.UUID.randomUUID;
import static org.alfresco.bm.data.DataCreationState.Failed;
import static org.alfresco.bm.data.DataCreationState.Scheduled;
import static org.alfresco.bm.data.DataCreationState.Created;
import static org.alfresco.bm.dataload.rm.site.CreateRMSite.DEFAULT_EVENT_NAME_SITE_CREATED;
import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.FIELD_SITE_ID;
import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.FIELD_SITE_MANAGER;
import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.FIELD_ONLY_DB_LOAD;
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.FILE_PLAN_ALIAS;
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.HOLDS_ALIAS;
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.TRANSFERS_ALIAS;
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.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.List;
import com.mongodb.DBObject;
import org.alfresco.bm.cm.FileFolderService;
import org.alfresco.bm.cm.FolderData;
import org.alfresco.bm.event.Event;
import org.alfresco.bm.event.EventResult;
import org.alfresco.bm.restapi.RestAPIFactory;
import org.alfresco.bm.site.SiteData;
import org.alfresco.bm.site.SiteDataService;
import org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponent;
import org.alfresco.rest.rm.community.model.site.RMSite;
import org.alfresco.rest.rm.community.requests.FilePlanComponentAPI;
import org.alfresco.rest.rm.community.requests.RMSiteAPI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
/**
* Unit test for prepare RM site event processor
*
* @author Tuna Aksoy
* @since 1.0
*/
@RunWith(MockitoJUnitRunner.class)
public class CreateRMSiteUnitTest
{
@Mock
private RestAPIFactory mockedRestAPIFactory;
@Mock
private SiteDataService mockedSiteDataService;
@Mock
private FileFolderService mockedFileFolderService;
@InjectMocks
private CreateRMSite createRMSite;
@Test(expected = IllegalArgumentException.class)
public void testWithNullEvent() throws Exception
{
createRMSite.processEvent(null);
}
@Test(expected = IllegalStateException.class)
public void testWithNullData() throws Exception
{
Event mockedEvent = mock(Event.class);
when(mockedEvent.getData()).thenReturn(null);
createRMSite.processEvent(mockedEvent);
}
@Test
public void testWithNullSiteId() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
when(mockedData.get(FIELD_SITE_ID)).thenReturn(null);
when(mockedEvent.getData()).thenReturn(mockedData);
EventResult result = createRMSite.processEvent(mockedEvent);
assertEquals(false, result.isSuccess());
assertEquals("Requests data not complete for site creation: " + mockedData, result.getData());
assertEquals(0, result.getNextEvents().size());
}
@Test
public void testWithNullSiteManager() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(null);
when(mockedEvent.getData()).thenReturn(mockedData);
EventResult result = createRMSite.processEvent(mockedEvent);
assertEquals(false, result.isSuccess());
assertEquals("Requests data not complete for site creation: " + mockedData, result.getData());
assertEquals(0, result.getNextEvents().size());
}
@Test
public void testWithNullSiteData() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
String siteId = randomUUID().toString();
when(mockedData.get(FIELD_SITE_ID)).thenReturn(siteId);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(randomUUID().toString());
when(mockedEvent.getData()).thenReturn(mockedData);
when(mockedSiteDataService.getSite(siteId)).thenReturn(null);
EventResult result = createRMSite.processEvent(mockedEvent);
assertEquals(false, result.isSuccess());
assertEquals("Site has been removed: " + siteId, result.getData());
assertEquals(0, result.getNextEvents().size());
}
@Test
public void testCreationStateNotScheduled() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
SiteData mockedSiteData = mock(SiteData.class);
String siteId = randomUUID().toString();
when(mockedData.get(FIELD_SITE_ID)).thenReturn(siteId);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(randomUUID().toString());
when(mockedEvent.getData()).thenReturn(mockedData);
when(mockedSiteDataService.getSite(siteId)).thenReturn(mockedSiteData);
when(mockedSiteData.getCreationState()).thenReturn(Failed);
EventResult result = createRMSite.processEvent(mockedEvent);
assertEquals(false, result.isSuccess());
assertEquals("Site state has changed: " + mockedSiteData, result.getData());
assertEquals(0, result.getNextEvents().size());
}
@Test
public void testCreationWhenRMSiteAleadyInDb() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
SiteData mockedSiteData = mock(SiteData.class);
String siteId = randomUUID().toString();
when(mockedData.get(FIELD_SITE_ID)).thenReturn(siteId);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(randomUUID().toString());
when(mockedEvent.getData()).thenReturn(mockedData);
when(mockedSiteDataService.getSite(siteId)).thenReturn(mockedSiteData);
when(mockedSiteData.getCreationState()).thenReturn(Created);
EventResult result = createRMSite.processEvent(mockedEvent);
assertEquals(false, result.isSuccess());
assertEquals("RM Site already exists in DB: " + mockedSiteData, result.getData());
assertEquals(0, result.getNextEvents().size());
}
@Test
public void testRMSiteCreation() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
SiteData mockedSiteData = mock(SiteData.class);
RMSiteAPI mockedRMSiteAPI = mock(RMSiteAPI.class);
RMSite mockedRMSite = mock(RMSite.class);
FilePlanComponentAPI mockedFilePlanComponentAPI = mock(FilePlanComponentAPI.class);
FilePlanComponent mockedFilePlan = mock(FilePlanComponent.class);
FilePlanComponent mockedUnfiledRecordsContainer = mock(FilePlanComponent.class);
FilePlanComponent mockedTransfers = mock(FilePlanComponent.class);
FilePlanComponent mockedHolds = mock(FilePlanComponent.class);
String siteId = randomUUID().toString();
String siteManager = randomUUID().toString();
when(mockedData.get(FIELD_SITE_ID)).thenReturn(siteId);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(siteManager);
when(mockedEvent.getData()).thenReturn(mockedData);
when(mockedSiteDataService.getSite(siteId)).thenReturn(mockedSiteData);
when(mockedSiteData.getCreationState()).thenReturn(Scheduled);
when(mockedRestAPIFactory.getRMSiteAPI(siteManager)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.createRMSite(any(RMSite.class))).thenReturn(mockedRMSite);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(true);
when(mockedRestAPIFactory.getFilePlanComponentAPI(siteManager)).thenReturn(mockedFilePlanComponentAPI);
when(mockedFilePlanComponentAPI.getFilePlanComponent(FILE_PLAN_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedFilePlan.getId()).thenReturn(randomUUID().toString());
when(mockedFilePlanComponentAPI.getFilePlanComponent(UNFILED_RECORDS_CONTAINER_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedUnfiledRecordsContainer.getId()).thenReturn(randomUUID().toString());
when(mockedFilePlanComponentAPI.getFilePlanComponent(TRANSFERS_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedTransfers.getId()).thenReturn(randomUUID().toString());
when(mockedFilePlanComponentAPI.getFilePlanComponent(HOLDS_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedHolds.getId()).thenReturn(randomUUID().toString());
EventResult result = createRMSite.processEvent(mockedEvent);
verify(mockedRMSiteAPI, times(1)).createRMSite(any(RMSite.class));
verify(mockedFileFolderService, times(4)).createNewFolder(any(FolderData.class));
assertEquals(true, result.isSuccess());
assertEquals("Created site: " + siteId + " Site creator: " + siteManager, (String) result.getData());
List<Event> events = result.getNextEvents();
assertEquals(1, events.size());
Event event = events.get(0);
assertEquals(DEFAULT_EVENT_NAME_SITE_CREATED, event.getName());
DBObject data = (DBObject) event.getData();
assertEquals(null, data);
}
@Test
public void testLoadingInDbExistendRmSite() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
SiteData mockedSiteData = mock(SiteData.class);
RMSiteAPI mockedRMSiteAPI = mock(RMSiteAPI.class);
RMSite mockedRMSite = mock(RMSite.class);
FilePlanComponentAPI mockedFilePlanComponentAPI = mock(FilePlanComponentAPI.class);
FilePlanComponent mockedFilePlan = mock(FilePlanComponent.class);
FilePlanComponent mockedUnfiledRecordsContainer = mock(FilePlanComponent.class);
FilePlanComponent mockedTransfers = mock(FilePlanComponent.class);
FilePlanComponent mockedHolds = mock(FilePlanComponent.class);
String siteId = randomUUID().toString();
String siteManager = randomUUID().toString();
when(mockedData.get(FIELD_SITE_ID)).thenReturn(siteId);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(siteManager);
when(mockedData.get(FIELD_ONLY_DB_LOAD)).thenReturn(true);
when(mockedEvent.getData()).thenReturn(mockedData);
when(mockedSiteDataService.getSite(siteId)).thenReturn(mockedSiteData);
when(mockedSiteData.getCreationState()).thenReturn(Scheduled);
when(mockedRestAPIFactory.getRMSiteAPI(siteManager)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(true);
String guuid = randomUUID().toString();
when(mockedRMSite.getGuid()).thenReturn(guuid);
when(mockedRMSiteAPI.getSite()).thenReturn(mockedRMSite);
when(mockedRestAPIFactory.getFilePlanComponentAPI(siteManager)).thenReturn(mockedFilePlanComponentAPI);
when(mockedFilePlanComponentAPI.getFilePlanComponent(FILE_PLAN_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedFilePlan.getId()).thenReturn(randomUUID().toString());
when(mockedFilePlanComponentAPI.getFilePlanComponent(UNFILED_RECORDS_CONTAINER_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedUnfiledRecordsContainer.getId()).thenReturn(randomUUID().toString());
when(mockedFilePlanComponentAPI.getFilePlanComponent(TRANSFERS_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedTransfers.getId()).thenReturn(randomUUID().toString());
when(mockedFilePlanComponentAPI.getFilePlanComponent(HOLDS_ALIAS.toString())).thenReturn(mockedFilePlan);
when(mockedHolds.getId()).thenReturn(randomUUID().toString());
EventResult result = createRMSite.processEvent(mockedEvent);
verify(mockedRMSiteAPI, never()).createRMSite(any(RMSite.class));
verify(mockedFileFolderService, times(4)).createNewFolder(any(FolderData.class));
assertEquals(true, result.isSuccess());
assertEquals("RM site already exists, just loading it in the DB.", (String) result.getData());
List<Event> events = result.getNextEvents();
assertEquals(1, events.size());
Event event = events.get(0);
assertEquals(DEFAULT_EVENT_NAME_SITE_CREATED, event.getName());
DBObject data = (DBObject) event.getData();
assertEquals(null, data);
}
@Test(expected = RuntimeException.class)
public void testRMSiteCreationExceptionThrown() throws Exception
{
Event mockedEvent = mock(Event.class);
DBObject mockedData = mock(DBObject.class);
SiteData mockedSiteData = mock(SiteData.class);
Exception mockedException = mock(RuntimeException.class);
String siteId = randomUUID().toString();
String siteManager = randomUUID().toString();
when(mockedData.get(FIELD_SITE_ID)).thenReturn(siteId);
when(mockedData.get(FIELD_SITE_MANAGER)).thenReturn(siteManager);
when(mockedEvent.getData()).thenReturn(mockedData);
when(mockedSiteDataService.getSite(siteId)).thenReturn(mockedSiteData);
when(mockedSiteData.getCreationState()).thenReturn(Scheduled);
when(mockedRestAPIFactory.getRMSiteAPI(siteManager)).thenThrow(mockedException);
when(mockedException.getMessage()).thenReturn(randomUUID().toString());
createRMSite.processEvent(mockedEvent);
}
}