package com.constellio.app.services.migrations.scripts; import static com.constellio.model.entities.records.wrappers.Collection.SYSTEM_COLLECTION; import static com.constellio.model.entities.security.global.UserCredentialStatus.ACTIVE; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.groups.Tuple.tuple; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.util.List; import java.util.Map; import org.joda.time.LocalDateTime; import org.junit.Test; import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration; import com.constellio.model.entities.records.wrappers.Group; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.security.global.GlobalGroup; import com.constellio.model.entities.security.global.GlobalGroupStatus; import com.constellio.model.entities.security.global.SolrGlobalGroup; import com.constellio.model.entities.security.global.UserCredential; import com.constellio.model.entities.security.global.UserCredentialStatus; 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.users.UserServices; import com.constellio.model.services.users.UserServicesRuntimeException; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.SDKFoldersLocator; import com.constellio.sdk.tests.annotations.SlowTest; @SlowTest public class CoreMigrationTo_6_2AcceptanceTest extends ConstellioTest { @Test public void whenMigratingFromASystemWithUserAndGroupsThenMigrated() throws OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException { givenSystemAtVersion5_1_2withTokens(); UserServices userServices = getModelLayerFactory().newUserServices(); SolrGlobalGroup heroes = (SolrGlobalGroup) userServices.getGroup("heroes"); SolrGlobalGroup legends = (SolrGlobalGroup) userServices.getGroup("legends"); SolrGlobalGroup sidekicks = (SolrGlobalGroup) userServices.getGroup("sidekicks"); assertThat(heroes).isNotNull(); assertThat(legends).isNotNull(); assertThat(legends.getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE); assertThat(legends.getName()).isEqualTo("The legends"); assertThat(sidekicks.getParent()).isEqualTo(heroes.getCode()); assertThat(userServices.getUserCredential("admin")).isNotNull(); assertThat(userServices.getUserCredential("bob")).isNotNull(); assertThat(userServices.getUserCredential("charles")).isNotNull(); assertThat(userServices.getUserCredential("dakota")).isNotNull(); assertThat(userServices.getUserCredential("edouard")).isNotNull(); assertThat(userServices.getUserCredential("gandalf")).isNotNull(); UserCredential dakotaUser = userServices.getUserCredential("dakota"); assertThat(dakotaUser.getFirstName()).isEqualTo("Dakota"); assertThat(dakotaUser.getLastName()).isEqualTo("L'Indien"); assertThat(dakotaUser.getUsername()).isEqualTo("dakota"); assertThat(dakotaUser.getEmail()).isEqualTo("dakota@doculibre.com"); assertThat(dakotaUser.getCollections()).containsOnly("zeCollection"); assertThat(dakotaUser.getGlobalGroups()).containsOnly(heroes.getCode()); assertThat(dakotaUser.getStatus()).isEqualTo(ACTIVE); List<String> adminTokens = getModelLayerFactory().newUserServices().getUserCredential("admin").getTokenKeys(); assertThat(adminTokens).containsOnly("6f9b7e63-a6c1-4783-9143-1e69edf34b4c"); } private void givenSystemAtVersion5_1_2withTokens() { givenTransactionLogIsEnabled(); File statesFolder = new File(new SDKFoldersLocator().getInitialStatesFolder(), "olds"); File state = new File(statesFolder, "given_system_in_5.1.2.2_with_tasks,rm_modules__with_tokens.zip"); getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state); } @Test public void givenSaveSateThenUsersAndGroupsMigratedCorrectly() throws Exception { String collection2 = "collection2"; givenSystemInState("given_system_in_6.1_with_users.zip"); UserServices userServices = getModelLayerFactory().newUserServices(); Group group1 = userServices.getGroupInCollection("group1InBothCollections", zeCollection); Group group11 = userServices.getGroupInCollection("group11", zeCollection); Group group111 = userServices.getGroupInCollection("group111", zeCollection); Group group1111 = userServices.getGroupInCollection("group1111", zeCollection); Group group11111 = userServices.getGroupInCollection("group11111", zeCollection); //0. validate users groups relations User user1 = userServices.getUserInCollection("user1", zeCollection); assertThat(user1.getUserGroups()).containsOnly(group1.getId()); User user11 = userServices.getUserInCollection("user11", zeCollection); assertThat(user11.getUserGroups()).containsOnly(group11.getId()); User user111 = userServices.getUserInCollection("user111", zeCollection); assertThat(user111.getUserGroups()).containsOnly(group111.getId()); User user1111 = userServices.getUserInCollection("user1111", zeCollection); assertThat(user1111.getUserGroups()).containsOnly(group1111.getId()); User user11111 = userServices.getUserInCollection("user11111", zeCollection); assertThat(user11111.getUserGroups()).containsOnly(group11111.getId()); User user1InAllGroups = userServices.getUserInCollection("user1InAllGroups", zeCollection); assertThat(user1InAllGroups.getUserGroups().size()).isEqualTo(14); //1. validate collections assertThat(userServices.getUser("user1").getCollections()).containsOnly(collection2, zeCollection); UserCredential user2InCollection2 = userServices.getUser("user2InCollection2"); assertThat(user2InCollection2.getCollections()).containsOnly(collection2); UserCredential user3InZeCollection = userServices.getUser("user3InZeCollcetion"); assertThat(user3InZeCollection.getCollections()).containsOnly(zeCollection); UserCredential user4InNoCollection = userServices.getUser("user4InNoCollection"); assertThat(user4InNoCollection.getCollections()).isEmpty(); //2. validate statuses assertThat(user1.getStatus()).isEqualTo(ACTIVE); User user5Approval = userServices.getUserInCollection("user5Apporval", zeCollection); assertThat(user5Approval.getStatus()).isEqualTo(UserCredentialStatus.PENDING); User user6Suspended = userServices.getUserInCollection("user6Suspended", zeCollection); assertThat(user6Suspended.getStatus()).isEqualTo(UserCredentialStatus.SUSPENDED); User user7Deleted = userServices.getUserInCollection("user7Deleted", zeCollection); assertThat(user7Deleted.getStatus()).isEqualTo(UserCredentialStatus.DELETED); //3. validate profiles User userDossierRecent = userServices.getUserInCollection("userDossierRecent", zeCollection); assertThat(userDossierRecent.getDefaultTabInFolderDisplay()).isEqualTo("M"); assertThat(userDossierRecent.getStartTab()).isEqualTo("lastViewedFolders"); assertThat(userDossierRecent.getDefaultTaxonomy()).isNull(); User userPhone1 = userServices.getUserInCollection("userPhone1", zeCollection); assertThat(userPhone1.getPhone()).isEqualTo("4185230001"); User userSousDossiers = userServices.getUserInCollection("userSousDossiers", zeCollection); assertThat(userSousDossiers.getDefaultTabInFolderDisplay()).isEqualTo("SF"); assertThat(userSousDossiers.getStartTab()).isEqualTo("taxonomies"); assertThat(userSousDossiers.getDefaultTaxonomy()).isNull(); User userPartageRseau = userServices.getUserInCollection("userPartageReseau", zeCollection); assertThat(userPartageRseau.getDefaultTabInFolderDisplay()).isEqualTo("M"); assertThat(userPartageRseau.getStartTab()).isEqualTo("taxonomies"); assertThat(userPartageRseau.getDefaultTaxonomy()).isEqualTo("smbFolders"); //4. validate tokens UserCredential user11Credentials = userServices.getUser("user11"); Map<String, LocalDateTime> tokens = user11Credentials.getAccessTokens(); assertThat(tokens.size()).isEqualTo(1); assertThat(user2InCollection2.getAccessTokens()).isEmpty(); } @Test public void givenSystemWithStrangeUsersThenNotAllAreMigrated() throws Exception { givenSystemInState("given_system_in_6.1_with__module__with-strange-users.zip"); SearchServices searchServices = getModelLayerFactory().newSearchServices(); SchemasRecordsServices system = new SchemasRecordsServices(SYSTEM_COLLECTION, getModelLayerFactory()); UserServices userServices = getModelLayerFactory().newUserServices(); //Verify usercredential and global group List<GlobalGroup> globalGroups = system.wrapGlobalGroups(searchServices.search(new LogicalSearchQuery( from(system.globalGroupSchemaType()).returnAll()))); assertThat(globalGroups).extracting("code", "name", "status").contains( tuple("group1", "Ze group 1", GlobalGroupStatus.ACTIVE) ); List<UserCredential> userCredentials = system.wrapCredentials(searchServices.search(new LogicalSearchQuery( from(system.credentialSchemaType()).returnAll()))); assertThat(userCredentials).extracting("username", "firstName", "lastName", "email", "status").contains( tuple("admin", "System", "Admin", "admin@organization.com", ACTIVE), tuple("alice1", "Alice", "Wonderland", "alice@email.com", ACTIVE), tuple("alice2", "Alice", "Wonderland", "alice@email.com", ACTIVE), tuple("charles", "Charles", "Xavier", null, ACTIVE), tuple("chuck", null, null, null, ACTIVE), tuple("gandalf", "gandalf", "legris", "gandalf.legris@gmail.com", ACTIVE) ); //Verify user and groups is ze collection SchemasRecordsServices collection = new SchemasRecordsServices(zeCollection, getModelLayerFactory()); List<Group> groups = system.wrapGroups(searchServices.search(new LogicalSearchQuery( from(collection.groupSchemaType()).returnAll()))); assertThat(groups).extracting("code", "title").contains( tuple("group1", "Ze group 1") ); List<User> users = system.wrapUsers(searchServices.search(new LogicalSearchQuery( from(collection.userSchemaType()).returnAll()))); assertThat(users).extracting("username", "firstName", "lastName", "email", "status").contains( tuple("alice1", "Alice", "Wonderland", "alice@email.com", ACTIVE), tuple("alice2", "Alice", "Wonderland", "alice@email.com", ACTIVE), tuple("chuck", null, null, null, ACTIVE), tuple("gandalf", "gandalf", "legris", "gandalf.legris@gmail.com", ACTIVE) ).doesNotContain( tuple("gandalf", "gandalf", "leblanc", "gandalf.leblanc@gmail.com", ACTIVE) ); } @Test public void givenSystemIn6_2WithAProblemAndOldUserAndGroupFilesThenNotFixedAtStartup() throws Exception { givenSystemInState("given_system_in_6.2.2_with_tasks,rm_modules__ProblemAndOldUserGroupFiles.zip"); UserServices userServices = getModelLayerFactory().newUserServices(); assertThat(userServices.getUserCredential(aliceWonderland).getCollections()).containsOnly(zeCollection); try { userServices.getUserInCollection(aliceWonderland, "newCollection"); fail("Exception expected"); } catch (UserServicesRuntimeException.UserServicesRuntimeException_UserIsNotInCollection e) { //OK } } @Test public void givenSystemIn6_2WithAProblemAndRenamedOldUserAndGroupFilesThenNotFixedAtStartup() throws Exception { givenSystemInState("given_system_in_6.2.2_with_tasks,rm_modules__ProblemAndRenamedOldUserGroupFiles.zip"); UserServices userServices = getModelLayerFactory().newUserServices(); assertThat(userServices.getUserCredential(aliceWonderland).getCollections()).containsOnly(zeCollection, "newCollection"); assertThat(userServices.getUserInCollection(aliceWonderland, "newCollection")).isNotNull(); } private void givenSystemInState(String systemState) { givenTransactionLogIsEnabled(); File statesFolder = new SDKFoldersLocator().getInitialStatesFolder(); File state = new File(statesFolder, systemState); getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state).withFakeEncryptionServices(); } }