package com.constellio.app.modules.rm.ui.pages.folder; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import com.constellio.app.ui.params.ParamUtils; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.users.UserServices; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.app.modules.rm.RMEmailTemplateConstants; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.model.enums.FolderStatus; import com.constellio.app.modules.rm.model.labelTemplate.LabelTemplate; import com.constellio.app.modules.rm.navigation.RMViews; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.borrowingServices.BorrowingType; import com.constellio.app.modules.rm.services.events.RMEventsSearchServices; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.entities.UserCredentialVO; import com.constellio.app.ui.framework.components.ComponentState; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.app.ui.pages.base.UIContext; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.EmailToSend; import com.constellio.model.entities.records.wrappers.Event; import com.constellio.model.entities.records.wrappers.EventType; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.entities.security.Role; import com.constellio.model.services.records.RecordPhysicalDeleteOptions; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.model.services.security.roles.RolesManager; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.FakeSessionContext; import com.constellio.sdk.tests.SDKViewNavigation; import com.constellio.sdk.tests.setups.Users; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import java.util.*; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class DisplayFolderPresenterAcceptTest extends ConstellioTest { LocalDateTime shishOClock = new LocalDateTime().plusDays(1); Users users = new Users(); @Mock DisplayFolderView displayFolderView; SDKViewNavigation viewNavigation; @Mock UserCredentialVO chuckCredentialVO; RMTestRecords rmRecords = new RMTestRecords(zeCollection); SearchServices searchServices; DisplayFolderPresenter presenter; SessionContext sessionContext; @Mock UIContext uiContext; LocalDate nowDate = new LocalDate(); RMEventsSearchServices rmEventsSearchServices; RolesManager rolesManager; RMSchemasRecordsServices rmSchemasRecordsServices; MetadataSchemasManager metadataSchemasManager; RecordServices recordServices; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withConstellioRMModule().withAllTest(users).withRMTest(rmRecords) .withFoldersAndContainersOfEveryStatus().withEvents() ); inCollection(zeCollection).setCollectionTitleTo("Collection de test"); inCollection(zeCollection).giveWriteAccessTo(aliceWonderland); rmEventsSearchServices = new RMEventsSearchServices(getModelLayerFactory(), zeCollection); rmSchemasRecordsServices = new RMSchemasRecordsServices(zeCollection, getModelLayerFactory()); metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager(); recordServices = getModelLayerFactory().newRecordServices(); sessionContext = FakeSessionContext.forRealUserIncollection(users.chuckNorrisIn(zeCollection)); sessionContext.setCurrentLocale(Locale.FRENCH); searchServices = getModelLayerFactory().newSearchServices(); viewNavigation = new SDKViewNavigation(displayFolderView); when(displayFolderView.getSessionContext()).thenReturn(sessionContext); when(displayFolderView.getCollection()).thenReturn(zeCollection); when(displayFolderView.getConstellioFactories()).thenReturn(getConstellioFactories()); when(displayFolderView.getUIContext()).thenReturn(uiContext); chuckCredentialVO = new UserCredentialVO(); chuckCredentialVO.setUsername("chuck"); presenter = new DisplayFolderPresenter(displayFolderView);//spy( presenter.forParams("C30"); rolesManager = getModelLayerFactory().getRolesManager(); givenTimeIs(nowDate); } @Test public void givenInvalidPreviewReturnDateThenDoNotBorrow() throws Exception { displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); presenter.borrowFolder(nowDate, nowDate.minusDays(1), rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folderC30.getBorrowed()).isNull(); assertThat(folderC30.getBorrowDate()).isNull(); assertThat(folderC30.getBorrowReturnDate()).isNull(); assertThat(folderC30.getBorrowUser()).isNull(); assertThat(folderC30.getBorrowUserEntered()).isNull(); assertThat(folderC30.getBorrowType()).isNull(); assertThat( searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(rmRecords.getAdmin()))) .isEqualTo(0); } @Test public void givenInvalidBorrowingDateThenDoNotBorrow() throws Exception { displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); presenter.borrowFolder(nowDate.plusDays(1), nowDate.plusDays(15), rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folderC30.getBorrowed()).isNull(); assertThat(folderC30.getBorrowDate()).isNull(); assertThat(folderC30.getBorrowReturnDate()).isNull(); assertThat(folderC30.getBorrowUser()).isNull(); assertThat(folderC30.getBorrowUserEntered()).isNull(); assertThat(folderC30.getBorrowType()).isNull(); assertThat( searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(rmRecords.getAdmin()))) .isEqualTo(0); } @Test public void givenInvalidUserThenDoNotBorrow() throws Exception { displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); presenter.borrowFolder(nowDate, nowDate.minusDays(1), null, BorrowingType.BORROW, null); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folderC30.getBorrowed()).isNull(); assertThat(folderC30.getBorrowDate()).isNull(); assertThat(folderC30.getBorrowReturnDate()).isNull(); assertThat(folderC30.getBorrowUser()).isNull(); assertThat(folderC30.getBorrowUserEntered()).isNull(); assertThat(folderC30.getBorrowType()).isNull(); assertThat( searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(rmRecords.getAdmin()))) .isEqualTo(0); } @Test public void whenBorrowFolderThenOk() throws Exception { displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); User chuck = rmRecords.getChuckNorris(); presenter.borrowFolder(nowDate, nowDate, chuck.getId(), BorrowingType.BORROW, null); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folderC30.getBorrowed()).isTrue(); assertThat(folderC30.getBorrowDate().toDate()).isEqualTo(nowDate.toDate()); assertThat(folderC30.getBorrowReturnDate()).isNull(); assertThat(folderC30.getBorrowUser()).isEqualTo(rmRecords.getChuckNorris().getId()); assertThat(folderC30.getBorrowUserEntered()).isEqualTo(rmRecords.getChuckNorris().getId()); assertThat(folderC30.getBorrowType()).isEqualTo(BorrowingType.BORROW); assertThat( searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(rmRecords.getAdmin()))) .isEqualTo(1); assertThat(presenter.getBorrowMessageState(folderC30)) .isEqualTo("Dossier emprunté par " + chuck.getTitle() + " le " + nowDate); } @Test //FIXME Ugly sleep public void givenBorrowFolderWhenReturnItThenOk() throws Exception { displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); LocalDate borrowingLocalDate = nowDate; presenter .borrowFolder(borrowingLocalDate, nowDate, rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); nowDate = nowDate.plusDays(5); givenTimeIs(nowDate); presenter.forParams("C30"); presenter.returnFolder(nowDate.minusDays(1), borrowingLocalDate); recordServices.flush(); // Thread.sleep(1000); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getBorrowed()).isNull(); assertThat(folderC30.getBorrowDate()).isNull(); assertThat(folderC30.getBorrowReturnDate()).isNull(); assertThat(folderC30.getBorrowUser()).isNull(); assertThat(folderC30.getBorrowUserEntered()).isNull(); assertThat(folderC30.getBorrowType()).isNull(); assertThat( searchServices .getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(rmRecords.getChuckNorris()))) .isEqualTo(0); List<Record> records = searchServices.search(rmEventsSearchServices.newFindEventByDateRangeAndByUserIdQuery( this.rmRecords.getChuckNorris(), EventType.RETURN_FOLDER, nowDate.minusDays(1).toDateTimeAtStartOfDay().toLocalDateTime(), nowDate.plusDays(1).toDateTimeAtStartOfDay().toLocalDateTime(), this.rmRecords.getChuckNorris().getId())); assertThat(records).hasSize(1); Event event = new Event(records.get(0), getSchemaTypes()); assertThat(event.getUsername()).isEqualTo(this.rmRecords.getChuckNorris().getUsername()); assertThat(event.getType()).isEqualTo(EventType.RETURN_FOLDER); assertThat(presenter.getBorrowMessageState(folderC30)).isNull(); //TODO Francis assertThat(event.getCreatedOn().toLocalDate()).isEqualTo(nowDate.minusDays(1)); } @Test public void givenBorrowFolderWhenReturnItWithAInvalideReturnDateItThenDoNotReturnIt() throws Exception { displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); LocalDate borrowingDate = nowDate; User chuck = rmRecords.getChuckNorris(); presenter.borrowFolder(nowDate, nowDate, chuck.getId(), BorrowingType.BORROW, null); givenTimeIs(nowDate.plusDays(1)); presenter.forParams("C30"); presenter.returnFolder(nowDate.minusDays(2), borrowingDate); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folderC30.getBorrowed()).isTrue(); assertThat(folderC30.getBorrowDate().toDate()).isEqualTo(nowDate.toDate()); assertThat(folderC30.getBorrowReturnDate()).isNull(); assertThat(folderC30.getBorrowUser()).isEqualTo(chuck.getId()); assertThat(folderC30.getBorrowUserEntered()).isEqualTo(chuck.getId()); assertThat(folderC30.getBorrowType()).isEqualTo(BorrowingType.BORROW); assertThat( searchServices.getResultsCount(rmEventsSearchServices.newFindCurrentlyBorrowedFoldersQuery(rmRecords.getAdmin()))) .isEqualTo(1); assertThat(presenter.getBorrowMessageState(folderC30)).isEqualTo( "Dossier emprunté par " + chuck.getTitle() + " le " + nowDate); } @Test public void givenSemiACtiveBorrowedFolderAndRemovedPermissionToModifySemiActiveBorrwedFolderAndGivenBackThenOk() throws Exception { givenRemovedPermissionToModifyBorrowedFolder(RMPermissionsTo.MODIFY_SEMIACTIVE_BORROWED_FOLDER); displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); assertThat(presenter.getDeleteButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isFalse(); assertThat(presenter.getEditButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isFalse(); assertThat(presenter.getAddFolderButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()) .isFalse(); assertThat(presenter.getAddDocumentButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()) .isFalse(); assertThat(presenter.getPrintButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isFalse(); givenNoRemovedPermissionsToModifyBorrowedFolder(); displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); displayFolderView.navigate().to(RMViews.class).displayFolder("C30"); assertThat(presenter.getDeleteButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isTrue(); assertThat(presenter.getEditButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isTrue(); assertThat(presenter.getAddFolderButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isTrue(); assertThat(presenter.getAddDocumentButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()) .isTrue(); assertThat(presenter.getPrintButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C30()).isVisible()).isTrue(); } @Test public void givenInactiveBorrowedFolderAndRemovedPermissionToModifyInactiveBorrwedFolderAndGivenBackThenOk() throws Exception { presenter.forParams("C50"); givenRemovedPermissionToModifyBorrowedFolder(RMPermissionsTo.MODIFY_INACTIVE_BORROWED_FOLDER); displayFolderView.navigate().to(RMViews.class).displayFolder("C50"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); displayFolderView.navigate().to(RMViews.class).displayFolder("C50"); assertThat(presenter.getDeleteButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isFalse(); assertThat(presenter.getEditButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isFalse(); assertThat(presenter.getAddFolderButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()) .isFalse(); assertThat(presenter.getAddDocumentButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()) .isFalse(); assertThat(presenter.getPrintButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isFalse(); givenNoRemovedPermissionsToModifyBorrowedFolder(); displayFolderView.navigate().to(RMViews.class).displayFolder("C50"); displayFolderView.navigate().to(RMViews.class).displayFolder("C50"); assertThat(presenter.getDeleteButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isTrue(); assertThat(presenter.getEditButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isTrue(); assertThat(presenter.getAddFolderButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isTrue(); assertThat(presenter.getAddDocumentButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()) .isTrue(); assertThat(presenter.getPrintButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_C50()).isVisible()).isTrue(); } @Test public void givenImportedFolderAndRemovedPermissionToShareImportedFolderAndGivenBackThenOk() throws Exception { recordServices.update(record("A16").set(Schemas.LEGACY_ID, "ChatLegacy")); Map<String, String> params = new HashMap<>(); params.put("id", "A16"); presenter.forParams("A16");//ParamUtils.addParams("", params)); givenRemovedPermissionToShareImportedFolder(); displayFolderView.navigate().to(RMViews.class).displayFolder("A16"); assertThat(presenter.getShareButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_A16()).isVisible()).isFalse(); givenNoRemovedPermissionsToShareImportedFolder(); displayFolderView.navigate().to(RMViews.class).displayFolder("A16"); assertThat(presenter.getShareButtonState(rmRecords.getChuckNorris(), rmRecords.getFolder_A16()).isVisible()).isTrue(); } @Test public void whenGetTemplatesThenReturnFolderTemplates() throws Exception { List<LabelTemplate> labelTemplates = presenter.getDefaultTemplates(); assertThat(labelTemplates).hasSize(8); assertThat(labelTemplates.get(0).getKey()).isEqualTo("FOLDER_RIGHT_AVERY_5159"); assertThat(labelTemplates.get(0).getName()).isEqualTo("Code de plan justifié à droite (Avery 5159)"); assertThat(labelTemplates.get(1).getKey()).isEqualTo("FOLDER_RIGHT_AVERY_5161"); assertThat(labelTemplates.get(1).getName()).isEqualTo("Code de plan justifié à droite (Avery 5161)"); assertThat(labelTemplates.get(2).getKey()).isEqualTo("FOLDER_RIGHT_AVERY_5162"); assertThat(labelTemplates.get(2).getName()).isEqualTo("Code de plan justifié à droite (Avery 5162)"); assertThat(labelTemplates.get(3).getKey()).isEqualTo("FOLDER_RIGHT_AVERY_5163"); assertThat(labelTemplates.get(3).getName()).isEqualTo("Code de plan justifié à droite (Avery 5163)"); assertThat(labelTemplates.get(4).getKey()).isEqualTo("FOLDER_LEFT_AVERY_5159"); assertThat(labelTemplates.get(4).getName()).isEqualTo("Code de plan justifié à gauche (Avery 5159)"); assertThat(labelTemplates.get(5).getKey()).isEqualTo("FOLDER_LEFT_AVERY_5161"); assertThat(labelTemplates.get(5).getName()).isEqualTo("Code de plan justifié à gauche (Avery 5161)"); assertThat(labelTemplates.get(6).getKey()).isEqualTo("FOLDER_LEFT_AVERY_5162"); assertThat(labelTemplates.get(6).getName()).isEqualTo("Code de plan justifié à gauche (Avery 5162)"); assertThat(labelTemplates.get(7).getKey()).isEqualTo("FOLDER_LEFT_AVERY_5163"); assertThat(labelTemplates.get(7).getName()).isEqualTo("Code de plan justifié à gauche (Avery 5163)"); } @Test public void givenBorrowedFolderWhenRemindingReturnThenOk() throws Exception { givenTimeIs(shishOClock); presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); Folder folderC30 = rmRecords.getFolder_C30(); presenter.forParams("C30"); presenter.reminderReturnFolder(); Metadata subjectMetadata = metadataSchemasManager.getSchemaTypes(zeCollection) .getMetadata(EmailToSend.DEFAULT_SCHEMA + "_" + EmailToSend.SUBJECT); LogicalSearchCondition condition = from(getSchemaTypes().getSchemaType(EmailToSend.SCHEMA_TYPE)) .where(subjectMetadata).isContainingText($("DisplayFolderView.returnFolderReminder") + folderC30.getTitle()); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); List<Record> emailToSendRecords = searchServices.search(query); assertThat(emailToSendRecords).hasSize(1); EmailToSend emailToSend = new EmailToSend(emailToSendRecords.get(0), getSchemaTypes()); assertThat(emailToSend.getSendOn()).isEqualTo(shishOClock); assertThat(emailToSend.getSubject()).isEqualTo($("DisplayFolderView.returnFolderReminder") + folderC30.getTitle()); assertThat(emailToSend.getTemplate()).isEqualTo(RMEmailTemplateConstants.REMIND_BORROW_TEMPLATE_ID); assertThat(emailToSend.getTo().get(0).getEmail()) .isEqualTo(rmSchemasRecordsServices.getUser(folderC30.getBorrowUser()).getEmail()); assertThat(emailToSend.getTo().get(0).getName()) .isEqualTo(rmSchemasRecordsServices.getUser(folderC30.getBorrowUser()).getTitle()); assertThat(emailToSend.getError()).isNull(); assertThat(emailToSend.getTryingCount()).isEqualTo(0); assertThat(emailToSend.getParameters()).hasSize(4); assertThat(emailToSend.getParameters().get(0)).isEqualTo("previewReturnDate:" + folderC30.getBorrowPreviewReturnDate()); assertThat(emailToSend.getParameters().get(1)) .isEqualTo("borrower:" + chuckNorris); assertThat(emailToSend.getParameters().get(2)).isEqualTo("borrowedFolderTitle:" + folderC30.getTitle()); assertThat(emailToSend.getParameters().get(3)) .isEqualTo("title:" + $("DisplayFolderView.returnFolderReminder") + " \"" + folderC30.getTitle() + "\""); assertThat(emailToSend.getFrom()).isEqualTo(null); verify(displayFolderView).showMessage($("DisplayFolderView.reminderEmailSent")); } // @Test public void givenNoBorrowedFolderThenRemiderButtonIsNotVisible() throws Exception { User currentUser = rmRecords.getChuckNorris(); presenter.forParams("C30"); assertThat(presenter.getReminderReturnFolderButtonState(currentUser, rmRecords.getFolder_C30()).isVisible()).isFalse(); } @Test public void givenBorrowedFolderAndBorrowerThenReminderButtonIsNotVisible() throws Exception { User currentUser = rmRecords.getChuckNorris(); presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); assertThat(presenter.getReminderReturnFolderButtonState(currentUser, rmRecords.getFolder_C30()).isVisible()).isFalse(); } @Test public void givenBorrowedFolderAndAnotherUserThenReminderButtonIsVisible() throws Exception { User currentUser = rmRecords.getChuckNorris(); presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, currentUser.getId(), BorrowingType.BORROW, null); sessionContext = FakeSessionContext.bobInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(displayFolderView.getSessionContext()).thenReturn(sessionContext); currentUser = rmRecords.getBob_userInAC(); presenter = new DisplayFolderPresenter(displayFolderView); presenter.forParams("C30"); assertThat(presenter.getAlertWhenAvailableButtonState(currentUser, rmRecords.getFolder_C30()).isVisible()).isTrue(); } // @Test public void givenNoBorrowedFolderThenAlertButtonIsNotVisible() throws Exception { User currentUser = rmRecords.getChuckNorris(); presenter.forParams("C30"); assertThat(presenter.getAlertWhenAvailableButtonState(currentUser, rmRecords.getFolder_C30()).isVisible()).isFalse(); } @Test public void givenBorrowedFolderAndBorrowerThenAlertButtonIsNotVisible() throws Exception { User currentUser = rmRecords.getChuckNorris(); presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getChuckNorris().getId(), BorrowingType.BORROW, null); assertThat(presenter.getAlertWhenAvailableButtonState(currentUser, rmRecords.getFolder_C30()).isVisible()).isFalse(); } @Test public void givenBorrowedFolderAndAnotherUserThenAlertButtonIsVisible() throws Exception { User currentUser = rmRecords.getChuckNorris(); presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, currentUser.getId(), BorrowingType.BORROW, null); sessionContext = FakeSessionContext.bobInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(displayFolderView.getSessionContext()).thenReturn(sessionContext); currentUser = rmRecords.getBob_userInAC(); presenter = new DisplayFolderPresenter(displayFolderView); presenter.forParams("C30"); assertThat(presenter.getAlertWhenAvailableButtonState(currentUser, rmRecords.getFolder_C30()).isVisible()).isTrue(); } @Test public void whenAlertWhenAvailableThenOk() throws Exception { presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getCharles_userInA().getId(), BorrowingType.BORROW, null); presenter.alertWhenAvailable(); connectWithBob(); presenter.forParams("C30"); presenter.alertWhenAvailable(); connectWithAlice(); presenter.forParams("C30"); presenter.alertWhenAvailable(); Folder folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getAlertUsersWhenAvailable()).containsOnly( rmRecords.getAlice().getId(), rmRecords.getBob_userInAC().getId()); } @Test public void givenSomeUsersToAlertWhenAlertWhenAvailableClickedManyTimeThenAlertOnceToEachUser() throws Exception { Folder folderC30 = rmRecords.getFolder_C30(); recordServices.update(folderC30.setAlertUsersWhenAvailable(asList(users.aliceIn(zeCollection).getId()))); assertThat(folderC30.getAlertUsersWhenAvailable()).containsOnly(rmRecords.getAlice().getId()); presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getCharles_userInA().getId(), BorrowingType.BORROW, null); presenter.forParams("C30"); presenter.alertWhenAvailable(); presenter.alertWhenAvailable(); assertThat(folderC30.getAlertUsersWhenAvailable()).containsOnly(rmRecords.getAlice().getId()); connectWithBob(); presenter.forParams("C30"); presenter.alertWhenAvailable(); presenter.alertWhenAvailable(); folderC30 = rmRecords.getFolder_C30(); assertThat(folderC30.getAlertUsersWhenAvailable()).containsOnly(rmRecords.getBob_userInAC().getId()); } @Test public void givenTwoUsersToAlertWhenReturnFolderThenOneEmailToSend() throws Exception { presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getCharles_userInA().getId(), BorrowingType.BORROW, null); presenter.forParams("C30"); presenter.alertWhenAvailable(); connectWithBob(); presenter.forParams("C30"); presenter.alertWhenAvailable(); connectWithChuck(); presenter.forParams("C30"); presenter.returnFolder(nowDate); recordServices.flush(); LogicalSearchQuery query = new LogicalSearchQuery(); searchEmailsToSend(query); List<Record> emailToSendRecords = searchServices.search(query); assertThat(emailToSendRecords.size()).isEqualTo(1); EmailToSend emailToSend = rmSchemasRecordsServices.wrapEmailToSend(emailToSendRecords.get(0)); assertThat(emailToSend.getTo()).extracting("email") .containsOnly(rmRecords.getBob_userInAC().getEmail()); Folder folder = rmSchemasRecordsServices.getFolder("C30"); assertThat(folder.getAlertUsersWhenAvailable()).isEmpty(); } @Test public void givenUserToAlertWhenReturnFolderThenEmailToSendIsCreated() throws Exception { presenter.forParams("C30"); presenter.borrowFolder(nowDate, nowDate, rmRecords.getCharles_userInA().getId(), BorrowingType.BORROW, null); connectWithBob(); presenter.forParams("C30"); presenter.alertWhenAvailable(); connectWithChuck(); givenTimeIs(shishOClock); presenter.forParams("C30"); presenter.returnFolder(shishOClock.toLocalDate()); Metadata subjectMetadata = metadataSchemasManager.getSchemaTypes(zeCollection) .getMetadata(EmailToSend.DEFAULT_SCHEMA + "_" + EmailToSend.SUBJECT); Metadata sendOnMetadata = metadataSchemasManager.getSchemaTypes(zeCollection) .getMetadata(EmailToSend.DEFAULT_SCHEMA + "_" + EmailToSend.SEND_ON); User chuck = rmRecords.getChuckNorris(); Folder folderC30 = rmRecords.getFolder_C30(); LogicalSearchCondition condition = from(getSchemaTypes().getSchemaType(EmailToSend.SCHEMA_TYPE)) .where(subjectMetadata).isContainingText(folderC30.getTitle()) .andWhere(sendOnMetadata).is(shishOClock); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); List<Record> emailToSendRecords = searchServices.search(query); assertThat(emailToSendRecords).hasSize(1); EmailToSend emailToSend = new EmailToSend(emailToSendRecords.get(0), getSchemaTypes()); assertThat(emailToSend.getTo()).hasSize(1); assertThat(emailToSend.getTo().get(0).getName()).isEqualTo(users.bobIn(zeCollection).getTitle()); assertThat(emailToSend.getTo().get(0).getEmail()).isEqualTo(users.bobIn(zeCollection).getEmail()); final String subject = "Le dossier demandé est disponible: " + folderC30.getTitle(); assertThat(emailToSend.getSubject()).isEqualTo(subject); assertThat(emailToSend.getTemplate()).isEqualTo(RMEmailTemplateConstants.ALERT_AVAILABLE_ID); assertThat(emailToSend.getError()).isNull(); assertThat(emailToSend.getTryingCount()).isEqualTo(0); assertThat(emailToSend.getParameters()).hasSize(6); assertThat(emailToSend.getParameters().get(0)).isEqualTo("subject" + EmailToSend.PARAMETER_SEPARATOR + subject); assertThat(emailToSend.getParameters().get(1)) .isEqualTo("returnDate" + EmailToSend.PARAMETER_SEPARATOR + shishOClock.toString("yyyy-MM-dd HH:mm:ss")); assertThat(emailToSend.getParameters().get(2)) .isEqualTo("title" + EmailToSend.PARAMETER_SEPARATOR + folderC30.getTitle()); assertThat(emailToSend.getParameters().get(3)) .isEqualTo("constellioURL" + EmailToSend.PARAMETER_SEPARATOR + "http://localhost:8080/constellio/"); assertThat(emailToSend.getParameters().get(4)) .isEqualTo( "recordURL" + EmailToSend.PARAMETER_SEPARATOR + "http://localhost:8080/constellio/#!displayFolder/C30"); assertThat(emailToSend.getParameters().get(5)) .isEqualTo("recordType" + EmailToSend.PARAMETER_SEPARATOR + "dossier"); } @Test public void givenViewIsEnteredThenAddToCartButtonOnlyShowsWhenUserHasPermission() { String roleCode = users.aliceIn(zeCollection).getUserRoles().get(0); RolesManager rolesManager = getAppLayerFactory().getModelLayerFactory().getRolesManager(); Role role = rolesManager.getRole(zeCollection, roleCode); Role editedRole = role.withPermissions(new ArrayList<String>()); rolesManager.updateRole(editedRole); connectWithAlice(); assertThat(presenter.hasCurrentUserPermissionToUseCart()).isFalse(); Role editedRole2 = editedRole.withPermissions(asList(RMPermissionsTo.USE_CART)); rolesManager.updateRole(editedRole2); connectWithAlice(); assertThat(presenter.hasCurrentUserPermissionToUseCart()).isTrue(); } @Test public void givenEventsThenEventsDataProviderReturnValidEvents() throws Exception { getDataLayerFactory().newEventsDao().flush(); assertThat(searchServices.getResultsCount( rmEventsSearchServices.newFindEventByRecordIDQuery(users.adminIn(zeCollection), rmRecords.folder_A01))) .isEqualTo(1); assertThat(searchServices.getResultsCount( rmEventsSearchServices.newFindEventByRecordIDQuery(users.adminIn(zeCollection), rmRecords.folder_A05))) .isEqualTo(1); presenter.forParams(rmRecords.folder_A01); RecordVODataProvider provider = presenter.getEventsDataProvider(); List<RecordVO> eventList = provider.listRecordVOs(0, 100); assertThat(eventList).hasSize(1); } @Test public void givenFolderInDecommissioningListThenCannotBorrow() throws Exception { presenter.forParams(rmRecords.folder_A48); assertThat(presenter.getBorrowButtonState(rmRecords.getAdmin(), rmRecords.getFolder_A48())).isEqualTo(ComponentState.INVISIBLE); RecordServices recordServices = getModelLayerFactory().newRecordServices(); recordServices.physicallyDeleteNoMatterTheStatus(rmRecords.getList10().getWrappedRecord(), User.GOD, new RecordPhysicalDeleteOptions()); recordServices.physicallyDeleteNoMatterTheStatus(rmRecords.getList17().getWrappedRecord(), User.GOD, new RecordPhysicalDeleteOptions()); presenter.forParams(rmRecords.folder_A48); assertThat(presenter.getBorrowButtonState(rmRecords.getAdmin(), rmRecords.getFolder_A48())).isEqualTo(ComponentState.ENABLED); } // private void givenRemovedPermissionToModifyBorrowedFolder(String permission) { for (Role role : rolesManager.getAllRoles(zeCollection)) { List<String> roles = role.getOperationPermissions(); List<String> newRoles = new ArrayList<>(roles); newRoles.remove(permission); role = role.withPermissions(newRoles); rolesManager.updateRole(role); Role updatedRole = rolesManager.getRole(zeCollection, role.getCode()); assertThat(updatedRole.getOperationPermissions()).doesNotContain(permission); } } private void givenNoRemovedPermissionsToModifyBorrowedFolder() { for (Role role : rolesManager.getAllRoles(zeCollection)) { List<String> roles = role.getOperationPermissions(); List<String> newRoles = new ArrayList<>(roles); newRoles.add(RMPermissionsTo.MODIFY_INACTIVE_BORROWED_FOLDER); newRoles.add(RMPermissionsTo.MODIFY_SEMIACTIVE_BORROWED_FOLDER); role = role.withPermissions(newRoles); rolesManager.updateRole(role); Role updatedRole = rolesManager.getRole(zeCollection, role.getCode()); assertThat(updatedRole.getOperationPermissions()).contains(RMPermissionsTo.MODIFY_INACTIVE_BORROWED_FOLDER); assertThat(updatedRole.getOperationPermissions()).contains(RMPermissionsTo.MODIFY_SEMIACTIVE_BORROWED_FOLDER); } } private void givenRemovedPermissionToShareImportedFolder() { for (Role role : rolesManager.getAllRoles(zeCollection)) { List<String> roles = role.getOperationPermissions(); List<String> newRoles = new ArrayList<>(roles); newRoles.remove(RMPermissionsTo.SHARE_A_IMPORTED_FOLDER); role = role.withPermissions(newRoles); rolesManager.updateRole(role); Role updatedRole = rolesManager.getRole(zeCollection, role.getCode()); assertThat(updatedRole.getOperationPermissions()).doesNotContain(RMPermissionsTo.SHARE_A_IMPORTED_FOLDER); } } private void givenNoRemovedPermissionsToShareImportedFolder() { for (Role role : rolesManager.getAllRoles(zeCollection)) { List<String> roles = role.getOperationPermissions(); List<String> newRoles = new ArrayList<>(roles); newRoles.add(RMPermissionsTo.SHARE_A_IMPORTED_FOLDER); role = role.withPermissions(newRoles); rolesManager.updateRole(role); Role updatedRole = rolesManager.getRole(zeCollection, role.getCode()); assertThat(updatedRole.getOperationPermissions()).contains(RMPermissionsTo.SHARE_A_IMPORTED_FOLDER); } } private MetadataSchemaTypes getSchemaTypes() { return getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection); } private void searchEmailsToSend(LogicalSearchQuery query) { Folder folderC30 = rmRecords.getFolder_C30(); Metadata subjectMetadata = metadataSchemasManager.getSchemaTypes(zeCollection) .getMetadata(EmailToSend.DEFAULT_SCHEMA + "_" + EmailToSend.SUBJECT); LogicalSearchCondition condition = from(getSchemaTypes().getSchemaType(EmailToSend.SCHEMA_TYPE)) .where(subjectMetadata).isContainingText(folderC30.getTitle()); query.setCondition(condition); } private void connectWithBob() { sessionContext = FakeSessionContext.bobInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(displayFolderView.getSessionContext()).thenReturn(sessionContext); presenter = new DisplayFolderPresenter(displayFolderView); } private void connectWithAlice() { sessionContext = FakeSessionContext.aliceInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(displayFolderView.getSessionContext()).thenReturn(sessionContext); presenter = new DisplayFolderPresenter(displayFolderView); } private void connectWithChuck() { sessionContext = FakeSessionContext.chuckNorrisInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(displayFolderView.getSessionContext()).thenReturn(sessionContext); presenter = new DisplayFolderPresenter(displayFolderView); } @Test public void test() throws Exception { displayFolderView.selectFolderContentTab(); } }