/*
* #%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 org.alfresco.bm.data.DataCreationState.Created;
import static org.alfresco.bm.data.DataCreationState.Scheduled;
import static org.alfresco.bm.dataload.rm.role.RMRole.ADMINISTRATOR;
import static org.alfresco.bm.dataload.rm.site.PrepareRMSite.DEFAULT_EVENT_NAME_RM_SITE_PREPARED;
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.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentCaptor.forClass;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.util.Assert.notNull;
import java.util.List;
import com.mongodb.DBObject;
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.bm.site.SiteMemberData;
import org.alfresco.bm.user.UserData;
import org.alfresco.bm.user.UserDataService;
import org.alfresco.rest.rm.community.requests.RMSiteAPI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
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 PrepareRMSiteUnitTest
{
private static final String RM_SITE_ID = "rm";
@Mock
private UserDataService mockedUserDataService;
@Mock
private SiteDataService mockedSiteDataService;
@Mock
private RestAPIFactory mockedRestAPIFactory;
@Mock RMSiteAPI mockedRMSiteAPI;
@InjectMocks
private PrepareRMSite prepareRMSite;
@Test
public void testCreateRMSiteFlagSetToFalseAndRMSiteDoesNotExist() throws Exception
{
String username = "bob";
String password = "secret";
Event mockedEvent = mock(Event.class);
prepareRMSite.setCreateRMSite(false);
prepareRMSite.setUsername(username);
prepareRMSite.setPassword(password);
when(mockedRestAPIFactory.getRMSiteAPI(username)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(false);
EventResult result = prepareRMSite.processEvent(mockedEvent);
// Check events
assertEquals(false, result.isSuccess());
assertEquals(0, result.getNextEvents().size());
assertEquals("RM Site creation not wanted.", result.getData());
}
@Test
public void testCreateRMSiteFlagSetToTrueAndRMSiteDoesNotExist() throws Exception
{
String username = "bob";
String password = "secret";
prepareRMSite.setCreateRMSite(true);
prepareRMSite.setUsername(username);
prepareRMSite.setPassword(password);
when(mockedRestAPIFactory.getRMSiteAPI(username)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(false);
EventResult result = prepareRMSite.processEvent(null);
ArgumentCaptor<UserData> userData = forClass(UserData.class);
verify(mockedUserDataService).createNewUser(userData.capture());
ArgumentCaptor<SiteData> siteData = forClass(SiteData.class);
verify(mockedSiteDataService).addSite(siteData.capture());
ArgumentCaptor<SiteMemberData> siteMemberData = forClass(SiteMemberData.class);
verify(mockedSiteDataService).addSiteMember(siteMemberData.capture());
// Check RM admin user
assertEquals(Created, userData.getValue().getCreationState());
// Check RM site
SiteData siteDataValue = siteData.getValue();
assertEquals(Scheduled, siteDataValue.getCreationState());
// Check RM admin member
SiteMemberData siteMemberDataValue = siteMemberData.getValue();
assertEquals(Created, siteMemberDataValue.getCreationState());
assertEquals(ADMINISTRATOR.toString(), siteMemberDataValue.getRole());
// Check events
assertEquals(true, result.isSuccess());
List<Event> events = result.getNextEvents();
assertEquals(1, events.size());
Event event = events.get(0);
assertEquals(DEFAULT_EVENT_NAME_RM_SITE_PREPARED, event.getName());
DBObject data = (DBObject) event.getData();
notNull(data);
assertEquals(siteDataValue.getSiteId(), (String) data.get(FIELD_SITE_ID));
assertEquals(username, (String) data.get(FIELD_SITE_MANAGER));
assertEquals(null, (String) data.get(FIELD_ONLY_DB_LOAD));
}
@Test
public void testRMSiteDoesExistAndNotLoadedInMongoDB() throws Exception
{
String username = "bob";
String password = "secret";
prepareRMSite.setCreateRMSite(true);
prepareRMSite.setUsername(username);
prepareRMSite.setPassword(password);
when(mockedRestAPIFactory.getRMSiteAPI(username)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(true);
EventResult result = prepareRMSite.processEvent(null);
ArgumentCaptor<UserData> userData = forClass(UserData.class);
verify(mockedUserDataService).createNewUser(userData.capture());
ArgumentCaptor<SiteData> siteData = forClass(SiteData.class);
verify(mockedSiteDataService).addSite(siteData.capture());
ArgumentCaptor<SiteMemberData> siteMemberData = forClass(SiteMemberData.class);
verify(mockedSiteDataService).addSiteMember(siteMemberData.capture());
// Check RM admin user
assertEquals(Created, userData.getValue().getCreationState());
// Check RM site
SiteData siteDataValue = siteData.getValue();
assertEquals(Scheduled, siteDataValue.getCreationState());
// Check RM admin member
SiteMemberData siteMemberDataValue = siteMemberData.getValue();
assertEquals(Created, siteMemberDataValue.getCreationState());
assertEquals(ADMINISTRATOR.toString(), siteMemberDataValue.getRole());
// Check events
assertEquals(true, result.isSuccess());
List<Event> events = result.getNextEvents();
assertEquals(1, events.size());
Event event = events.get(0);
assertEquals("loadRMSiteIntoDB", event.getName());
DBObject data = (DBObject) event.getData();
notNull(data);
assertEquals(siteDataValue.getSiteId(), (String) data.get(FIELD_SITE_ID));
assertEquals(username, (String) data.get(FIELD_SITE_MANAGER));
assertEquals(true, (Boolean) data.get(FIELD_ONLY_DB_LOAD));
}
@Test
public void testRMSiteDoesExistAndLoadedInMongoDB() throws Exception
{
String username = "bob";
String password = "secret";
prepareRMSite.setCreateRMSite(true);
prepareRMSite.setUsername(username);
prepareRMSite.setPassword(password);
when(mockedRestAPIFactory.getRMSiteAPI(username)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(true);
SiteData mockedSiteData = mock(SiteData.class);
when(mockedSiteData.getSiteId()).thenReturn(RM_SITE_ID);
when(mockedSiteData.getCreationState()).thenReturn(Created);
when(mockedSiteDataService.getSite(RM_SITE_ID)).thenReturn(mockedSiteData);
EventResult result = prepareRMSite.processEvent(null);
ArgumentCaptor<UserData> userData = forClass(UserData.class);
verify(mockedUserDataService).createNewUser(userData.capture());
verify(mockedSiteDataService, never()).addSite(any(SiteData.class));
verify(mockedSiteDataService, never()).addSiteMember(any(SiteMemberData.class));
// Check RM admin user
assertEquals(Created, userData.getValue().getCreationState());
// Check events
assertEquals(true, result.isSuccess());
assertEquals("RM Site already created, continue loading data.", result.getData());
List<Event> events = result.getNextEvents();
assertEquals(1, events.size());
Event event = events.get(0);
assertEquals("scheduleFilePlanLoaders", event.getName());
DBObject data = (DBObject) event.getData();
assertNull(data);
}
@Test
public void testRMSiteDoesNotExistAndLoadedInMongoDB() throws Exception
{
String username = "bob";
String password = "secret";
prepareRMSite.setCreateRMSite(true);
prepareRMSite.setUsername(username);
prepareRMSite.setPassword(password);
when(mockedRestAPIFactory.getRMSiteAPI(username)).thenReturn(mockedRMSiteAPI);
when(mockedRMSiteAPI.existsRMSite()).thenReturn(false);
SiteData mockedSiteData = mock(SiteData.class);
when(mockedSiteData.getSiteId()).thenReturn(RM_SITE_ID);
when(mockedSiteData.getCreationState()).thenReturn(Created);
when(mockedSiteDataService.getSite(RM_SITE_ID)).thenReturn(mockedSiteData);
EventResult result = prepareRMSite.processEvent(null);
ArgumentCaptor<UserData> userData = forClass(UserData.class);
verify(mockedUserDataService).createNewUser(userData.capture());
verify(mockedSiteDataService, never()).addSite(any(SiteData.class));
verify(mockedSiteDataService, never()).addSiteMember(any(SiteMemberData.class));
// Check RM admin user
assertEquals(Created, userData.getValue().getCreationState());
// Check events
assertEquals(true, result.isSuccess());
assertEquals("Preparing Records Management: \n", result.getData());
List<Event> events = result.getNextEvents();
assertEquals(1, events.size());
Event event = events.get(0);
assertEquals(DEFAULT_EVENT_NAME_RM_SITE_PREPARED, event.getName());
DBObject data = (DBObject) event.getData();
notNull(data);
assertEquals(mockedSiteData.getSiteId(), (String) data.get(FIELD_SITE_ID));
assertEquals(username, (String) data.get(FIELD_SITE_MANAGER));
assertEquals(null, (String) data.get(FIELD_ONLY_DB_LOAD));
}
}