package com.constellio.app.services.collections;
import static com.constellio.model.entities.records.wrappers.Collection.SYSTEM_COLLECTION;
import static com.constellio.model.entities.security.global.AuthorizationAddRequest.authorizationInCollection;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.fromAllSchemasIn;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.services.collections.CollectionsManagerRuntimeException.CollectionsManagerRuntimeException_CollectionNotFound;
import com.constellio.app.services.collections.CollectionsManagerRuntimeException.CollectionsManagerRuntimeException_InvalidCode;
import com.constellio.data.dao.managers.config.values.PropertiesConfiguration;
import com.constellio.model.entities.records.wrappers.Collection;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.security.global.AuthorizationAddRequest;
import com.constellio.model.entities.security.global.UserCredential;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
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.LogicalSearchQueryOperators;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.security.AuthorizationsServices;
import com.constellio.model.services.security.roles.RolesManager;
import com.constellio.model.services.security.roles.RolesManagerRuntimeException;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.FolderSchema;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.TaxonomyRecords;
import com.constellio.sdk.tests.setups.Users;
public class CollectionsAcceptanceTest extends ConstellioTest {
Users users = new Users();
CollectionsManager collectionsManager;
UserServices userServices;
RolesManager rolesManager;
SearchServices searchServices;
MetadataSchemasManager metadataSchemasManager;
AuthorizationsServices authorizationsServices;
RecordServices recordServices;
TaxonomiesManager taxonomiesManager;
TwoTaxonomiesContainingFolderAndDocumentsSetup constellioSchemas = new TwoTaxonomiesContainingFolderAndDocumentsSetup(
"constellio");
FolderSchema constellioFolderSchema = constellioSchemas.new FolderSchema();
TwoTaxonomiesContainingFolderAndDocumentsSetup doculibreSchemas = new TwoTaxonomiesContainingFolderAndDocumentsSetup(
"doculibre");
FolderSchema doculibreFolderSchema = doculibreSchemas.new FolderSchema();
TaxonomyRecords constellioTaxos;
TaxonomyRecords doculibreTaxos;
TaxonomiesSearchServices taxonomiesSearchServices;
@Before
public void setUp()
throws Exception {
collectionsManager = getAppLayerFactory().getCollectionsManager();
userServices = getModelLayerFactory().newUserServices();
rolesManager = getModelLayerFactory().getRolesManager();
searchServices = getModelLayerFactory().newSearchServices();
taxonomiesManager = getModelLayerFactory().getTaxonomiesManager();
metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
authorizationsServices = getModelLayerFactory().newAuthorizationsServices();
recordServices = getModelLayerFactory().newRecordServices();
taxonomiesSearchServices = getModelLayerFactory().newTaxonomiesSearchService();
}
@Test(expected = CollectionsManagerRuntimeException_InvalidCode.class)
public void whenCreateCollectionWithInvalidNameThenException()
throws Exception {
givenCollection("constellio.com");
}
@Test(expected = CollectionsManagerRuntimeException_InvalidCode.class)
public void whenCreateCollectionWithAnotherInvalidNameThenException()
throws Exception {
givenCollection("constellio com");
}
@Test
public void whenCreateCollectionThenCollectionRecordCreated()
throws Exception {
givenConstellioAndDoculibreCollectionsWithBobAndLegendsInConstellioAndLegendsAndHeroesInDoculibre();
Collection constellioCollection = collectionsManager.getCollection("constellio");
Collection doculibreCollection = collectionsManager.getCollection("doculibre");
recordServices.update(constellioCollection.setName("Constellio 5").getWrappedRecord());
recordServices.update(doculibreCollection.setName("Doculibre").getWrappedRecord());
assertThat(collectionsManager.getCollection("constellio").getName()).isEqualTo("Constellio 5");
assertThat(collectionsManager.getCollection("doculibre").getName()).isEqualTo("Doculibre");
}
@Test
public void whenDeletingAndRecreatingACollectionWithSameCodeThenOk()
throws Exception {
givenCollection(zeCollection).withConstellioRMModule().withConstellioESModule();
givenCollection("anotherCollection").withConstellioRMModule().withConstellioESModule();
UserServices userServices = getModelLayerFactory().newUserServices();
userServices.addUserToCollection(userServices.getUser(admin), zeCollection);
userServices.addUserToCollection(userServices.getUser(admin), "anotherCollection");
assertThat(getAppLayerFactory().getModulesManager().getEnabledModules(zeCollection)).extracting("class.name")
.containsOnly("com.constellio.app.modules.tasks.TaskModule", "com.constellio.app.modules.es.ConstellioESModule",
"com.constellio.app.modules.rm.ConstellioRMModule");
collectionsManager.deleteCollection(zeCollection);
givenCollection(zeCollection).withConstellioRMModule().withRobotsModule();
assertThat(getAppLayerFactory().getModulesManager().getEnabledModules(zeCollection)).extracting("class.name")
.containsOnly("com.constellio.app.modules.tasks.TaskModule",
"com.constellio.app.modules.robots.ConstellioRobotsModule",
"com.constellio.app.modules.rm.ConstellioRMModule");
assertThat(userServices.getUser(admin).getCollections()).containsOnly("anotherCollection");
userServices.addUserToCollection(userServices.getUser(admin), zeCollection);
}
@Test
public void whenCreatingCollectionThenAsSpecifiedLanguages()
throws Exception {
String mainDataLanguage = getModelLayerFactory().getConfiguration().getMainDataLanguage();
givenSpecialCollection("constellio", Arrays.asList("fr", "en"));
givenSpecialCollection("doculibre", Arrays.asList(mainDataLanguage));
assertThat(collectionsManager.getCollection(SYSTEM_COLLECTION).getLanguages()).containsOnly(mainDataLanguage);
assertThat(collectionsManager.getCollection("constellio").getLanguages()).isEqualTo(Arrays.asList("fr", "en"));
assertThat(collectionsManager.getCollection("doculibre").getLanguages()).isEqualTo(Arrays.asList(mainDataLanguage));
}
@Test(expected = CollectionsManagerRuntimeException_CollectionNotFound.class)
public void whenGetInexistentCollectionThenException()
throws Exception {
collectionsManager.getCollection("InexistentCollection");
}
@Test
public void givenTwoCollectionsWhenAssignAuthorizationsThenOnlyWorkForGivenCollection()
throws Exception {
givenConstellioAndDoculibreCollectionsWithBobAndLegendsInConstellioAndLegendsAndHeroesInDoculibre();
givenConstellioUserAuthorizationForChuckNorrisHeroesAndLegendsInTaxo1FirstTypeItems1And2();
givenDoculibreUserAuthorizationForChuckNorrisHeroesAndLegendsInTaxo1FirstTypeItems1And2();
waitForBatchProcess();
givenFolderInConstellio();
givenFolderInDoculibre();
assertThat(resultCountWhenSearchingHas(users.aliceIn("constellio"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.bobIn("constellio"))).isEqualTo(0);
assertThat(users.charles().getCollections()).doesNotContain("constellio").doesNotContain(SYSTEM_COLLECTION);
assertThat(users.dakotaLIndien().getCollections()).doesNotContain("constellio").doesNotContain(SYSTEM_COLLECTION);
assertThat(resultCountWhenSearchingHas(users.edouardLechatIn("constellio"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.gandalfLeblancIn("constellio"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.chuckNorrisIn("constellio"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.aliceIn("doculibre"))).isEqualTo(1);
assertThat(users.bob().getCollections()).doesNotContain("doculibre").doesNotContain(SYSTEM_COLLECTION);
assertThat(resultCountWhenSearchingHas(users.charlesIn("doculibre"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.dakotaLIndienIn("doculibre"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.edouardLechatIn("doculibre"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.gandalfLeblancIn("doculibre"))).isEqualTo(1);
assertThat(resultCountWhenSearchingHas(users.chuckNorrisIn("doculibre"))).isEqualTo(1);
}
@Test
public void givenTwoCollectionsWhenDeleteCollectionThenOnlyDeleteTheCollection()
throws Exception {
givenConstellioAndDoculibreCollectionsWithBobAndLegendsInConstellioAndLegendsAndHeroesInDoculibre();
givenConstellioUserAuthorizationForChuckNorrisHeroesAndLegendsInTaxo1FirstTypeItems1And2();
givenDoculibreUserAuthorizationForChuckNorrisHeroesAndLegendsInTaxo1FirstTypeItems1And2();
waitForBatchProcess();
givenFolderInConstellio();
givenFolderInDoculibre();
Set<String> collectionsInUserCredentialFile = getAllCollectionsInUserCredentialFile();
Set<String> collectionsInVersionProperties = getAllCollectionsInVersionPropertiesFile();
assertThat(collectionsInUserCredentialFile).doesNotContain("_system_");
assertThat(collectionsInVersionProperties).contains("constellio_version");
recordServices.flush();
assertThat(searchServices.getResultsCount(fromAllSchemasIn("_system_").returnAll())).isEqualTo(21);
assertThat(getDataLayerFactory().getConfigManager().exist("/_system_/authorizations.xml")).isTrue();
assertThat(getDataLayerFactory().getConfigManager().exist("/_system_/schemas.xml")).isTrue();
assertThat(getDataLayerFactory().getConfigManager().exist("/_system_/roles.xml")).isTrue();
assertThat(getDataLayerFactory().getConfigManager().exist("/_system_/taxonomies.xml")).isTrue();
assertThat(collectionsInUserCredentialFile).contains("constellio");
assertThat(collectionsInVersionProperties).contains("constellio_version");
recordServices.flush();
assertThat(searchServices.getResultsCount(fromAllSchemasIn("constellio").returnAll())).isEqualTo(35);
assertThat(searchServices.getResultsCount(fromAllSchemasIn("doculibre").returnAll())).isEqualTo(36);
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/authorizations.xml")).isTrue();
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/schemas.xml")).isTrue();
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/roles.xml")).isTrue();
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/taxonomies.xml")).isTrue();
assertThat(userServices.getUser(bobGratton).getCollections()).contains("constellio");
collectionsManager.deleteCollection("constellio");
recordServices.flush();
assertThat(searchServices.getResultsCount(fromAllSchemasIn("constellio").returnAll())).isEqualTo(0);
assertThat(searchServices.getResultsCount(fromAllSchemasIn("doculibre").returnAll())).isEqualTo(36);
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/authorizations.xml")).isFalse();
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/schemas.xml")).isFalse();
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/roles.xml")).isFalse();
assertThat(getDataLayerFactory().getConfigManager().exist("/constellio/taxonomies.xml")).isFalse();
collectionsInUserCredentialFile = getAllCollectionsInUserCredentialFile();
collectionsInVersionProperties = getAllCollectionsInVersionPropertiesFile();
assertThat(collectionsInUserCredentialFile).doesNotContain("constellio");
assertThat(collectionsInVersionProperties).doesNotContain("constellio_version");
assertThat(userServices.getUser(bobGratton).getCollections()).doesNotContain("constellio");
assertThat(userServices.getGroup("legends").getUsersAutomaticallyAddedToCollections()).doesNotContain("constellio")
.contains("doculibre");
}
private Set<String> getAllCollectionsInUserCredentialFile() {
Set<String> collections = new HashSet<>();
List<UserCredential> userCredentials = getModelLayerFactory().getUserCredentialsManager().getActiveUserCredentials();
for (UserCredential userCredential : userCredentials) {
collections.addAll(userCredential.getCollections());
}
return collections;
}
private Set<String> getAllCollectionsInVersionPropertiesFile() {
PropertiesConfiguration propertiesConfiguration = getDataLayerFactory().getConfigManager()
.getProperties("version.properties");
Set<String> collectionsInVersionProperties = propertiesConfiguration.getProperties().keySet();
return collectionsInVersionProperties;
}
private int resultCountWhenSearchingHas(User user) {
MetadataSchema folderSchema = metadataSchemasManager.getSchemaTypes(user.getCollection()).getSchema("folder_default");
LogicalSearchCondition condition = LogicalSearchQueryOperators.from(folderSchema).returnAll();
LogicalSearchQuery query = new LogicalSearchQuery(condition);
query.filteredWithUser(user);
return searchServices.searchRecordIds(query).size();
}
private void givenFolderInConstellio()
throws RecordServicesException {
TestRecord constellioFolderInItem2 = new TestRecord(constellioFolderSchema.instance(), "constellioFolderInItem2");
constellioFolderInItem2.set(constellioFolderSchema.taxonomy1(), constellioTaxos.taxo1_firstTypeItem2_secondTypeItem1);
constellioFolderInItem2.set(constellioFolderSchema.title(), "My constellio folder");
recordServices.add(constellioFolderInItem2);
}
private void givenFolderInDoculibre()
throws RecordServicesException {
TestRecord doculibreFolderInItem2 = new TestRecord(doculibreFolderSchema.instance(), "doculibreFolderInItem2");
doculibreFolderInItem2.set(doculibreFolderSchema.taxonomy1(), doculibreTaxos.taxo1_firstTypeItem2_secondTypeItem1);
doculibreFolderInItem2.set(doculibreFolderSchema.title(), "My doculibre folder");
recordServices.add(doculibreFolderInItem2);
}
private void givenDoculibreUserAuthorizationForChuckNorrisHeroesAndLegendsInTaxo1FirstTypeItems1And2()
throws RolesManagerRuntimeException {
List<String> doculibreUserAuthorizationPrincipals = Arrays.asList(users.chuckNorrisIn("doculibre").getId(), users
.legendsIn("doculibre").getId(), users.heroesIn("doculibre").getId());
authorizationsServices.add(authorizationInCollection("doculibre").givingReadWriteAccess()
.forPrincipalsIds(doculibreUserAuthorizationPrincipals).on(doculibreTaxos.taxo1_firstTypeItem1));
authorizationsServices.add(authorizationInCollection("doculibre").givingReadWriteAccess()
.forPrincipalsIds(doculibreUserAuthorizationPrincipals).on(doculibreTaxos.taxo1_firstTypeItem2));
}
private void givenConstellioUserAuthorizationForChuckNorrisHeroesAndLegendsInTaxo1FirstTypeItems1And2()
throws RolesManagerRuntimeException {
List<String> constellioUserAuthorizationPrincipals = Arrays.asList(users.chuckNorrisIn("constellio").getId(), users
.legendsIn("constellio").getId(), users.heroesIn("constellio").getId());
authorizationsServices.add(authorizationInCollection("constellio").givingReadAccess()
.forPrincipalsIds(constellioUserAuthorizationPrincipals).on(constellioTaxos.taxo1_firstTypeItem1));
authorizationsServices.add(authorizationInCollection("constellio").givingReadAccess()
.forPrincipalsIds(constellioUserAuthorizationPrincipals).on(constellioTaxos.taxo1_firstTypeItem2));
}
private void givenConstellioAndDoculibreCollectionsWithBobAndLegendsInConstellioAndLegendsAndHeroesInDoculibre() {
users.setUp(userServices);
givenCollection("constellio");
givenCollection("doculibre");
userServices.addUserToCollection(users.bob(), "constellio");
userServices.addUserToCollection(users.chuckNorris(), "constellio");
userServices.addUserToCollection(users.chuckNorris(), "doculibre");
userServices.addUpdateGlobalGroup(users.legends().withUsersAutomaticallyAddedToCollections(
Arrays.asList("constellio", "doculibre")));
userServices
.addUpdateGlobalGroup(users.heroes().withUsersAutomaticallyAddedToCollections(Arrays.asList("doculibre")));
defineSchemasManager().using(constellioSchemas);
defineSchemasManager().using(doculibreSchemas);
taxonomiesManager.addTaxonomy(constellioSchemas.getTaxo1(), metadataSchemasManager);
taxonomiesManager.setPrincipalTaxonomy(constellioSchemas.getTaxo1(), metadataSchemasManager);
taxonomiesManager.addTaxonomy(doculibreSchemas.getTaxo1(), metadataSchemasManager);
taxonomiesManager.setPrincipalTaxonomy(doculibreSchemas.getTaxo1(), metadataSchemasManager);
constellioTaxos = constellioSchemas.givenTaxonomyRecords(recordServices);
doculibreTaxos = doculibreSchemas.givenTaxonomyRecords(recordServices);
}
}