package com.constellio.app.ui.pages.search; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.model.enums.CopyType; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.app.ui.application.CoreViews; import com.constellio.app.ui.entities.MetadataVO; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.app.ui.pages.base.UIContext; import com.constellio.model.entities.Taxonomy; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.entities.security.Role; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.SearchServices; 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.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.ArrayList; import java.util.List; import java.util.Locale; import static com.constellio.model.entities.schemas.Schemas.AUTHORIZATIONS; import static com.constellio.model.entities.schemas.Schemas.IS_DETACHED_AUTHORIZATIONS; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; /** * Created by Constelio on 2016-11-04. */ public class AdvancedSearchPresenterAcceptanceTest extends ConstellioTest { Users users = new Users(); @Mock AdvancedSearchView advancedSearchView; @Mock CoreViews navigator; RMTestRecords rmRecords = new RMTestRecords(zeCollection); RMSchemasRecordsServices schemasRecordsServices; AdvancedSearchPresenter presenter; SessionContext sessionContext; @Mock UIContext uiContext; RecordServices recordServices; LocalDateTime now = new LocalDateTime(); LocalDateTime shishOClock = new LocalDateTime().plusDays(1); MetadataSchemasManager metadataSchemasManager; SearchServices searchServices; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withConstellioRMModule().withAllTest(users).withRMTest(rmRecords) .withFoldersAndContainersOfEveryStatus().withDocumentsHavingContent() ); inCollection(zeCollection).giveWriteAccessTo(aliceWonderland); schemasRecordsServices = new RMSchemasRecordsServices(zeCollection, getModelLayerFactory()); recordServices = getModelLayerFactory().newRecordServices(); metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager(); searchServices = getModelLayerFactory().newSearchServices(); inCollection(zeCollection).setCollectionTitleTo("Collection de test"); sessionContext = FakeSessionContext.chuckNorrisInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(advancedSearchView.getSessionContext()).thenReturn(sessionContext); when(advancedSearchView.getCollection()).thenReturn(zeCollection); when(advancedSearchView.getConstellioFactories()).thenReturn(getConstellioFactories()); when(advancedSearchView.getUIContext()).thenReturn(uiContext); presenter = new AdvancedSearchPresenter(advancedSearchView); } @Test public void givenViewIsEnteredThenAddToCartButtonOnlyShowsWhenUserHasPermission() { List<String> userRoles = users.aliceIn(zeCollection).getUserRoles(); String roleCode = userRoles.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 givenAdvanceSearchThenMetadataChoiceIsLimitedByUsedSchemas() throws RecordServicesException { connectWithAdmin(); List<MetadataVO> baseMetadatas = presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(Folder.SCHEMA_TYPE).createCustomSchema("customSchema").create("newSearchableMetadata") .setType(MetadataValueType.STRING).setSearchable(true); } }); SchemasDisplayManager metadataSchemasDisplayManager = getAppLayerFactory().getMetadataSchemasDisplayManager(); metadataSchemasDisplayManager.saveMetadata(metadataSchemasDisplayManager.getMetadata(zeCollection, "folder_customSchema_newSearchableMetadata") .withVisibleInAdvancedSearchStatus(true)); assertThat(baseMetadatas).containsAll(presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE)); recordServices.add(newFolder("testFolder").changeSchemaTo("folder_customSchema")); recordServices.update(recordServices.getDocumentById("testFolder").set(IS_DETACHED_AUTHORIZATIONS, true).set(AUTHORIZATIONS, new ArrayList<>())); List<MetadataVO> newMetadatas = presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE); newMetadatas.removeAll(baseMetadatas); assertThat(newMetadatas.size()).isEqualTo(1); assertThat(newMetadatas.get(0).getCode()).isEqualTo("folder_customSchema_newSearchableMetadata"); connectWithBob(); assertThat(baseMetadatas).containsAll(presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE)); } @Test public void givenAdvanceSearchWithTaxonomiesThenIsLimitedByPermission() throws RecordServicesException { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { MetadataSchemaTypeBuilder justeadmin = types.createNewSchemaType("justeadmin"); justeadmin.getDefaultSchema().create("code").setType(MetadataValueType.STRING); } }); MetadataSchemasManager metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager(); Taxonomy hiddenInHomePage = Taxonomy.createHiddenInHomePage("justeadmin", "justeadmin", zeCollection, "justeadmin").withUserIds(asList(rmRecords.getAdmin().getId())); getModelLayerFactory().getTaxonomiesManager().addTaxonomy(hiddenInHomePage, metadataSchemasManager); recordServices.add(rm.newHierarchicalValueListItem("justeadmin_default").setCode("J01").set(Schemas.TITLE, "J01")); connectWithAdmin(); List<MetadataVO> baseMetadatas = presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getDefaultSchema(Folder.SCHEMA_TYPE).create("newSearchableMetadata") .setType(MetadataValueType.REFERENCE).defineReferencesTo(types.getDefaultSchema("justeadmin")).setSearchable(true); } }); SchemasDisplayManager metadataSchemasDisplayManager = getAppLayerFactory().getMetadataSchemasDisplayManager(); metadataSchemasDisplayManager.saveMetadata(metadataSchemasDisplayManager.getMetadata(zeCollection, "folder_default_newSearchableMetadata") .withVisibleInAdvancedSearchStatus(true)); List<MetadataVO> newMetadatas = presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE); newMetadatas.removeAll(baseMetadatas); assertThat(newMetadatas.size()).isEqualTo(1); assertThat(newMetadatas.get(0).getCode()).isEqualTo("folder_default_newSearchableMetadata"); connectWithBob(); assertThat(baseMetadatas).containsAll(presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE)); } @Test public void givenAdvanceSearchThenDoNotShowDisabledMetadatas() throws RecordServicesException { connectWithAdmin(); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.BORROWED) .setEnabled(false); } }); List<MetadataVO> baseMetadatas = presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.BORROWED) .setEnabled(true); } }); List<MetadataVO> newMetadatas = presenter.getMetadataAllowedInAdvancedSearch(Folder.SCHEMA_TYPE); newMetadatas.removeAll(baseMetadatas); assertThat(newMetadatas.size()).isEqualTo(1); assertThat(newMetadatas.get(0).getCode()).isEqualTo("folder_default_" + Folder.BORROWED); } private void connectWithAlice() { sessionContext = FakeSessionContext.aliceInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(advancedSearchView.getSessionContext()).thenReturn(sessionContext); presenter = new AdvancedSearchPresenter(advancedSearchView); } private void connectWithAdmin() { sessionContext = FakeSessionContext.adminInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(advancedSearchView.getSessionContext()).thenReturn(sessionContext); presenter = new AdvancedSearchPresenter(advancedSearchView); } private void connectWithBob() { sessionContext = FakeSessionContext.bobInCollection(zeCollection); sessionContext.setCurrentLocale(Locale.FRENCH); when(advancedSearchView.getSessionContext()).thenReturn(sessionContext); presenter = new AdvancedSearchPresenter(advancedSearchView); } // private MetadataSchemaTypes getSchemaTypes() { return getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection); } private Folder newFolder(String title) { return schemasRecordsServices.newFolderWithId("testFolder").setTitle(title).setOpenDate(LocalDate.now()) .setAdministrativeUnitEntered(rmRecords.unitId_10a) .setCategoryEntered(rmRecords.categoryId_X110) .setRetentionRuleEntered(rmRecords.getRule2()) .setCopyStatusEntered(CopyType.PRINCIPAL); } }