package com.constellio.app.modules.rm.ui.pages.decommissioning; import com.constellio.app.modules.rm.navigation.RMViews; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService; import com.constellio.app.modules.rm.ui.builders.FolderDetailToVOBuilder; import com.constellio.app.modules.rm.ui.entities.ContainerVO; import com.constellio.app.modules.rm.ui.entities.FolderDetailVO; import com.constellio.app.modules.rm.wrappers.DecommissioningList; import com.constellio.app.modules.rm.wrappers.structures.DecomListContainerDetail; import com.constellio.app.modules.rm.wrappers.structures.DecomListFolderDetail; import com.constellio.app.modules.rm.wrappers.structures.FolderDetailWithType; import com.constellio.app.ui.pages.base.PresenterService; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.services.logging.LoggingServices; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.cache.RecordsCaches; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.FakeSessionContext; import com.constellio.sdk.tests.MockedFactories; import com.constellio.sdk.tests.MockedNavigation; import com.vaadin.server.VaadinRequest; import com.vaadin.ui.UI; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import java.util.Arrays; import java.util.Locale; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.*; public class DecommissioningListPresenterTest extends ConstellioTest { public static final String ZE_LIST = "zeList"; @Mock DecommissioningListView view; @Mock DecommissioningService service; @Mock RMSchemasRecordsServices rm; @Mock PresenterService presenterService; @Mock DecommissioningList list; @Mock Record record; @Mock User user; @Mock FolderDetailVO folderDetailVO; @Mock FolderDetailVO processable1; @Mock FolderDetailVO processable2; @Mock FolderDetailVO packageable1; @Mock FolderDetailVO packageable2; @Mock FolderDetailVO packageable1Detail; @Mock FolderDetailVO packageable2Detail; @Mock ContainerVO containerVO; @Mock DecomListFolderDetail folderDetail; MockedNavigation navigator; MockedFactories factories = new MockedFactories(); DecommissioningListPresenter presenter; @Before public void setUp() throws Exception { when(view.getConstellioFactories()).thenReturn(factories.getConstellioFactories()); when(view.getSessionContext()).thenReturn(FakeSessionContext.gandalfInCollection(zeCollection)); when(factories.getAppLayerFactory().newPresenterService()).thenReturn(presenterService); when(factories.getModelLayerFactory().getRecordsCaches()).thenReturn(new RecordsCaches(factories.getModelLayerFactory())); when(presenterService.getCurrentUser(isA(SessionContext.class))).thenReturn(user); factories.getRecordServices(); navigator = new MockedNavigation(); when(view.navigate()).thenReturn(navigator); when(rm.getDecommissioningList(ZE_LIST)).thenReturn(list); when(list.getWrappedRecord()).thenReturn(record); presenter = spy(new DecommissioningListPresenter(view).forRecordId(ZE_LIST)); doReturn(service).when(presenter).decommissioningService(); doReturn(false).when(presenter).isFolderPlacedInContainer(any(FolderDetailWithType.class)); doReturn(rm).when(presenter).rmRecordsServices(); UI.setCurrent(new UI() { @Override protected void init(VaadinRequest request) { } @Override public Locale getLocale() { return Locale.CANADA; } }); } @After public void tearDown() { UI.setCurrent(null); } @Test public void givenIsEditableThenAskTheDecommissioningService() { when(service.isEditable(list, user)).thenReturn(true); assertThat(presenter.isEditable()).isTrue(); verify(service, times(1)).isEditable(list, user); } @Test public void givenEditButtonClickedThenNavigateToEditWindow() { presenter.editButtonClicked(); verify(navigator.to(RMViews.class), times(1)).editDecommissioningList(ZE_LIST); } @Test public void givenIsDeletableThenAskTheDecommissioningService() { when(service.isDeletable(list, user)).thenReturn(true); assertThat(presenter.isDeletable()).isTrue(); verify(service, times(1)).isDeletable(list, user); } @Test public void givenDeleteButtonClickedThenDeleteTheListAndReturnToMainPage() { RecordServices recordServices = factories.getRecordServices(); when(factories.getModelLayerFactory().newLoggingServices()).thenReturn(mock(LoggingServices.class)); when(recordServices.isLogicallyThenPhysicallyDeletable(record, user)).thenReturn(true); presenter.deleteButtonClicked(); verify(factories.getRecordServices(), times(1)).logicallyDelete(record, user); verify(factories.getRecordServices(), times(1)).physicallyDelete(record, user); } @Test public void givenIsProcessableThenAskTheDecommissioningService() { when(service.isProcessable(list, user)).thenReturn(true); assertThat(presenter.isProcessable()).isTrue(); verify(service, times(1)).isProcessable(list, user); } @Test public void givenProcessButtonClickedThenProcessTheListAndRefreshWithMessage() { doReturn(true).when(presenter).isListReadyToBeProcessed(); presenter.processButtonClicked(); verify(service, times(1)).decommission(list, user); verify(view, times(1)).showMessage(anyString()); } @Test public void givenContainerCreationRequestedThenNavigateToContainerCreation() { presenter.containerCreationRequested(); verify(navigator.to(RMViews.class), times(1)).createContainerForDecommissioningList(ZE_LIST); } @Test public void givenContainerSearchRequestedThenNavigateToContainerSearch() { presenter.containerSearchRequested(); verify(navigator.to(RMViews.class), times(1)).searchContainerForDecommissioningList(ZE_LIST); } @Test public void givenFolderPlacedInContainerThenUpdateDecommissioningListAndView() throws Exception { when(folderDetailVO.getFolderId()).thenReturn("zeFolder"); when(containerVO.getId()).thenReturn("zeContainer"); when(list.getFolderDetail("zeFolder")).thenReturn(folderDetail); when(folderDetail.setFolderLinearSize(any(Double.class))).thenReturn(folderDetail); when(folderDetail.setContainerRecordId(any(String.class))).thenReturn(folderDetail); when(service.isProcessable(list, user)).thenReturn(true); presenter.folderPlacedInContainer(folderDetailVO, containerVO); verify(folderDetail, times(1)).setContainerRecordId("zeContainer"); verify(factories.getRecordServices()).executeHandlingImpactsAsync(isA(Transaction.class)); verify(view, times(1)).setProcessable(folderDetailVO); verify(view, times(1)).updateProcessButtonState(true); } @Test public void givenFolderSortedWhenFolderBecomesProcessableThenUpdateDecommissioningListAndView() throws RecordServicesException { when(folderDetailVO.getFolderId()).thenReturn("zeFolder"); FolderDetailWithType detailWithType = mock(FolderDetailWithType.class, "FolderDetailWithType"); when(list.getFolderDetailWithType("zeFolder")).thenReturn(detailWithType); when(detailWithType.getDetail()).thenReturn(folderDetail); when(service.isFolderProcessable(list, detailWithType)).thenReturn(true); presenter.folderSorted(folderDetailVO, true); verify(folderDetail, times(1)).setReversedSort(true); verify(factories.getRecordServices()).executeHandlingImpactsAsync(isA(Transaction.class)); verify(folderDetailVO, times(1)).setPackageable(false); verify(view, times(1)).setProcessable(folderDetailVO); } @Test public void givenFolderSortedWhenFolderBecomesNotProcessableThenUpdateDecommissioningListAndView() throws RecordServicesException { when(folderDetailVO.getFolderId()).thenReturn("zeFolder"); FolderDetailWithType detailWithType = mock(FolderDetailWithType.class, "FolderDetailWithType"); when(list.getFolderDetailWithType("zeFolder")).thenReturn(detailWithType); when(detailWithType.getDetail()).thenReturn(folderDetail); when(service.isFolderProcessable(list, detailWithType)).thenReturn(false); presenter.folderSorted(folderDetailVO, true); verify(folderDetail, times(1)).setReversedSort(true); verify(factories.getRecordServices()).executeHandlingImpactsAsync(isA(Transaction.class)); verify(folderDetailVO, times(1)).setPackageable(true); verify(view, times(1)).setPackageable(folderDetailVO); } @Test public void givenContainerStatusChangedThenUpdateTheDecommissioningList() throws RecordServicesException { DecomListContainerDetail detail = mock(DecomListContainerDetail.class, "DecomListContainerDetail"); presenter.containerStatusChanged(detail, true); verify(detail, times(1)).setFull(true); verify(factories.getRecordServices()).executeHandlingImpactsAsync(isA(Transaction.class)); } @Test public void givenPackageableFoldersAskedThenReturnThePackageableFolders() { givenTwoProcessableFoldersAndTwoUnprocessableFolders(); assertThat(presenter.getPackageableFolders()).containsExactly(packageable1, packageable2); } @Test public void givenProcessableFoldersAskedThenReturnTheProcessableFolders() { givenTwoProcessableFoldersAndTwoUnprocessableFolders(); assertThat(presenter.getProcessableFolders()).containsExactly(processable1, processable2); } @Test public void givenApprovedButtonClickedThenApproveTheListAndRefreshWithMessage() { presenter.approvalButtonClicked(); verify(service, times(1)).approveList(list, user); verify(view, times(1)).showMessage(anyString()); } @Test public void whenShouldAllowContainerEditingThenAskTheDecommissioningService() { when(service.canEditContainers(list, user)).thenReturn(true); assertThat(presenter.shouldAllowContainerEditing()).isTrue(); verify(service, times(1)).canEditContainers(list, user); } @Test public void whenShouldDisplaySortThenAskTheDecommissioningService() { when(service.isSortable(list)).thenReturn(true); assertThat(presenter.shouldDisplaySort()).isTrue(); verify(service, times(1)).isSortable(list); } private void givenTwoProcessableFoldersAndTwoUnprocessableFolders() { FolderDetailWithType detail1 = mock(FolderDetailWithType.class); FolderDetailWithType detail2 = mock(FolderDetailWithType.class); FolderDetailWithType detail3 = mock(FolderDetailWithType.class); FolderDetailWithType detail4 = mock(FolderDetailWithType.class); when(detail1.isIncluded()).thenReturn(true); when(detail2.isIncluded()).thenReturn(true); when(detail3.isIncluded()).thenReturn(true); when(detail4.isIncluded()).thenReturn(true); when(service.isFolderProcessable(list, detail1)).thenReturn(true); when(service.isFolderProcessable(list, detail2)).thenReturn(false); when(service.isFolderProcessable(list, detail3)).thenReturn(true); when(service.isFolderProcessable(list, detail4)).thenReturn(false); FolderDetailToVOBuilder builder = mock(FolderDetailToVOBuilder.class, "FolderDetailToVOBuilder"); when(builder.build(detail1)).thenReturn(processable1); when(builder.build(detail2)).thenReturn(packageable1); when(builder.build(detail3)).thenReturn(processable2); when(builder.build(detail4)).thenReturn(packageable2); when(list.getFolderDetailsWithType()).thenReturn(Arrays.asList(detail1, detail2, detail3, detail4)); doReturn(builder).when(presenter).folderDetailToVOBuilder(); } }