package com.constellio.app.modules.rm.ui.pages.decommissioning;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.model.enums.DecommissioningListType;
import com.constellio.app.modules.rm.model.enums.OriginStatus;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.decommissioning.SearchType;
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.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.structures.DecomListContainerDetail;
import com.constellio.app.modules.rm.wrappers.structures.DecomListFolderDetail;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.MockedNavigation;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static com.constellio.sdk.tests.TestUtils.assertThatRecords;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.groups.Tuple.tuple;
import static org.mockito.Mockito.*;
/**
* Created by Constellio on 2017-01-10.
*/
public class DecommissioningListPresenterAcceptanceTest extends ConstellioTest {
@Mock
DecommissioningListView view;
MockedNavigation navigator;
RMTestRecords records = new RMTestRecords(zeCollection);
DecommissioningListPresenter presenter;
SessionContext sessionContext;
RMSchemasRecordsServices rm;
MetadataSchemasManager metadataSchemasManager;
RecordServices recordServices;
DecommissioningList decommissioningList;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records)
.withFoldersAndContainersOfEveryStatus().withEvents()
);
inCollection(zeCollection).setCollectionTitleTo("Collection de test");
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
sessionContext = FakeSessionContext.adminInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
when(view.getSessionContext()).thenReturn(sessionContext);
when(view.getCollection()).thenReturn(zeCollection);
when(view.getConstellioFactories()).thenReturn(getConstellioFactories());
when(view.navigate()).thenReturn(navigator);
decommissioningList = buildDefaultDecommissioningList();
recordServices.add(decommissioningList.getWrappedRecord());
presenter = spy(new DecommissioningListPresenter(view));
doReturn(decommissioningList).when(presenter).decommissioningList();
doReturn(rm).when(presenter).rmRecordsServices();
doNothing().when(presenter).refreshView();
}
@Test
public void givenDecommissioningListThenCalculateGoodSearchType() {
doReturn(null).when(view).getContainer(any(ContainerRecord.class));
doReturn(null).when(view).getPackageableFolder(any(String.class));
decommissioningList.setOriginArchivisticStatus(OriginStatus.ACTIVE)
.setDecommissioningListType(DecommissioningListType.FOLDERS_TO_TRANSFER);
assertThat(presenter.calculateSearchType()).isEqualTo(SearchType.transfer);
decommissioningList.setDecommissioningListType(DecommissioningListType.FOLDERS_TO_DEPOSIT);
assertThat(presenter.calculateSearchType()).isEqualTo(SearchType.activeToDeposit);
decommissioningList.setDecommissioningListType(DecommissioningListType.FOLDERS_TO_DESTROY);
assertThat(presenter.calculateSearchType()).isEqualTo(SearchType.activeToDestroy);
decommissioningList.setOriginArchivisticStatus(OriginStatus.SEMI_ACTIVE)
.setDecommissioningListType(DecommissioningListType.FOLDERS_TO_DEPOSIT);
assertThat(presenter.calculateSearchType()).isEqualTo(SearchType.semiActiveToDeposit);
decommissioningList.setDecommissioningListType(DecommissioningListType.FOLDERS_TO_DESTROY);
assertThat(presenter.calculateSearchType()).isEqualTo(SearchType.semiActiveToDestroy);
}
@Test
public void whenRemoveFoldersClickedThenRemoveGoodFolders() {
doReturn(null).when(view).getContainer(any(ContainerRecord.class));
doReturn(null).when(view).getPackageableFolder(any(String.class));
presenter.forRecordId(decommissioningList.getId());
FolderDetailVO detail1 = new FolderDetailVO();
FolderDetailVO detail2 = new FolderDetailVO();
detail1.setFolderId(records.folder_A02);
presenter.removeFoldersButtonClicked(asList(detail1));
assertThat(rm.getDecommissioningList(decommissioningList.getId()).getFolders()).containsOnly(records.folder_A01, records.folder_A03, records.folder_A04);
detail1.setFolderId(records.folder_A01);
detail2.setFolderId(records.folder_A03);
presenter.removeFoldersButtonClicked(asList(detail1, detail2));
assertThat(rm.getDecommissioningList(decommissioningList.getId()).getFolders()).containsOnly(records.folder_A04);
detail1.setFolderId(records.folder_A04);
presenter.removeFoldersButtonClicked(asList(detail1));
assertThat(rm.getDecommissioningList(decommissioningList.getId()).getFolders()).isEmpty();
}
@Test
public void givenAutofillButtonIsClickedThenContainersAreFilledCorrectly() throws RecordServicesException {
buildAutoFillContainers();
presenter.forRecordId(decommissioningList.getId());
Map<String, Double> foldersWithSize = new HashMap<>();
foldersWithSize.put(records.folder_A01, 40D);
foldersWithSize.put(records.folder_A02, 50D);
foldersWithSize.put(records.folder_A03, 70D);
foldersWithSize.put(records.folder_A04, 30D);
FolderDetailToVOBuilder folderBuilder = new FolderDetailToVOBuilder(rm);
FolderDetailVO folder1 = folderBuilder.build(decommissioningList.getFolderDetailWithType(records.folder_A01));
folder1.setLinearSize(40D);
FolderDetailVO folder2 = folderBuilder.build(decommissioningList.getFolderDetailWithType(records.folder_A02));
folder2.setLinearSize(50D);
FolderDetailVO folder3 = folderBuilder.build(decommissioningList.getFolderDetailWithType(records.folder_A03));
folder3.setLinearSize(70D);
FolderDetailVO folder4 = folderBuilder.build(decommissioningList.getFolderDetailWithType(records.folder_A04));
folder4.setLinearSize(30D);
doReturn(folder1).when(view).getPackageableFolder(records.folder_A01);
doReturn(folder2).when(view).getPackageableFolder(records.folder_A02);
doReturn(folder3).when(view).getPackageableFolder(records.folder_A03);
doReturn(folder4).when(view).getPackageableFolder(records.folder_A04);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
boolean container100 = decommissioningList.getContainerDetail("container100") == null;
return container100 ?
new ContainerVO("container100", "container100", 100D) :
new ContainerVO("container100", "container100", decommissioningList.getContainerDetail("container100").getAvailableSize());
}
}).when(view).getContainer(rm.getContainerRecord("container100"));
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
boolean container150 = decommissioningList.getContainerDetail("container150") == null;
return container150 ?
new ContainerVO("container150", "container150", 150D) :
new ContainerVO("container150", "container150", decommissioningList.getContainerDetail("container150").getAvailableSize());
}
}).when(view).getContainer(rm.getContainerRecord("container150"));
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
DecomListContainerDetail newContainerDetail100 = decommissioningList.getContainerDetail("container100");
if(newContainerDetail100 == null) {
decommissioningList.addContainerDetailsFrom(asList(rm.getContainerRecord("container100")));
decommissioningList.getContainerDetail("container100").setAvailableSize(getSizeInContainer("container100"));
}
DecomListContainerDetail newContainerDetail150 = decommissioningList.getContainerDetail("container150");
if(newContainerDetail150 == null) {
decommissioningList.addContainerDetailsFrom(asList(rm.getContainerRecord("container150")));
decommissioningList.getContainerDetail("container150").setAvailableSize(getSizeInContainer("container150"));
}
recordServices.update(decommissioningList);
return null;
}
}).when(view).addUpdateContainer(any(ContainerVO.class), any(DecomListContainerDetail.class));
presenter.autoFillContainersRequested(foldersWithSize);
assertThat(asList(decommissioningList.getFolderDetail(records.folder_A01), decommissioningList.getFolderDetail(records.folder_A02),
decommissioningList.getFolderDetail(records.folder_A03), decommissioningList.getFolderDetail(records.folder_A04)))
.extracting("folderId", "containerRecordId", "folderLinearSize")
.containsOnly(
tuple(records.folder_A01, "container100", 40D),
tuple(records.folder_A02, "container150", 50D),
tuple(records.folder_A03, "container150", 70D),
tuple(records.folder_A04, "container100", 30D)
);
assertThatRecords(records.getFolder_A01(), records.getFolder_A02(), records.getFolder_A03(), records.getFolder_A04())
.extractingMetadatas(Schemas.IDENTIFIER.getLocalCode(), Folder.CONTAINER, Folder.LINEAR_SIZE)
.containsOnly(
tuple(records.folder_A01, null, null),
tuple(records.folder_A02, null, null),
tuple(records.folder_A03, null, null),
tuple(records.folder_A04, null, null)
);
}
private Double getSizeInContainer(String id) {
Double size = rm.getContainerRecord(id).getCapacity();
for(DecomListFolderDetail folder: rm.getDecommissioningList(decommissioningList.getId()).getFolderDetails()) {
if(id.equals(folder.getContainerRecordId())) {
size -= folder.getFolderLinearSize();
}
}
return size;
}
private DecommissioningList buildDefaultDecommissioningList() {
return rm.newDecommissioningListWithId("decomTest").setAdministrativeUnit(records.unitId_10).setTitle("decomTest").setOriginArchivisticStatus(OriginStatus.ACTIVE)
.setDecommissioningListType(DecommissioningListType.FOLDERS_TO_TRANSFER)
.addFolderDetailsFor(rm.getFolders(asList(records.folder_A01, records.folder_A02, records.folder_A03, records.folder_A04)).toArray(new Folder[0]));
}
private void buildAutoFillContainers() throws RecordServicesException {
recordServices.add(rm.newContainerRecordWithId("container100").setType(records.containerTypeId_boite22x22)
.setTemporaryIdentifier("container100").setAdministrativeUnit(records.getUnit10()).setCapacity(100));
recordServices.add(rm.newContainerRecordWithId("container150").setType(records.containerTypeId_boite22x22)
.setTemporaryIdentifier("container150").setAdministrativeUnit(records.getUnit10()).setCapacity(150));
recordServices.add(rm.newContainerRecordWithId("container25").setType(records.containerTypeId_boite22x22)
.setTemporaryIdentifier("container25").setAdministrativeUnit(records.getUnit10()).setCapacity(25));
}
}