package com.constellio.app.ui.pages.management.collections;
import static com.constellio.sdk.tests.TestUtils.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.constellio.sdk.tests.MockedNavigation;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.modules.es.ConstellioESModule;
import com.constellio.app.modules.rm.ConstellioRMModule;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.robots.ConstellioRobotsModule;
import com.constellio.app.modules.tasks.TaskModule;
import com.constellio.app.services.collections.CollectionsManager;
import com.constellio.app.ui.application.CoreViews;
import com.constellio.app.ui.framework.data.CollectionVODataProvider.CollectionVO;
import com.constellio.app.ui.pages.management.collections.AddEditCollectionPresenterException.AddEditCollectionPresenterException_CodeCodeChangeForbidden;
import com.constellio.app.ui.pages.management.collections.AddEditCollectionPresenterException.AddEditCollectionPresenterException_CodeShouldNotContainDash;
import com.constellio.app.ui.pages.management.collections.AddEditCollectionPresenterException.AddEditCollectionPresenterException_CodeUnAvailable;
import com.constellio.app.ui.pages.management.collections.AddEditCollectionPresenterException.AddEditCollectionPresenterException_MustSelectAtLeastOneModule;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.modules.Module;
import com.constellio.model.entities.records.wrappers.Collection;
import com.constellio.model.services.extensions.ConstellioModulesManager;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
public class AddEditCollectionPresenterAcceptanceTest extends ConstellioTest {
RMTestRecords records = new RMTestRecords(zeCollection);
AddEditCollectionPresenter presenterRelatedToNewCollection;
AddEditCollectionPresenter presenterRelatedToZeCollection;
@Mock
AddEditCollectionView view;
MockedNavigation navigator;
private CollectionsManager collectionsManager;
private ConstellioModulesManager modulesManager;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withRMTest(records).withFoldersAndContainersOfEveryStatus()
);
navigator = new MockedNavigation();
when(view.getConstellioFactories()).thenReturn(getConstellioFactories());
when(view.getSessionContext()).thenReturn(FakeSessionContext.adminInCollection(zeCollection));
when(view.navigate()).thenReturn(navigator);
presenterRelatedToNewCollection = new AddEditCollectionPresenter(view, null);
presenterRelatedToZeCollection = new AddEditCollectionPresenter(view, zeCollection);
collectionsManager = getAppLayerFactory()
.getCollectionsManager();
modulesManager = getAppLayerFactory().getModulesManager();
}
@Test
public void whenGetCollectionVOThenOk()
throws Exception {
givenUnsavedCollectionWhenGetCollectionVOThenOk();
givenExistingCollectionWhenGetCollectionAfterModulesModificationVOThenOk();
}
private void givenExistingCollectionWhenGetCollectionAfterModulesModificationVOThenOk() {
CollectionVO zeCollectionVO = presenterRelatedToZeCollection.getCollectionVO();
Collection zeCollectionRecord = collectionsManager.getCollection(zeCollection);
assertThat(zeCollectionVO.getCode()).isEqualTo(zeCollectionRecord.getCode());
assertThat(zeCollectionVO.getName()).isEqualTo(zeCollectionRecord.getName());
List<String> enabledModulesForZeCollection = asList(ConstellioRMModule.ID, TaskModule.ID);
assertThat(zeCollectionVO.getModules()).containsExactlyElementsOf(enabledModulesForZeCollection);
Module esModule = modulesManager.getInstalledModule(ConstellioESModule.ID);
Set<String> invalidModules = modulesManager
.installValidModuleAndGetInvalidOnes(esModule, getModelLayerFactory().getCollectionsListManager());
invalidModules.addAll(modulesManager.enableValidModuleAndGetInvalidOnes(zeCollection, esModule));
zeCollectionVO = presenterRelatedToZeCollection.getCollectionVO();
assertThat(zeCollectionVO.getCode()).isEqualTo(zeCollectionRecord.getCode());
assertThat(zeCollectionVO.getName()).isEqualTo(zeCollectionRecord.getName());
//enabledModulesForZeCollection = asList(ConstellioRMModule.ID, TaskModule.ID, ConstellioESModule.ID);
assertThat(zeCollectionVO.getModules()).containsOnlyOnce(ConstellioRMModule.ID, TaskModule.ID, ConstellioESModule.ID);
assertThat(invalidModules).isEmpty();
}
private void givenUnsavedCollectionWhenGetCollectionVOThenOk() {
CollectionVO newCollectionVo = presenterRelatedToNewCollection.getCollectionVO();
assertThat(newCollectionVo.getCode()).isNull();
assertThat(newCollectionVo.getName()).isNull();
assertThat(newCollectionVo.getSupportedLanguages())
.containsOnly(getModelLayerFactory().getConfiguration().getMainDataLanguage());
assertThat(newCollectionVo.getModules()).isEmpty();
}
@Test
public void whenIsModuleSelectedThenOK()
throws Exception {
CollectionVO newCollectionVo = presenterRelatedToNewCollection.getCollectionVO();
assertThat(presenterRelatedToNewCollection.isModuleSelected(ConstellioRMModule.ID, newCollectionVo)).isFalse();
CollectionVO zeCollectionVO = presenterRelatedToZeCollection.getCollectionVO();
assertThat(presenterRelatedToZeCollection.isModuleSelected(ConstellioRMModule.ID, zeCollectionVO)).isTrue();
}
@Test
public void whenGetEnabledModulesThenOk()
throws Exception {
assertThat(presenterRelatedToNewCollection.getEnabledModules(zeCollection)).containsOnly(ConstellioRMModule.ID,
TaskModule.ID);
assertThat(presenterRelatedToNewCollection.getEnabledModules("inexistingCollection")).isEmpty();
}
@Test
public void whenGetAvailableModulesThenOk()
throws Exception {
assertThat(presenterRelatedToNewCollection.getAvailableModules()).containsOnly(ConstellioRMModule.ID,
TaskModule.ID, ConstellioESModule.ID, ConstellioRobotsModule.ID);
}
@Test
public void whenCreateCollectionThenOk()
throws Exception {
CollectionVO entity = new CollectionVO();
entity.setCode("zeCode");
entity.setName("zeName");
entity.setSupportedLanguages(new HashSet<>(Arrays.asList(Language.French.getCode(), Language.English.getCode())));
entity.setModules(new HashSet<>(asList(ConstellioRobotsModule.ID)));
presenterRelatedToNewCollection.createCollection(entity);
Collection createdCollection = collectionsManager.getCollection("zeCode");
assertThat(createdCollection.getCode()).isEqualTo("zeCode");
assertThat(createdCollection.getName()).isEqualTo("zeName");
assertThat(createdCollection.getLanguages()).containsOnly(Language.French.getCode(), Language.English.getCode());
assertThat(modulesManager.getEnabledModules("zeCode")).extracting("id").containsOnly(ConstellioRobotsModule.ID);
}
@Test
public void whenUpdateCollectionThenOk()
throws Exception {
Collection zeCollectionRecord = collectionsManager.getCollection(zeCollection);
assertThat(zeCollectionRecord.getLanguages()).containsOnly(Language.French.getCode(), Language.English.getCode());
CollectionVO zeCollectionVO = presenterRelatedToZeCollection.getCollectionVO();
Set<String> enabledModulesForZeCollection = new HashSet<>(
asList(ConstellioRMModule.ID, TaskModule.ID, ConstellioESModule.ID));
zeCollectionVO.setModules(enabledModulesForZeCollection);
zeCollectionVO.setName("newName");
zeCollectionVO.setSupportedLanguages(new HashSet<>(Arrays.asList(Language.French.getCode())));
presenterRelatedToZeCollection.updateCollection(zeCollectionVO);
zeCollectionRecord = collectionsManager.getCollection(zeCollection);
assertThat(zeCollectionRecord.getCode()).isEqualTo(zeCollectionVO.getCode());
assertThat(zeCollectionRecord.getName()).isEqualTo("newName");
assertThat(modulesManager.getEnabledModules(zeCollectionVO.getCode())).extracting("id")
.containsOnly(ConstellioRMModule.ID, TaskModule.ID, ConstellioESModule.ID);
//language is not modified
assertThat(zeCollectionRecord.getLanguages()).containsOnly(Language.French.getCode(), Language.English.getCode());
}
@Test(expected = AddEditCollectionPresenterException_CodeCodeChangeForbidden.class)
public void givenCollectionWithModifiedCodeWhenSaveButtonClickedThenFailure()
throws Exception {
CollectionVO collectionVO = presenterRelatedToZeCollection.getCollectionVO();
collectionVO.setCode("newCode");
Set<String> enabledModulesForZeCollection = new HashSet<>(
asList(TaskModule.ID));
collectionVO.setModules(enabledModulesForZeCollection);
presenterRelatedToZeCollection.saveButtonClicked(collectionVO);
}
@Test(expected = AddEditCollectionPresenterException_CodeShouldNotContainDash.class)
public void givenCollectionWithCodeIncludingDashWhenSaveButtonClickedThenFailure()
throws Exception {
CollectionVO collectionVO = presenterRelatedToNewCollection.getCollectionVO();
collectionVO.setCode("new-Code");
Set<String> enabledModulesForZeCollection = new HashSet<>(
asList(TaskModule.ID));
collectionVO.setModules(enabledModulesForZeCollection);
presenterRelatedToZeCollection.saveButtonClicked(collectionVO);
}
@Test(expected = AddEditCollectionPresenterException_CodeUnAvailable.class)
public void givenNewCollectionWithExistingCodeWhenSaveButtonClickedThenFailure()
throws Exception {
CollectionVO collectionVO = presenterRelatedToNewCollection.getCollectionVO();
collectionVO.setCode(zeCollection);
Set<String> enabledModulesForZeCollection = new HashSet<>(
asList(TaskModule.ID));
collectionVO.setModules(enabledModulesForZeCollection);
presenterRelatedToNewCollection.saveButtonClicked(collectionVO);
}
@Test(expected = AddEditCollectionPresenterException_MustSelectAtLeastOneModule.class)
public void givenCollectionWithNoModuleWhenSaveButtonClickedThenFailure()
throws Exception {
CollectionVO collectionVO = presenterRelatedToNewCollection.getCollectionVO();
collectionVO.setCode("newCode");
presenterRelatedToNewCollection.saveButtonClicked(collectionVO);
}
}