package com.constellio.app.api.admin.services;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import com.constellio.app.client.entities.GlobalGroupResource;
import com.constellio.app.client.entities.UserResource;
import com.constellio.app.client.services.AdminServicesSession;
import com.constellio.app.client.services.UserServicesClient;
import com.constellio.model.entities.security.global.GlobalGroupStatus;
import com.constellio.model.entities.security.global.UserCredentialStatus;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.security.authentification.AuthenticationService;
import com.constellio.model.services.users.GlobalGroupsManager;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.setups.Users;
public class UserServicesAcceptTest extends ConstellioTest {
String alicePassword = "p1";
String bobPassword = "p2";
String aliceServiceKey;
String bobServiceKey;
Users users = new Users();
UserServices userServices;
AuthenticationService authService;
GlobalGroupsManager globalGroupsManager;
RecordServices recordServices;
UserServicesClient userServicesClient;
AdminServicesSession bobSession;
UserResource bobCredentials;
UserResource bobCredentialsRefreshed;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection(), withCollection("collection1"));
userServices = getModelLayerFactory().newUserServices();
authService = getModelLayerFactory().newAuthenticationService();
globalGroupsManager = getModelLayerFactory().getGlobalGroupsManager();
recordServices = getModelLayerFactory().newRecordServices();
users.setUp(userServices);
userServices.givenSystemAdminPermissionsToUser(users.alice());
userServices.givenSystemAdminPermissionsToUser(users.bob());
aliceServiceKey = userServices.giveNewServiceToken(users.alice());
bobServiceKey = userServices.giveNewServiceToken(users.bob());
authService.changePassword(users.alice().getUsername(), alicePassword);
authService.changePassword(users.bob().getUsername(), bobPassword);
bobSession = newRestClient(bobServiceKey, users.bob().getUsername(), bobPassword);
userServicesClient = bobSession.newUserServices();
bobCredentials = bobSession.schema();
}
//This test is runned by AllAdminServicesAcceptTest
public void givenBobSession()
throws Exception {
whenAddUpdateUserThenOk();
whenAddUserToCollectionThenHeIsAddedToCollection();
whenGenerateServiceKeyAndCreateNewSessionThenOldSessionIsInvalidAndNewSessionIsOk();
whenAddUpdateGlobalGroupsThenTheyAreAdded();
whenSetGlobalGroupUsersThenOk();
whenGetGlobalGroupUsersThenReturnUsernames();
whenGetGlobalGroupThenReturnIt();
givenUserInCollectionwhenRemoveUserFromItThenHeIsRemoved();
whenRemoveGroupThenItIsRemoved();
whenCreateCollectionGroupThenIsIsCreated();
whenGetCustomGroupsThenTheyAreReturned();
whenRemoveCollectionGroupThenIsIsRemoved();
whenRemoveUserFromGroupThenIsIsRemoved();
}
private void whenRemoveUserFromGroupThenIsIsRemoved() {
assertThat(bobCredentialsRefreshed.getGlobalGroups()).contains("newGroupCode");// newGroupCode
userServicesClient.removeUserFromGlobalGroup(bobCredentials.getUsername(), "newGroupCode");
refreshBobCredentials();
assertThat(bobCredentialsRefreshed.getGlobalGroups()).doesNotContain("newGroupCode");
}
private void whenRemoveCollectionGroupThenIsIsRemoved() {
List<String> groupsInZeCollection = userServicesClient.getCollectionGroups(zeCollection);
assertThat(groupsInZeCollection).containsOnly("newCustomGroupCode");
userServicesClient.removeCollectionGroup(zeCollection, "newCustomGroupCode");
groupsInZeCollection = userServicesClient.getCollectionGroups(zeCollection);
assertThat(groupsInZeCollection).isEmpty();
}
private void whenAddUpdateUserThenOk() {
bobCredentials.setEmail("bob@gmail.com");
bobCredentials.setFirstName("bob1");
bobCredentials.setLastName("Gratton1");
bobCredentials.setGlobalGroups(Arrays.asList("heroes"));
bobCredentials.setCollections(Arrays.asList("collection1"));
bobCredentials.setStatus(UserCredentialStatus.ACTIVE);
userServicesClient.addUpdateUserCredential(bobCredentials);
refreshBobCredentials();
assertThat(bobCredentialsRefreshed.getEmail()).isEqualTo(bobCredentials.getEmail());
assertThat(bobCredentialsRefreshed.getFirstName()).isEqualTo(bobCredentials.getFirstName());
assertThat(bobCredentialsRefreshed.getLastName()).isEqualTo(bobCredentials.getLastName());
assertThat(bobCredentialsRefreshed.getGlobalGroups()).isEqualTo(bobCredentials.getGlobalGroups());
assertThat(bobCredentialsRefreshed.getServiceKey()).isEqualTo(bobCredentials.getServiceKey()).isNotNull();
assertThat(bobCredentialsRefreshed.getCollections()).isEqualTo(bobCredentials.getCollections()).isNotNull();
}
private void whenAddUserToCollectionThenHeIsAddedToCollection() {
assertThat(bobCredentialsRefreshed.getCollections()).doesNotContain(zeCollection);
userServicesClient.addUserToCollection(bobCredentialsRefreshed.getUsername(), zeCollection);
refreshBobCredentials();
assertThat(bobCredentialsRefreshed.getCollections()).contains(zeCollection);
}
private void whenGenerateServiceKeyAndCreateNewSessionThenOldSessionIsInvalidAndNewSessionIsOk() {
String oldServiceKey = bobCredentials.getServiceKey();
String serviceKey = userServicesClient.generateServiceKeyForUser(bobCredentials.getUsername());
AdminServicesSession bobSession2 = newRestClient(serviceKey, users.bob().getUsername(), bobPassword);
userServicesClient = bobSession2.newUserServices();
bobCredentialsRefreshed = userServicesClient.getUser(users.bob().getUsername());
assertThat(oldServiceKey).isNotEqualTo(serviceKey);
assertThat(bobCredentialsRefreshed.getServiceKey()).isEqualTo(serviceKey);
try {
bobSession.schema();
fail("Session not killed");
} catch (Exception e) {
// Ok
}
}
private void whenAddUpdateGlobalGroupsThenTheyAreAdded() {
GlobalGroupResource globalGroupResource = new GlobalGroupResource();
globalGroupResource.setCode("newGroupCode");
globalGroupResource.setName("newGroupName");
globalGroupResource.setUsersAutomaticallyAddedToCollections(Arrays.asList(zeCollection));
globalGroupResource.setStatus(GlobalGroupStatus.ACTIVE);
userServicesClient.addUpdateGlobalGroup(globalGroupResource);
GlobalGroupResource retrievedGlobalGroupResource = userServicesClient.getGlobalGroup("newGroupCode");
assertThat(retrievedGlobalGroupResource.getCode()).isEqualTo("newGroupCode");
assertThat(retrievedGlobalGroupResource.getName()).isEqualTo("newGroupName");
assertThat(retrievedGlobalGroupResource.getUsersAutomaticallyAddedToCollections()).isEqualTo(Arrays.asList(zeCollection));
}
private void whenSetGlobalGroupUsersThenOk() {
assertThat(bobCredentials.getGlobalGroups()).doesNotContain("newGroupCode");
assertThat(bobCredentialsRefreshed.getGlobalGroups()).doesNotContain("newGroupCode");
userServicesClient.setGlobalGroupUsers("newGroupCode", Arrays.asList(bobCredentials.getUsername()));
refreshBobCredentials();
assertThat(bobCredentialsRefreshed.getGlobalGroups()).contains("newGroupCode");
}
private void whenGetGlobalGroupUsersThenReturnUsernames() {
List<String> globalGroupUserNames = userServicesClient.getGlobalGroupUsers("heroes");
assertThat(globalGroupUserNames).containsOnly(charlesFrancoisXavier, gandalf, dakota, bobGratton);
}
private void whenGetGlobalGroupThenReturnIt() {
GlobalGroupResource resource = userServicesClient.getGlobalGroup("heroes");
assertThat(resource.getCode()).isEqualTo(globalGroupsManager.getGlobalGroupWithCode("heroes").getCode());
assertThat(resource.getName()).isEqualTo(globalGroupsManager.getGlobalGroupWithCode("heroes").getName());
assertThat(resource.getUsersAutomaticallyAddedToCollections()).isEqualTo(
globalGroupsManager.getGlobalGroupWithCode("heroes").getUsersAutomaticallyAddedToCollections());
}
private void givenUserInCollectionwhenRemoveUserFromItThenHeIsRemoved() {
assertThat(bobCredentialsRefreshed.getCollections()).contains(zeCollection);
userServicesClient.removeUserFromCollection(users.bob().getUsername(), zeCollection);
refreshBobCredentials();
assertThat(bobCredentialsRefreshed.getCollections()).doesNotContain(zeCollection);
}
private void whenRemoveGroupThenItIsRemoved() {
userServicesClient.removeGlobalGroup("heroes");
try {
userServicesClient.getGlobalGroup("heroes");
fail("Group not deleted!");
} catch (Exception e) {
// Ok
}
}
private void whenCreateCollectionGroupThenIsIsCreated() {
userServicesClient.createCollectionGroup(zeCollection, "newCustomGroupCode", "newCustomGroupName");
assertThat(userServices.getCollectionGroups(zeCollection)).hasSize(1);
assertThat(userServices.getCollectionGroups(zeCollection).get(0).getCode()).isEqualTo("newCustomGroupCode");
}
private void whenGetCustomGroupsThenTheyAreReturned() {
List<String> groupsInZeCollection = userServicesClient.getCollectionGroups(zeCollection);
assertThat(groupsInZeCollection).containsOnly("newCustomGroupCode");
}
// ---------
private void refreshBobCredentials() {
bobCredentialsRefreshed = userServicesClient.getUser(users.bob().getUsername());
}
}