package com.constellio.model.services.users;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.sdk.tests.TestUtils.usernamesOf;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
import java.security.Key;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Cart;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.model.entities.security.global.*;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.sdk.tests.TestUtils;
import com.constellio.sdk.tests.annotations.InDevelopmentTest;
import com.constellio.sdk.tests.setups.Users;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.services.collections.CollectionsManager;
import com.constellio.data.utils.Factory;
import com.constellio.data.utils.dev.Toggle;
import com.constellio.model.conf.ModelLayerConfiguration;
import com.constellio.model.conf.PropertiesModelLayerConfiguration.InMemoryModelLayerConfiguration;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.encrypt.EncryptionKeyFactory;
import com.constellio.model.services.encrypt.EncryptionServices;
import com.constellio.model.services.factories.ModelLayerFactoryUtils;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.SchemasRecordsServices;
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.authentification.AuthenticationService;
import com.constellio.model.services.security.roles.RolesManager;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_CannotExcuteTransaction;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_CannotRemoveAdmin;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_InvalidUserNameOrPassword;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_NoSuchGroup;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_NoSuchUser;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_UserIsNotInCollection;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.ModelLayerConfigurationAlteration;
import com.constellio.sdk.tests.annotations.SlowTest;
public class UserServicesAcceptanceTest extends ConstellioTest {
LocalDateTime shishOClock = LocalDateTime.now();
CollectionsManager collectionsManager;
UserServices userServices;
RecordServices recordServices;
SearchServices searchServices;
List<String> noCollections = Collections.emptyList();
List<String> andNoCollections = Collections.emptyList();
List<String> noGroups = Collections.emptyList();
String legends, heroes;
List<String> allCollections;
String collection1, collection2, collection3;
UserCredential user, anotherUser, thirdUser;
UserCredentialsManager userCredentialsManager;
GlobalGroupsManager globalGroupsManager;
@Mock UserCredential userWithNoAccessToDeleteCollection;
@Mock Factory<EncryptionServices> encryptionServicesFactory;
AuthenticationService authenticationService;
List<String> msExchDelegateListBL = new ArrayList<>();
@Before
public void setUp()
throws Exception {
givenBackgroundThreadsEnabled();
withSpiedServices(ModelLayerConfiguration.class);
configure(new ModelLayerConfigurationAlteration() {
@Override
public void alter(InMemoryModelLayerConfiguration configuration) {
org.joda.time.Duration fourSeconds = org.joda.time.Duration.standardSeconds(4);
org.joda.time.Duration oneSecond = org.joda.time.Duration.standardSeconds(1);
configuration.setTokenDuration(fourSeconds);
configuration.setTokenRemovalThreadDelayBetweenChecks(oneSecond);
}
});
}
@Test
public void givenGlobalGroupInACollectionWhenRemovingFromCollectionAndAddingUsersThenOK()
throws Exception {
givenCollection1And2();
givenHeroesGroup();
givenLegendsGroup();
//userServices.removeGroupFromCollections();
}
@Test
@SlowTest
public void whenEveryoneGetsInHereThenStillNotLetal()
throws Exception {
onlyWhen(Toggle.NEW_USERCREDENTIAL_SERVICES).isEnabled();
givenCollection1And2();
for (int i = 0; i < 10000; i++) {
user = userServices
.createUserCredential("grimPatron" + i, "Grim", "Patron", "grim.patron." + i + "@doculibre.com", noGroups,
noCollections, UserCredentialStatus.ACTIVE, "domain", msExchDelegateListBL, null)
.withSystemAdminPermission();
userServices.addUpdateUserCredential(user);
}
for (int i = 0; i < 10000; i++) {
assertThat(userServices.getUser("grimPatron" + i)).isNotNull();
//assertThat(userServices.getUserInCollection("grimPatron" + i, zeCollection)).isNotNull();
}
}
@Test
public void given2GlobalGroupsAnd2CustomGroupsWhenGetAllGroupsThenCanObtainCustomGlobalAndAllGroups()
throws Exception {
givenCollection1And2();
givenHeroesGroup();
givenLegendsGroup();
userServices.createCustomGroupInCollectionWithCodeAndName("collection1", "A", "Group A");
userServices.createCustomGroupInCollectionWithCodeAndName("collection1", "B", "Group B");
userServices.createCustomGroupInCollectionWithCodeAndName("collection2", "C", "Group C");
Group collection1Legends = userServices.getGroupInCollection("legends", "collection1");
Group collection1Heroes = userServices.getGroupInCollection("heroes", "collection1");
Group collection1GroupA = userServices.getGroupInCollection("A", "collection1");
Group collection1GroupB = userServices.getGroupInCollection("B", "collection1");
Group collection2GroupC = userServices.getGroupInCollection("C", "collection2");
assertThat(collection1Legends).isNotNull();
assertThat(collection1Heroes).isNotNull();
assertThat(collection1GroupA).isNotNull();
assertThat(collection1GroupB).isNotNull();
assertThat(collection2GroupC).isNotNull();
assertThat(userServices.getAllGroupsInCollections("collection1"))
.containsOnly(collection1Heroes, collection1Legends, collection1GroupA, collection1GroupB);
assertThat(userServices.getCollectionGroups("collection1")).containsOnly(collection1GroupA, collection1GroupB);
assertThat(userServices.getGlobalGroupsInCollections("collection1")).containsOnly(collection1Heroes, collection1Legends);
}
@Test
public void whenCreatingUserThenCredentialObtainable()
throws Exception {
setupAfterCollectionCreation();
givenUserWith(noGroups, noCollections);
assertThat(userServices.getUser(user.getUsername()).getUsername()).isEqualTo(chuckNorris);
}
@Test
public void whenCreatingUserInCollectionThenIsInCollection()
throws Exception {
givenCollection1();
givenUserWith(noGroups, and(collection1));
assertThatUserIsOnlyInCollections(user, collection1);
}
@Test
public void whenCreatingUserInInvalidCollectionThenNotSetted()
throws Exception {
givenCollection1();
givenUserWith(noGroups, and(collection1, "invalidCollection"));
assertThatUserIsOnlyInCollections(user, collection1);
}
@Test
public void givenExistingUserWhenUpdatingWithCollectionsThenAdded()
throws Exception {
givenCollection1();
givenUserWith(noGroups, andNoCollections);
assertThatUserIsOnlyInCollections(user);
givenUserWith(noGroups, and(collection1));
assertThatUserIsOnlyInCollections(user, collection1);
}
@Test
public void givenExistingUserWhenAddingToCollectionThenAdded()
throws Exception {
givenCollection1();
givenUserWith(noGroups, andNoCollections);
assertThatUserIsOnlyInCollections(user);
userServices.addUserToCollection(user, collection1);
assertThatUserIsOnlyInCollections(user, collection1);
}
@Test
public void givenUserInCollectionWhenRemovingFromCollectionThenHasDisabledStatus()
throws Exception {
givenCollection1And2();
givenUserWith(noGroups, and(collection1, collection2));
userServices.removeUserFromCollection(user, collection1);
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection1)
.where(userServices.usernameMetadata(collection1)).is(user.getUsername());
Record userCredentialRecord = searchServices.searchSingleResult(condition);
assertThat(userCredentialRecord.isActive()).isFalse();
assertThatUserIsOnlyInCollections(user, collection2);
}
@Test
public void givenUserInCollectionsWhenRemovingHimThenRemoveFromAllCollectionsAndChangeStatus()
throws Exception {
givenCollection1And2();
givenUserWith(noGroups, and(collection1, collection2));
userServices.removeUserCredentialAndUser(user);
Map<String, User> userInCollection = new HashMap<>();
for (String collection : Arrays.asList(collection1, collection2)) {
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection)
.where(userServices.usernameMetadata(collection)).is(user.getUsername());
Record userCredentialRecord = searchServices.searchSingleResult(condition);
User userRecord = new User(userCredentialRecord,
getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection),
getModelLayerFactory().getRolesManager().getCollectionRoles(collection));
userInCollection.put(collection, userRecord);
}
assertThat(userInCollection.get(collection1).getWrappedRecord().isActive()).isFalse();
assertThat(userInCollection.get(collection2).getWrappedRecord().isActive()).isFalse();
assertThat(userInCollection.get(collection1).getStatus()).isEqualTo(UserCredentialStatus.DELETED);
assertThat(userInCollection.get(collection2).getStatus()).isEqualTo(UserCredentialStatus.DELETED);
assertThat(userServices.getUser(user.getUsername()).getStatus()).isEqualTo(UserCredentialStatus.DELETED);
assertThat(userServices.getAllUserCredentials()).hasSize(2);
assertThat(userServices.getActiveUserCredentials()).hasSize(1);
assertThat(userServices.getActiveUserCredentials().get(0).getUsername()).isEqualTo("admin");
}
@Test
public void givenUserInCollectionsWhenSetStatusPedingApprovalThenRemoveFromAllCollectionsAndChangeStatus()
throws Exception {
givenCollection1And2();
givenUserWith(noGroups, and(collection1, collection2));
userServices.setUserCredentialAndUserStatusPendingApproval(user);
Map<String, User> userInCollection = new HashMap<>();
for (String collection : Arrays.asList(collection1, collection2)) {
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection)
.where(userServices.usernameMetadata(collection1)).is(user.getUsername());
Record userCredentialRecord = searchServices.searchSingleResult(condition);
User userRecord = new User(userCredentialRecord,
getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection),
getModelLayerFactory().getRolesManager().getCollectionRoles(collection));
userInCollection.put(collection, userRecord);
}
assertThat(userInCollection.get(collection1).getWrappedRecord().isActive()).isFalse();
assertThat(userInCollection.get(collection2).getWrappedRecord().isActive()).isFalse();
assertThat(userInCollection.get(collection1).getStatus()).isEqualTo(UserCredentialStatus.PENDING);
assertThat(userInCollection.get(collection2).getStatus()).isEqualTo(UserCredentialStatus.PENDING);
assertThat(userServices.getUser(user.getUsername()).getStatus()).isEqualTo(UserCredentialStatus.PENDING);
}
@Test
public void givenUserInCollectionsWhenSuspendHimThenRemoveFromAllCollectionsAndChangeStatus()
throws Exception {
givenCollection1And2();
givenUserWith(noGroups, and(collection1, collection2));
userServices.suspendUserCredentialAndUser(user);
Map<String, User> userInCollection = new HashMap<>();
for (String collection : Arrays.asList(collection1, collection2)) {
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection)
.where(userServices.usernameMetadata(collection1)).is(user.getUsername());
Record userCredentialRecord = searchServices.searchSingleResult(condition);
User userRecord = new User(userCredentialRecord,
getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection),
getModelLayerFactory().getRolesManager().getCollectionRoles(collection));
userInCollection.put(collection, userRecord);
}
assertThat(userInCollection.get(collection1).getWrappedRecord().isActive()).isFalse();
assertThat(userInCollection.get(collection2).getWrappedRecord().isActive()).isFalse();
assertThat(userInCollection.get(collection1).getStatus()).isEqualTo(UserCredentialStatus.SUSPENDED);
assertThat(userInCollection.get(collection2).getStatus()).isEqualTo(UserCredentialStatus.SUSPENDED);
assertThat(userServices.getUser(user.getUsername()).getStatus()).isEqualTo(UserCredentialStatus.SUSPENDED);
}
@Test
public void givenInactiveUserWhenActiveHimThenActiveInAllCollectionsUserAndChangeStatus()
throws Exception {
givenCollection1And2();
givenUserWith(noGroups, and(collection1, collection2));
userServices.removeUserCredentialAndUser(user);
userServices.activeUserCredentialAndUser(user);
Map<String, User> userInCollection = new HashMap<>();
for (String collection : Arrays.asList(collection1, collection2)) {
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection)
.where(userServices.usernameMetadata(collection1)).is(user.getUsername());
Record userCredentialRecord = searchServices.searchSingleResult(condition);
User userRecord = new User(userCredentialRecord,
getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection),
getModelLayerFactory().getRolesManager().getCollectionRoles(collection));
userInCollection.put(collection, userRecord);
}
assertThat(userInCollection.get(collection1).getWrappedRecord().isActive()).isTrue();
assertThat(userInCollection.get(collection2).getWrappedRecord().isActive()).isTrue();
assertThat(userInCollection.get(collection1).getStatus()).isEqualTo(UserCredentialStatus.ACTIVE);
assertThat(userInCollection.get(collection2).getStatus()).isEqualTo(UserCredentialStatus.ACTIVE);
assertThat(userServices.getUser(user.getUsername()).getStatus()).isEqualTo(UserCredentialStatus.ACTIVE);
}
@Test
public void givenGroupInCollectionWhenRemovingFromCollectionThenRemoveUsersToo()
throws Exception {
givenCollection1And2();
givenLegendsGroupWithAllUsersInCollections(collection1, collection2);
givenHeroesGroupWithAllUsersInCollections(collection1, collection2);
givenUserWith(asList(legends), and(collection1, collection2));
givenAnotherUserWith(asList(legends), and(collection1, collection2));
givenAThirdUserWith(asList(heroes), and(collection1, collection2));
GlobalGroup legendsGroup = userServices.getGroup(legends);
Record recordLegendsCollection1 = getRecordGroupInCollection(legendsGroup, collection1);
Record recordLegendsCollection2 = getRecordGroupInCollection(legendsGroup, collection2);
assertThat(userServices.getAllGroupsInCollections(collection1)).hasSize(2);
assertThat(userServices.getAllGroupsInCollections(collection2)).hasSize(2);
List<Record> recordsInLegendsCollection1 = getRecordsInGroupInCollection(recordLegendsCollection1, collection1);
List<Record> recordsInLegendsCollection2 = getRecordsInGroupInCollection(recordLegendsCollection2, collection2);
assertThat(recordsInLegendsCollection1).isNotEmpty();
assertThat(recordsInLegendsCollection2).isNotEmpty();
userServices.logicallyRemoveGroupHierarchy(user, legendsGroup);
recordsInLegendsCollection1 = getRecordsInGroupInCollection(recordLegendsCollection1, collection1);
recordsInLegendsCollection2 = getRecordsInGroupInCollection(recordLegendsCollection2, collection2);
recordLegendsCollection1 = getRecordGroupInCollection(legendsGroup, collection1);
recordLegendsCollection2 = getRecordGroupInCollection(legendsGroup, collection2);
assertThat(userCredentialsManager.getUserCredentialsInGlobalGroup(legendsGroup.getCode())).isEmpty();
assertThat(globalGroupsManager.getActiveGroups()).hasSize(1);
assertThat(recordLegendsCollection1.isActive()).isFalse();
assertThat(recordLegendsCollection2.isActive()).isFalse();
assertThat(recordsInLegendsCollection1).isEmpty();
assertThat(recordsInLegendsCollection2).isEmpty();
assertThat(userServices.getAllGroupsInCollections(collection1)).hasSize(1);
assertThat(userServices.getAllGroupsInCollections(collection2)).hasSize(1);
}
@Test
public void whenCreatingGlobalGroupThenObtainable()
throws Exception {
setupAfterCollectionCreation();
givenLegendsGroup();
assertThat(userServices.getGroup(legends).getCode()).isEqualTo(legends);
}
@Test
public void whenCreatingGlobalGroupThenObtainableInCollections()
throws Exception {
givenCollection1();
givenLegendsGroup();
assertThat(userServices.getGroupInCollection(legends, collection1).getCode()).isEqualTo(legends);
}
@Test
public void whenCreatingCollectionThenAddGlobalGroups()
throws Exception {
setupAfterCollectionCreation();
givenLegendsGroup();
collection1 = "collection1";
givenCollection(collection1);
assertThat(userServices.getGroupInCollection(legends, collection1).getCode()).isEqualTo(legends);
}
@Test
public void whenCreatingUserWithGroupWithAutomaticCollectionMembershipThenInCollection()
throws Exception {
givenCollection1And2And3();
givenLegendsGroupWithAllUsersInCollections(collection1);
givenHeroesGroup();
givenUserWith(groups(legends, heroes), and(collection2));
assertThatUserIsOnlyInCollections(user, collection1, collection2);
}
@Test
public void whenAddingAutomaticCollectionMembershipToGroupThenAddUsersThenInCollection()
throws Exception {
givenCollection1And2And3();
givenLegendsGroup();
givenHeroesGroup();
givenUserWith(groups(legends, heroes), and(collection2));
givenAnotherUserWith(groups(legends, heroes), andNoCollections);
assertThatUserIsOnlyInCollections(user, collection2);
assertThatUserIsOnlyInCollections(anotherUser);
givenLegendsGroupWithAllUsersInCollections(collection1);
assertThatUserIsOnlyInCollections(user, collection1, collection2);
assertThatUserIsOnlyInCollections(anotherUser, collection1);
}
@Test
public void givenMultipleUsersThenAllObtainedCorrectly()
throws Exception {
givenCollection1();
givenUserWith(noGroups, and(collection1));
givenAnotherUserWith(noGroups, and(collection1));
assertThat(userServices.getUser(user.getUsername()).getUsername()).contains(user.getUsername());
assertThat(userServices.getUser(anotherUser.getUsername()).getUsername()).contains(anotherUser.getUsername());
assertThat(userServices.getUserInCollection(user.getUsername(), collection1).getUsername()).contains(user.getUsername());
assertThat(userServices.getUserInCollection(anotherUser.getUsername(), collection1).getUsername())
.contains(anotherUser.getUsername());
}
@Test
public void givenUserInGroupThenIsInGroupUsers()
throws Exception {
givenCollection1();
givenLegendsGroup();
givenHeroesGroup();
givenUserWith(groups(legends), andNoCollections);
givenAnotherUserWith(groups(legends), andNoCollections);
givenAThirdUserWith(noGroups, andNoCollections);
assertThat(userServices.getGlobalGroupActifUsers(legends)).containsOnly(anotherUser, user);
assertThat(userServices.getGlobalGroupActifUsers(heroes)).isEmpty();
}
@Test
public void whenModifyingUsersAddingAndRemovingGroupThenAddedAndRemovedFromGroupList()
throws Exception {
givenCollection1();
givenLegendsGroup();
givenHeroesGroup();
givenUserWith(noGroups, andNoCollections);
givenAnotherUserWith(groups(legends), andNoCollections);
givenAThirdUserWith(noGroups, andNoCollections);
givenAnotherUserWith(groups(heroes), andNoCollections);
givenAThirdUserWith(groups(heroes), andNoCollections);
assertThat(userServices.getGlobalGroupActifUsers(legends)).isEmpty();
assertThat(userServices.getGlobalGroupActifUsers(heroes)).containsOnly(thirdUser, anotherUser);
assertThat(userServices.getUser(thirdUser.getUsername()).getGlobalGroups()).contains(heroes);
assertThat(userServices.getUser(anotherUser.getUsername()).getGlobalGroups()).contains(heroes);
}
@Test
public void whenSetGroupUserListThenListAndUserNewlyInGroupWithAutomaticMembershipAddedToCollections()
throws Exception {
givenCollection1And2();
givenLegendsGroupWithAllUsersInCollections(collection1);
givenHeroesGroup();
givenUserWith(noGroups, andNoCollections);
givenAnotherUserWith(noGroups, and(collection2));
givenAThirdUserWith(noGroups, andNoCollections);
userServices.setGlobalGroupUsers(legends, asList(user, anotherUser));
userServices.setGlobalGroupUsers(heroes, asList(user, thirdUser));
assertThat(usernamesOf(userServices.getGlobalGroupActifUsers(legends))).containsOnly(user.getUsername(),
anotherUser.getUsername());
assertThat(usernamesOf(userServices.getGlobalGroupActifUsers(heroes))).containsOnly(user.getUsername(),
thirdUser.getUsername());
assertThat(userServices.getUser(user.getUsername()).getGlobalGroups()).contains(heroes, legends);
assertThat(userServices.getUser(anotherUser.getUsername()).getGlobalGroups()).contains(legends);
assertThat(userServices.getUser(thirdUser.getUsername()).getGlobalGroups()).contains(heroes);
assertThatUserIsOnlyInCollections(user, collection1);
assertThatUserIsOnlyInCollections(anotherUser, collection1, collection2);
assertThatUserIsOnlyInCollections(thirdUser);
}
@Test
public void givenUserWhenAddOrUpdateThenTitleIsFirstPlusLastName()
throws Exception {
givenCollection1();
givenUserWith(noGroups, and(collection1));
assertThat(user.getTitle()).isEqualTo(user.getFirstName() + " " + user.getLastName());
}
@Test
public void givenUserCredentialIsModifiedThenChangesSynchedCorrectly()
throws Exception {
givenCollection1And2();
SchemasRecordsServices collection1Schemas = new SchemasRecordsServices(collection1, getModelLayerFactory());
Role role1 = new Role(collection1, "role1", "Ze role1",
asList(RMPermissionsTo.CREATE_DOCUMENTS, RMPermissionsTo.CREATE_FOLDERS));
Role role2 = new Role(collection1, "role2", "Ze role2",
asList(RMPermissionsTo.CREATE_SUB_FOLDERS, RMPermissionsTo.CREATE_INACTIVE_DOCUMENT));
Role role3 = new Role(collection1, "role3", "Ze role3",
asList(RMPermissionsTo.MANAGE_DOCUMENT_AUTHORIZATIONS, RMPermissionsTo.MANAGE_FOLDER_AUTHORIZATIONS));
RolesManager rolesManager = getModelLayerFactory().getRolesManager();
rolesManager.addRole(role1);
rolesManager.addRole(role2);
rolesManager.addRole(role3);
givenLegendsGroup();
givenUserWith(asList(legends), and(collection1));
Transaction transaction = new Transaction();
transaction.add(userServices.getUserInCollection(chuckNorris, collection1).setUserRoles(asList("role1", "role2")));
transaction.add(userServices.getGroupInCollection(legends, collection1).setRoles(asList("role3")));
recordServices.execute(transaction);
User user = userServices.getUserInCollection(chuckNorris, collection1);
assertThat(searchServices.getResultsCount(from(collection1Schemas.userSchemaType()).returnAll())).isEqualTo(1);
assertThat(user.getTitle()).isEqualTo("Chuck Norris");
assertThat(user.getEmail()).isEqualTo("chuck.norris@doculibre.com");
assertThat(userServices.getUserInCollection(chuckNorris, collection1).getAllRoles())
.containsOnlyOnce("role1", "role2", "role3");
userServices.addUpdateUserCredential(userServices.getUser(chuckNorris).withFirstName("CHUCK").withLastName("NORRIS")
.withEmail("chuck@norris.com"));
user = userServices.getUserInCollection(chuckNorris, collection1);
assertThat(user.getTitle()).isEqualTo("CHUCK NORRIS");
assertThat(user.getEmail()).isEqualTo("chuck@norris.com");
assertThat(userServices.getUserInCollection(chuckNorris, collection1).getAllRoles())
.containsOnlyOnce("role1", "role2", "role3");
assertThat(searchServices.getResultsCount(from(collection1Schemas.userSchemaType()).returnAll())).isEqualTo(1);
}
@Test
public void whenAddingUserToCollectionGivenTheUserRecordWriteFailsThenRollbackTheGlobalConfig()
throws Exception {
givenCollection1();
givenUserAndPassword();
userServices = spy(userServices);
doThrow(new UserServicesRuntimeException_CannotExcuteTransaction(new RuntimeException()))
.when(userServices).sync(any(XmlUserCredential.class));
try {
userServices.addUserToCollection(user, collection1);
} catch (UserServicesRuntimeException_CannotExcuteTransaction e) {
assertThat(userServices.getUser(user.getUsername()).getCollections()).isEmpty();
return;
}
fail("Expected exception not thrown");
}
@Test
public void givenTwoUsersWithSameEmailThenOk()
throws Exception {
givenCollection1();
givenUserAndPassword();
UserCredential user2 = userServices.createUserCredential(
chuckNorris + "Other", "Chuck", "Norris", "chuck.norris@doculibre.com", new ArrayList<String>(),
new ArrayList<String>(),
UserCredentialStatus.ACTIVE, "domain", msExchDelegateListBL, null);
userServices.addUpdateUserCredential(user2);
assertThat(userServices.getUser(chuckNorris + "Other").getEmail()).isEqualTo(user.getEmail());
}
// ---- Exception tests
@Test(expected = UserServicesRuntimeException_NoSuchUser.class)
public void whenGetInexistentUserThenException()
throws Exception {
givenCollection1();
userServices.getUser("nobody");
}
@Test(expected = UserServicesRuntimeException_NoSuchUser.class)
public void whenGetInexistentUserInExistentCollectionThenException()
throws Exception {
givenCollection1();
userServices.getUserInCollection("nobody", collection1);
}
@Test(expected = UserServicesRuntimeException_UserIsNotInCollection.class)
public void whenCreatingUserInNoCollectionsThenIsInNoCollections()
throws Exception {
givenCollection1();
givenUserWith(noGroups, andNoCollections);
userServices.getUserInCollection(user.getUsername(), collection1);
}
@Test
public void givenUserInGroupWhenRemoveUserFromGroupThenItIsRemoved()
throws Exception {
givenCollection1();
givenLegendsGroupWithAllUsersInCollections(collection1);
givenUserWith(asList(legends), asList(collection1));
assertThat(userServices.getUser(user.getUsername()).getGlobalGroups()).contains(legends);
userServices.removeUserFromGlobalGroup(user.getUsername(), legends);
assertThat(userServices.getUser(user.getUsername()).getGlobalGroups()).doesNotContain(legends);
}
@Test(expected = UserServicesRuntimeException_NoSuchGroup.class)
public void givenUserInGroupWhenRemoveUserFromInexistentGroupThenException()
throws Exception {
givenCollection1();
givenLegendsGroupWithAllUsersInCollections(collection1);
givenUserWith(asList(legends), asList(collection1));
userServices.removeUserFromGlobalGroup(user.getUsername(), "inexistentGroup");
}
@Test
public void givenUserAndPasswordWhenGetTokenThenItsReturned()
throws Exception {
givenCollection(zeCollection);
setupAfterCollectionCreation();
givenUserAndPassword();
String serviceKey = userServices.giveNewServiceToken(user);
String token = userServices.getToken(serviceKey, user.getUsername(), "1qaz2wsx");
user = userServices.getUser(user.getUsername());
assertThat(user.getAccessTokens()).containsKey(token);
}
@Test
@SlowTest
public void givenTokenIsGivenToUserThenExpiresAutomatically()
throws Exception {
givenCollection(zeCollection);
setupAfterCollectionCreation();
givenUserAndPassword();
String serviceKey = userServices.giveNewServiceToken(user);
String token = userServices.getToken(serviceKey, user.getUsername(), "1qaz2wsx");
user = userServices.getUser(user.getUsername());
for (int i = 0; i < 2000 && !userServices.getUser(user.getUsername()).getAccessTokens().isEmpty(); i++) {
Thread.sleep(50);
}
assertThat(userServices.getUser(user.getUsername()).getAccessTokens()).isEmpty();
}
//@Test
public void whenGeneratingALotOfTokensOnlyKeepLastFive()
throws Exception {
givenCollection(zeCollection);
setupAfterCollectionCreation();
givenUserAndPassword();
for (int i = 0; i < 10; i++) {
userServices.generateToken(user.getUsername());
}
List<String> last50Tokens = new ArrayList<>();
for (int i = 0; i < 50; i++) {
last50Tokens.add(userServices.generateToken(user.getUsername()));
}
assertThat(userServices.getUser(user.getUsername()).getTokenKeys()).containsOnly(last50Tokens.toArray(new String[0]));
}
@Test(expected = UserServicesRuntimeException_InvalidUserNameOrPassword.class)
public void givenUserAndPasswordWhenGetTokenThenException()
throws Exception {
setupAfterCollectionCreation();
givenUserAndPassword();
String serviceKey = userServices.giveNewServiceToken(user);
userServices.getToken(serviceKey, user.getUsername(), "wrongPassword");
}
@Test(expected = UserServicesRuntimeException_CannotRemoveAdmin.class)
public void givenAdminUserWhenRemovingHimThenException()
throws Exception {
setupAfterCollectionCreation();
UserCredential admin = userServices.getUserCredential("admin");
try {
userServices.removeUserCredentialAndUser(admin);
} finally {
assertThat(userServices.getUserCredential("admin")).isNotNull();
assertThat(userServices.getUserCredential("admin").getStatus()).isEqualTo(UserCredentialStatus.ACTIVE);
}
}
@Test(expected = UserServicesRuntimeException_CannotRemoveAdmin.class)
public void givenAdminUserWhenChangeStatusThenException()
throws Exception {
setupAfterCollectionCreation();
UserCredential admin = userServices.getUserCredential("admin");
admin = admin.withStatus(UserCredentialStatus.DELETED);
try {
userServices.addUpdateUserCredential(admin);
} finally {
assertThat(userServices.getUserCredential("admin")).isNotNull();
assertThat(userServices.getUserCredential("admin").getStatus()).isEqualTo(UserCredentialStatus.ACTIVE);
}
}
//---------
@Test
public void whenGetServiceKeyByTokenThenReturnIt()
throws Exception {
givenCollection(zeCollection);
setupAfterCollectionCreation();
givenUserAndPassword();
String serviceKey = userServices.giveNewServiceToken(user);
String token = userServices.getToken(serviceKey, user.getUsername(), "1qaz2wsx");
user = userServices.getUser(user.getUsername());
String newToken = userServices.getToken(serviceKey, token);
user = userServices.getUser(user.getUsername());
assertThat(user.getAccessTokens()).containsKey(newToken);
assertThat(user.getAccessTokens()).doesNotContainKey(token);
}
@Test
public void givenWrongTokenWhenGetServiceKeyByTokenThenException()
throws Exception {
givenCollection(zeCollection);
setupAfterCollectionCreation();
givenUserAndPassword();
String serviceKey = userServices.giveNewServiceToken(user);
String token = userServices.getToken(serviceKey, user.getUsername(), "1qaz2wsx");
user = userServices.getUser(user.getUsername());
try {
userServices.getToken(serviceKey, "wrongToken");
fail();
} catch (Exception e) {
assertThat(user.getAccessTokens()).containsKey(token);
}
}
@Test
public void whenGetTokenUserThenReturnUsername()
throws Exception {
givenCollection(zeCollection);
setupAfterCollectionCreation();
givenUserAndPassword();
String serviceKey = userServices.giveNewServiceToken(user);
String token = userServices.getToken(serviceKey, user.getUsername(), "1qaz2wsx");
user = userServices.getUser(user.getUsername());
String username = userServices.getTokenUser(serviceKey, token);
assertThat(user.getUsername()).isEqualTo(username);
}
@Test
public void whenCreatingGroupsWithHierarchyThenOk()
throws Exception {
givenCollection1();
GlobalGroup group1 = userServices.createGlobalGroup("group1", "group1", asList(""), null, GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1 = userServices.createGlobalGroup(
"group1_1", "group1_1", asList(""), "group1", GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1_1 = userServices.createGlobalGroup(
"group1_1_1", "group1_1_1", asList(""), "group1_1", GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(group1);
userServices.addUpdateGlobalGroup(group1_1);
userServices.addUpdateGlobalGroup(group1_1_1);
assertThat(userServices.getChildrenOfGroupInCollection("group1", "collection1")).hasSize(1);
assertThat(userServices.getChildrenOfGroupInCollection("group1", "collection1").get(0).getCode()).isEqualTo("group1_1");
assertThat(userServices.getChildrenOfGroupInCollection("group1_1", "collection1")).hasSize(1);
assertThat(userServices.getChildrenOfGroupInCollection("group1_1", "collection1").get(0).getCode())
.isEqualTo("group1_1_1");
assertThat(userServices.getChildrenOfGroupInCollection("group1_1_1", "collection1")).isEmpty();
}
@Test
public void givenGroupHierarchyWhenRemoveGroupFromCollectionThenRemoveHierarchy()
throws Exception {
givenCollection1();
GlobalGroup group1 = userServices.createGlobalGroup("group1", "group1", asList(""), null, GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1 = userServices.createGlobalGroup(
"group1_1", "group1_1", asList(""), "group1", GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1_1 = userServices.createGlobalGroup(
"group1_1_1", "group1_1_1", asList(""), "group1_1", GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(group1);
userServices.addUpdateGlobalGroup(group1_1);
userServices.addUpdateGlobalGroup(group1_1_1);
UserCredential admin = userServices.getUserCredential("admin");
userServices.removeGroupFromCollections(admin, "group1", Arrays.asList("collection1"));
assertThat(userServices.getGroupInCollection("group1", "collection1").getWrappedRecord()
.get(Schemas.LOGICALLY_DELETED_STATUS)).isEqualTo(true);
assertThat(userServices.getChildrenOfGroupInCollection("group1", "collection1")).isEmpty();
assertThat(userServices.getChildrenOfGroupInCollection("group1_1", "collection1")).isEmpty();
assertThat(userServices.getChildrenOfGroupInCollection("group1_1_1", "collection1")).isEmpty();
}
@Test
public void givenGroupHierarchyWhenRemoveGroupThenRemoveHierarchy()
throws Exception {
givenCollection1();
List emptyList = new ArrayList<>();
GlobalGroup group1 = userServices.createGlobalGroup("group1", "group1", emptyList, null, GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1 = userServices.createGlobalGroup(
"group1_1", "group1_1", emptyList, "group1", GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1_1 = userServices.createGlobalGroup(
"group1_1_1", "group1_1_1", emptyList, "group1_1", GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(group1);
userServices.addUpdateGlobalGroup(group1_1);
userServices.addUpdateGlobalGroup(group1_1_1);
UserCredential admin = userServices.getUserCredential("admin");
userServices.logicallyRemoveGroupHierarchy(admin, group1);
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection1)
.where(userServices.groupCodeMetadata(collection1)).isIn(Arrays.asList(group1.getCode(), group1_1.getCode(),
group1_1_1.getCode()));
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
List<Record> groupRecords = searchServices.search(query);
assertThat(groupRecords.get(0).isActive()).isFalse();
assertThat(groupRecords.get(1).isActive()).isFalse();
assertThat(groupRecords.get(2).isActive()).isFalse();
assertThat(globalGroupsManager.getAllGroups()).hasSize(3);
assertThat(globalGroupsManager.getActiveGroups()).isEmpty();
assertThat(userServices.getGroup(group1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
try {
userServices.getActiveGroup(group1.getCode());
} catch (Exception e) {
assertThat(e.getMessage()).isEqualTo("No such group 'group1'");
}
}
@Test
public void givenGroupHierarchyWhenActiveGroupThenActiveHierarchy1()
throws Exception {
givenCollection1();
List emptyList = new ArrayList<>();
GlobalGroup group1 = userServices.createGlobalGroup("group1", "group1", emptyList, null, GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1 = userServices.createGlobalGroup(
"group1_1", "group1_1", emptyList, "group1", GlobalGroupStatus.ACTIVE, true);
GlobalGroup group1_1_1 = userServices.createGlobalGroup(
"group1_1_1", "group1_1_1", emptyList, "group1_1", GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(group1);
userServices.addUpdateGlobalGroup(group1_1);
userServices.addUpdateGlobalGroup(group1_1_1);
UserCredential admin = userServices.getUserCredential("admin");
userServices.logicallyRemoveGroupHierarchy(admin, group1);
userServices.activateGlobalGroupHierarchy(admin, group1);
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection1)
.where(userServices.groupCodeMetadata(collection1)).isIn(Arrays.asList(group1.getCode(), group1_1.getCode(),
group1_1_1.getCode()));
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
List<Record> groupRecords = searchServices.search(query);
assertThat(groupRecords.get(0).isActive()).isTrue();
assertThat(groupRecords.get(1).isActive()).isTrue();
assertThat(groupRecords.get(2).isActive()).isTrue();
assertThat(globalGroupsManager.getAllGroups()).hasSize(3);
assertThat(globalGroupsManager.getActiveGroups()).hasSize(3);
}
@Test
public void tryingToPhysicallyDeleteUser() throws RecordServicesException {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers());
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
Users users = new Users();
users.setUp(getModelLayerFactory().newUserServices());
User chuck = users.chuckNorrisIn(zeCollection);
Cart c = rm.getOrCreateUserCart(chuck);
Transaction t = new Transaction();
t.add(c);
recordServices.execute(t);
userServices = getModelLayerFactory().newUserServices();
List<String> aliceCollection = users.alice().getCollections();
try {
userServices.safePhysicalDeleteUserCredential(users.alice().getUsername());
int compteur = 0;
for (String collection : aliceCollection) {
try {
userServices.getUserInCollection(users.alice().getUsername(), collection);
} catch (Exception e) {
assertThat(e).isInstanceOf(UserServicesRuntimeException.UserServicesRuntimeException_NoSuchUser.class);
compteur++;
}
}
assertThat(compteur).isEqualTo(aliceCollection.size());
userServices.safePhysicalDeleteUserCredential(chuck.getUsername());
fail();
} catch (Exception e) {
assertThat(e).isInstanceOf(UserServicesRuntimeException.UserServicesRuntimeException_CannotSafeDeletePhysically.class);
e.printStackTrace();
}
}
@Test
public void tryingToDeleteAllUser() throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers());
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
Users users = new Users();
users.setUp(getModelLayerFactory().newUserServices());
User chuck = users.chuckNorrisIn(zeCollection);
Cart c = rm.getOrCreateUserCart(chuck);
Transaction t = new Transaction();
t.add(c);
recordServices.execute(t);
userServices = getModelLayerFactory().newUserServices();
for (UserCredential user : users.getAllUsers()) {
if (!user.isSystemAdmin()) {
for (String collection : user.getCollections()) {
if (!collection.equals("_system_")) {
userServices.getUserInCollection(user.getUsername(), collection).setStatus(UserCredentialStatus.DELETED);
}
}
user.withStatus(UserCredentialStatus.DELETED);
userServices.addUpdateUserCredential(user);
}
}
assertThat(userServices.safePhysicalDeleteAllUnusedUserCredentials()).extracting("username").containsExactly(chuck.getUsername());
}
@Test
public void tryingToSafeDeleteAllUnusedGlobalGroups()
throws Exception {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioESModule().withConstellioRMModule().withAllTestUsers().withRMTest(records));
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userServices = getModelLayerFactory().newUserServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
GlobalGroup g1 = globalGroupsManager.create("G1", null, GlobalGroupStatus.INACTIVE, true),
g2 = globalGroupsManager.create("G2", null, GlobalGroupStatus.ACTIVE, true),
g3 = globalGroupsManager.create("G3", null, GlobalGroupStatus.ACTIVE, true),
g4 = globalGroupsManager.create("G4", null, GlobalGroupStatus.INACTIVE, true);
Transaction t = new Transaction();
t.addAll(asList(g1, g2, g3, g4));
recordServices.execute(t);
UserCredential chuck = userCredentialsManager.getUserCredential(records.getChuckNorris().getUsername());
chuck.withGlobalGroups(asList(g2.getCode(), g3.getCode(), g4.getCode()));
userCredentialsManager.addUpdate(chuck);
assertThat(userServices.safePhysicalDeleteAllUnusedGlobalGroups()).doesNotContain(g1).contains(g2, g3, g4);
assertThat(globalGroupsManager.getGlobalGroupWithCode(g1.getCode())).isNull();
}
@Test
public void tryingToPhysicallyRemoveGlobalGroup() throws Exception {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioESModule().withConstellioRMModule().withAllTestUsers().withRMTest(records));
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userServices = getModelLayerFactory().newUserServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
GlobalGroup g1 = globalGroupsManager.create("G1", null, GlobalGroupStatus.ACTIVE, true),
g2 = globalGroupsManager.create("G2", null, GlobalGroupStatus.ACTIVE, true);
Transaction t = new Transaction();
t.addAll(asList(g1, g2));
recordServices.execute(t);
UserCredential gandalf = userCredentialsManager.getUserCredential(records.getGandalf_managerInABC().getUsername());
gandalf.withGlobalGroups(asList(g2.getCode()));
userCredentialsManager.addUpdate(gandalf);
assertThat(userServices.physicallyRemoveGlobalGroup(g1)).isEmpty();
assertThat(userServices.physicallyRemoveGlobalGroup(g2)).containsOnly(g2);
}
@Test
public void tryingToSafePhysicalDeleteAllUnusedGroups() throws Exception {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioESModule().withConstellioRMModule().withAllTestUsers().withRMTest(records));
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userServices = getModelLayerFactory().newUserServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
Group g1 = rm.newGroupWithId("G1");
g1.setTitle("Group 1");
g1.set(Group.CODE, "G1");
g1.set(Schemas.LOGICALLY_DELETED_STATUS, true);
Group g2 = rm.newGroupWithId("G2");
g2.setTitle("Group 2");
g2.set(Group.CODE, "G2");
g2.set(Schemas.LOGICALLY_DELETED_STATUS, true);
Group g3 = rm.newGroupWithId("G3");
g3.setTitle("Group 3");
g3.set(Group.CODE, "G3");
g3.set(Schemas.LOGICALLY_DELETED_STATUS, true);
Group g4 = rm.newGroupWithId("G4");
g4.setTitle("Group 4");
g4.set(Group.CODE, "G4");
g4.set(Schemas.LOGICALLY_DELETED_STATUS, true);
Transaction t = new Transaction();
t.addAll(asList(g1, g2, g3, g4));
t.add(records.getChuckNorris().setUserGroups((asList(g2.getCode(), g3.getCode()))));
recordServices.execute(t);
assertThat(userServices.safePhysicalDeleteAllUnusedGroups(zeCollection)).doesNotContain(g1, g4).contains(g2, g3);
assertThat(userServices.getGroupIdInCollection(g1.getCode(), zeCollection)).isNull();
assertThat(userServices.getGroupIdInCollection(g4.getCode(), zeCollection)).isNull();
}
@Test
public void tryingToPhysicallyRemoveGroup() throws RecordServicesException {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioESModule().withConstellioRMModule().withAllTestUsers().withRMTest(records));
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userServices = getModelLayerFactory().newUserServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
Group g1 = rm.newGroupWithId("G1");
g1.setTitle("Group 1");
g1.set(Group.CODE, "G1");
g1.set(Schemas.LOGICALLY_DELETED_STATUS, true);
Group g2 = rm.newGroupWithId("G2");
g2.setTitle("Group 2");
g2.set(Group.CODE, "G2");
g2.set(Schemas.LOGICALLY_DELETED_STATUS, true);
Transaction t = new Transaction();
t.addAll(asList(g1, g2));
t.add(records.getChuckNorris().setUserGroups(asList(g2.getCode())));
recordServices.execute(t);
try {
userServices.physicallyRemoveGroup(g1, zeCollection);
} catch (UserServicesRuntimeException.UserServicesRuntimeException_CannotSafeDeletePhysically e) {
fail();
}
try {
userServices.physicallyRemoveGroup(g2, zeCollection);
fail();
} catch (UserServicesRuntimeException.UserServicesRuntimeException_CannotSafeDeletePhysically e) {
}
}
@Test
public void TryingToSafePhysicalDeleteAllUnusedUsers() throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers());
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
Users users = new Users();
users.setUp(getModelLayerFactory().newUserServices());
User chuck = users.chuckNorrisIn(zeCollection);
Cart c = rm.getOrCreateUserCart(chuck);
Transaction t = new Transaction();
t.add(c);
recordServices.execute(t);
userServices = getModelLayerFactory().newUserServices();
assertThat(userServices.getUserInCollection("alice", zeCollection)).isNotNull();
userCredentialsManager.removeUserCredentialFromCollection(userServices.getUserCredential("alice"), zeCollection);
userCredentialsManager.removeUserCredentialFromCollection(userServices.getUserCredential(chuck.getUsername()), zeCollection);
userServices.safePhysicalDeleteAllUnusedUsers(zeCollection);
try {
userServices.getUserInCollection("alice", zeCollection);
fail();
} catch (UserServicesRuntimeException_UserIsNotInCollection e) {
//OK !
}
}
@Test
public void TryingToPhysicallyRemoveUser() throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers());
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userServices = getModelLayerFactory().newUserServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
Users users = new Users();
users.setUp(getModelLayerFactory().newUserServices());
User chuck = users.chuckNorrisIn(zeCollection);
User alice = users.aliceIn(zeCollection);
Cart c = rm.getOrCreateUserCart(chuck);
Transaction t = new Transaction();
t.add(c);
recordServices.execute(t);
userCredentialsManager.removeUserCredentialFromCollection(userServices.getUserCredential("alice"), zeCollection);
userCredentialsManager.removeUserCredentialFromCollection(userServices.getUserCredential(chuck.getUsername()), zeCollection);
try {
userServices.physicallyRemoveUser(chuck, zeCollection);
fail();
} catch (UserServicesRuntimeException.UserServicesRuntimeException_CannotSafeDeletePhysically e) {
System.out.println(e.getMessage());
//OK !
}
userServices.physicallyRemoveUser(alice, zeCollection);
try {
userServices.getUserInCollection(alice.getUsername(), zeCollection);
fail();
} catch (UserServicesRuntimeException_UserIsNotInCollection e) {
//OK !
}
}
@Test
public void TryingToRestoreDeletedGroup() throws Exception {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioESModule().withConstellioRMModule().withAllTestUsers().withRMTest(records));
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
userServices = getModelLayerFactory().newUserServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
Group heroes = records.getHeroes();
GlobalGroup heroesGlobalGroup = globalGroupsManager.getGlobalGroupWithCode(heroes.getCode());
userServices.removeGroupFromCollections(userCredentialsManager.getUserCredential("admin"), heroes.getCode(), asList(heroes.getCollection()));
globalGroupsManager.logicallyRemoveGroup(heroesGlobalGroup);
Transaction t = new Transaction();
t.update(((SolrGlobalGroup) heroesGlobalGroup).getWrappedRecord());
recordServices.execute(t);
assertThat(globalGroupsManager.getGlobalGroupWithCode(heroesGlobalGroup.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
userServices.restoreDeletedGroup(heroes.getCode(), zeCollection);
assertThat(globalGroupsManager.getGlobalGroupWithCode(heroes.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
}
@Test
public void TryingToSetAndGetNewMetadata() throws Exception {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioESModule().withConstellioRMModule().withAllTestUsers().withRMTest(records));
userServices = getModelLayerFactory().newUserServices();
Users users = new Users();
users.setUp(userServices);
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
recordServices = getModelLayerFactory().newRecordServices();
String phone = "450 444 1919";
UserCredential chuckCredential = users.chuckNorris();
chuckCredential.withPhone(phone);
userServices.addUpdateUserCredential(chuckCredential);
assertThat(userCredentialsManager.getUserCredential(chuckCredential.getUsername()).getPhone()).isEqualTo(phone);
String fax = "450 448 4448";
chuckCredential = users.chuckNorris();
chuckCredential.withFax(fax);
userServices.addUpdateUserCredential(chuckCredential);
assertThat(userCredentialsManager.getUserCredential(chuckCredential.getUsername()).getFax()).isEqualTo(fax);
String address = "647 addresse";
chuckCredential = users.chuckNorris();
chuckCredential.withAddress(address);
userServices.addUpdateUserCredential(chuckCredential);
assertThat(userCredentialsManager.getUserCredential(chuckCredential.getUsername()).getAddress()).isEqualTo(address);
String jobTitle = "Programmeur";
chuckCredential = users.chuckNorris();
chuckCredential.withJobTitle(jobTitle);
userServices.addUpdateUserCredential(chuckCredential);
assertThat(userCredentialsManager.getUserCredential(chuckCredential.getUsername()).getJobTitle()).isEqualTo(jobTitle);
}
// ----- Utils methods
private List<Record> getRecordsInGroupInCollection(Record groupRecord, String collection) {
LogicalSearchQuery query = new LogicalSearchQuery();
LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection)
.where(userServices.userGroupsMetadata(collection)).isEqualTo(groupRecord.getId());
query.setCondition(condition);
List<Record> recordsInGroupInCollection = searchServices.search(query);
return recordsInGroupInCollection;
}
private Record getRecordGroupInCollection(GlobalGroup legendsGroup, String collection) {
LogicalSearchCondition condition;
condition = LogicalSearchQueryOperators.fromAllSchemasIn(collection).where(userServices.groupCodeMetadata(collection))
.isEqualTo(legendsGroup.getCode());
Record recordGroupInCollection = searchServices.searchSingleResult(condition);
return recordGroupInCollection;
}
// ----- Setup methods
private void assertThatUserIsOnlyInCollections(UserCredential user, String... collections) {
List<String> expectedCollections = asList(collections);
for (String collection : allCollections) {
if (expectedCollections.contains(collection)) {
assertThat(userServices.getUserInCollection(user.getUsername(), collection).getUsername())
.isEqualTo(user.getUsername());
} else {
try {
userServices.getUserInCollection(user.getUsername(), collection).getUsername();
fail("User '" + user + "' should not be in collection '" + collection + "'");
} catch (UserServicesRuntimeException_UserIsNotInCollection e) {
// OK
}
}
}
assertThat(userServices.getUser(user.getUsername()).getCollections()).containsOnly(collections);
}
private void givenHeroesGroup() {
givenHeroesGroupWithAllUsersInCollections();
}
private void givenHeroesGroupWithAllUsersInCollections(String... collections) {
heroes = "heroes";
GlobalGroup globalGroup = userServices.createGlobalGroup(
heroes, heroes, asList(collections), null, GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(globalGroup);
}
private void givenLegendsGroup() {
givenLegendsGroupWithAllUsersInCollections();
}
private void givenLegendsGroupWithAllUsersInCollections(String... collections) {
legends = "legends";
GlobalGroup globalGroup = userServices.createGlobalGroup(
legends, legends, asList(collections), null, GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(globalGroup);
}
private void givenCollection1() {
collection1 = "collection1";
prepareSystemWithoutHyperTurbo(withCollection(collection1));
setupAfterCollectionCreation();
}
private void givenCollection1And2() {
collection1 = "collection1";
collection2 = "collection2";
prepareSystemWithoutHyperTurbo(withCollection(collection1), withCollection(collection2));
setupAfterCollectionCreation();
}
private void givenCollection1And2And3() {
collection1 = "collection1";
collection2 = "collection2";
prepareSystemWithoutHyperTurbo(withCollection(collection1), withCollection(collection2));
collection3 = "collection3";
givenCollection(collection3);
setupAfterCollectionCreation();
}
private void setupAfterCollectionCreation() {
allCollections = new ArrayList<>();
collectionsManager = getAppLayerFactory().getCollectionsManager();
userServices = getModelLayerFactory().newUserServices();
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
userCredentialsManager = getModelLayerFactory().getUserCredentialsManager();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
authenticationService = getModelLayerFactory().newAuthenticationService();
Key key = EncryptionKeyFactory.newApplicationKey("zePassword", "zeUltimateSalt");
ModelLayerFactoryUtils.setApplicationEncryptionKey(getModelLayerFactory(), key);
}
private List<String> groups(String... groups) {
return asList(groups);
}
private List<String> and(String... collections) {
return asList(collections);
}
private void givenUserAndPassword() {
user = userServices.createUserCredential(
chuckNorris, "Chuck", "Norris", "chuck.norris@doculibre.com", new ArrayList<String>(), new ArrayList<String>(),
UserCredentialStatus.ACTIVE, "domain", msExchDelegateListBL, null);
userServices.addUpdateUserCredential(user);
authenticationService.changePassword(user.getUsername(), "1qaz2wsx");
user = userServices.getUser(user.getUsername());
}
private void givenUserWith(List<String> groups, List<String> collections) {
user = userServices.createUserCredential(
chuckNorris, "Chuck", "Norris", "chuck.norris@doculibre.com", groups, collections, UserCredentialStatus.ACTIVE,
"domain", msExchDelegateListBL, null).withSystemAdminPermission();
userServices.addUpdateUserCredential(user);
}
private void givenAnotherUserWith(List<String> groups, List<String> collections) {
anotherUser = userServices.createUserCredential(
"gandalf.leblanc", "Gandalf", "Leblanc", "gandalf.leblanc@doculibre.com", groups, collections,
UserCredentialStatus.ACTIVE, "domain", msExchDelegateListBL, null);
userServices.addUpdateUserCredential(anotherUser);
}
private void givenAThirdUserWith(List<String> groups, List<String> collections) {
thirdUser = userServices.createUserCredential(
"edouard.lechat", "Edouard", "Lechat", "edouard.lechat@doculibre.com", groups, collections,
UserCredentialStatus.ACTIVE, "domain", msExchDelegateListBL, null);
userServices.addUpdateUserCredential(thirdUser);
}
}