package com.constellio.model.services.users;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.groups.Tuple.tuple;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import com.constellio.model.entities.security.global.GlobalGroup;
import com.constellio.model.entities.security.global.GlobalGroupStatus;
import com.constellio.sdk.tests.ConstellioTest;
public class GlobalGroupsManagerAcceptanceTest extends ConstellioTest {
GlobalGroupsManager manager;
GlobalGroup globalGroup1;
GlobalGroup globalGroup2;
GlobalGroup globalGroup3;
GlobalGroup globalGroup1_1;
GlobalGroup globalGroup1_2;
GlobalGroup globalGroup2_1;
GlobalGroup globalGroup1_1_1;
@Before
public void setUp()
throws Exception {
manager = getModelLayerFactory().getGlobalGroupsManager();
globalGroup1 = manager.create("group1", null, GlobalGroupStatus.ACTIVE, true);
globalGroup2 = manager.create("group2", null, GlobalGroupStatus.ACTIVE, true);
globalGroup3 = manager.create("group3", null, GlobalGroupStatus.ACTIVE, true);
globalGroup1_1 = manager.create("group1_1", "group1", GlobalGroupStatus.ACTIVE, true);
globalGroup1_2 = manager.create("group1_2", "group1", GlobalGroupStatus.ACTIVE, true);
globalGroup1_1_1 = manager.create("group1_1_1", "group1_1", GlobalGroupStatus.ACTIVE, true);
globalGroup2_1 = manager.create("group2_1", "group2", GlobalGroupStatus.ACTIVE, true);
}
@Test
public void whenAddGlobalGroupsThenTheyAreAddedInList()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup2);
manager.addUpdate(globalGroup1);
assertThat(manager.getActiveGroups()).extracting("code", "status").containsExactly(
tuple(globalGroup1.getCode(), globalGroup1.getStatus()), tuple(globalGroup2.getCode(), globalGroup2.getStatus()));
}
@Test
public void givenGlobalGroupInListWhenUpdateItThenItIsUpdated()
throws Exception {
manager.addUpdate(globalGroup1);
globalGroup1 = manager.create("group1", "group1Name", Arrays.asList("user1"), null, GlobalGroupStatus.ACTIVE, true);
manager.addUpdate(globalGroup1);
assertThat(manager.getActiveGroups()).hasSize(1);
assertThat(manager.getGlobalGroupWithCode("group1").getName()).isEqualTo("group1Name");
assertThat(manager.getGlobalGroupWithCode("group1").getUsersAutomaticallyAddedToCollections().get(0)).isEqualTo("user1");
}
@Test
public void givenGlobalGroupInListWhenRemoveItThenItIsLogicallyRemoved()
throws Exception {
manager.addUpdate(globalGroup1);
globalGroup1 = manager.create("group1", "group1Name", Arrays.asList("user1"), null, GlobalGroupStatus.ACTIVE, true);
manager.logicallyRemoveGroup(globalGroup1);
assertThat(manager.getActiveGroups()).isEmpty();
assertThat(manager.getAllGroups()).hasSize(1);
assertThat(manager.getGlobalGroupWithCode("group1").getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
}
@Test
public void givenMultipleGlobalGroupsWhenRemoveFromStartThenAllRemoved()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup2);
manager.addUpdate(globalGroup3);
assertThat(manager.getActiveGroups()).containsExactly(globalGroup1, globalGroup2, globalGroup3);
manager.logicallyRemoveGroup(globalGroup1);
assertThat(manager.getActiveGroups()).containsExactly(globalGroup2, globalGroup3);
manager.logicallyRemoveGroup(globalGroup2);
assertThat(manager.getActiveGroups()).containsExactly(globalGroup3);
manager.logicallyRemoveGroup(globalGroup3);
assertThat(manager.getActiveGroups()).isEmpty();
}
@Test
public void givenMultipleGlobalGroupsWhenRemoveFromEndThenAllRemoved()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup2);
manager.addUpdate(globalGroup3);
assertThat(manager.getActiveGroups()).containsOnlyOnce(globalGroup1, globalGroup2, globalGroup3);
manager.logicallyRemoveGroup(globalGroup3);
assertThat(manager.getActiveGroups()).containsOnlyOnce(globalGroup1, globalGroup2);
manager.logicallyRemoveGroup(globalGroup2);
assertThat(manager.getActiveGroups()).containsOnlyOnce(globalGroup1);
manager.logicallyRemoveGroup(globalGroup1);
assertThat(manager.getActiveGroups()).isEmpty();
}
@Test
public void whenAddGroupWithAccentsThenCorrectlySaved()
throws Exception {
GlobalGroup groupWithAccents = manager.create("<é=e>", "<à=a>", Arrays.asList("<ç=c>"), null,
GlobalGroupStatus.ACTIVE, true);
manager.addUpdate(groupWithAccents);
assertThat(manager.getGlobalGroupWithCode("<é=e>")).isEqualTo(groupWithAccents);
}
@Test
public void whenAddSubGroupThenOk()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup2);
manager.addUpdate(globalGroup1_1);
manager.addUpdate(globalGroup1_2);
manager.addUpdate(globalGroup1_1_1);
assertThat(manager.getGlobalGroupWithCode(globalGroup1_1.getCode()).getParent()).isEqualTo(globalGroup1.getCode());
assertThat(manager.getGlobalGroupWithCode(globalGroup1_2.getCode()).getParent()).isEqualTo(globalGroup1.getCode());
assertThat(manager.getGlobalGroupWithCode(globalGroup1_1_1.getCode()).getParent()).isEqualTo(globalGroup1_1.getCode());
}
@Test
public void whenAddSubGroupWithParentThatNotExistsThenException()
throws Exception {
globalGroup1 = manager.create("group1", "inexistentGroup", GlobalGroupStatus.ACTIVE, true);
try {
manager.addUpdate(globalGroup1);
} catch (Exception e) {
assertThat(e.getMessage()).isEqualTo("Global group parent not found!");
} finally {
assertThat(manager.getActiveGroups()).isEmpty();
}
}
@Test
public void givenExistentGroupWhenUpdateSubGroupWithParentIsItselfThenException()
throws Exception {
manager.addUpdate(globalGroup1);
globalGroup1 = manager.create("group1", "group1", GlobalGroupStatus.ACTIVE, true);
assertThat(manager.getActiveGroups()).hasSize(1);
try {
manager.addUpdate(globalGroup1);
} catch (Exception e) {
assertThat(e.getMessage()).isEqualTo("Invalid parent: group1");
} finally {
assertThat(manager.getActiveGroups()).hasSize(1);
assertThat(manager.getActiveGroups().get(0).getParent()).isNull();
}
}
@Test
public void whenAddSubGroupWithParentIsItsChildThenException()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup1_1);
globalGroup1 = manager.create("group1", "group1_1", GlobalGroupStatus.ACTIVE, true);
try {
manager.addUpdate(globalGroup1);
} catch (Exception e) {
assertThat(e.getMessage()).isEqualTo("Invalid parent: group1_1");
} finally {
assertThat(manager.getActiveGroups()).hasSize(2);
assertThat(manager.getGlobalGroupWithCode("group1").getParent()).isNull();
assertThat(manager.getGlobalGroupWithCode("group1_1").getParent()).isEqualTo("group1");
}
}
@Test
public void whenRemoveThenRemoveChildren()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup1_1);
manager.addUpdate(globalGroup1_2);
manager.addUpdate(globalGroup1_1_1);
manager.addUpdate(globalGroup2);
manager.addUpdate(globalGroup2_1);
manager.logicallyRemoveGroup(globalGroup1);
assertThat(manager.getActiveGroups()).containsOnly(globalGroup2, globalGroup2_1);
assertThat(manager.getAllGroups()).hasSize(6);
assertThat(manager.getGlobalGroupWithCode(globalGroup1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
assertThat(manager.getActiveGlobalGroupWithCode(globalGroup1.getCode())).isNull();
assertThat(manager.getGlobalGroupWithCode(globalGroup1_1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
assertThat(manager.getActiveGlobalGroupWithCode(globalGroup1_1.getCode())).isNull();
assertThat(manager.getGlobalGroupWithCode(globalGroup1_2.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
assertThat(manager.getActiveGlobalGroupWithCode(globalGroup1_2.getCode())).isNull();
assertThat(manager.getGlobalGroupWithCode(globalGroup1_1_1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.INACTIVE);
assertThat(manager.getActiveGlobalGroupWithCode(globalGroup1_1_1.getCode())).isNull();
assertThat(manager.getGlobalGroupWithCode(globalGroup2.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getActiveGlobalGroupWithCode(globalGroup2.getCode()).getCode()).isEqualTo(globalGroup2.getCode());
assertThat(manager.getGlobalGroupWithCode(globalGroup2_1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getActiveGlobalGroupWithCode(globalGroup2_1.getCode()).getCode()).isEqualTo(globalGroup2_1.getCode());
}
@Test
public void whenRemoveAndActiveThenActiveHierarchy()
throws Exception {
manager.addUpdate(globalGroup1);
manager.addUpdate(globalGroup1_1);
manager.addUpdate(globalGroup1_2);
manager.addUpdate(globalGroup1_1_1);
manager.addUpdate(globalGroup2);
manager.addUpdate(globalGroup2_1);
manager.logicallyRemoveGroup(globalGroup1);
manager.activateGlobalGroupHierarchy(globalGroup1);
assertThat(manager.getActiveGroups()).hasSize(6);
assertThat(manager.getAllGroups()).hasSize(6);
assertThat(manager.getGlobalGroupWithCode(globalGroup1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getGlobalGroupWithCode(globalGroup1_1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getGlobalGroupWithCode(globalGroup1_2.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getGlobalGroupWithCode(globalGroup1_1_1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getGlobalGroupWithCode(globalGroup2.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
assertThat(manager.getGlobalGroupWithCode(globalGroup2_1.getCode()).getStatus()).isEqualTo(GlobalGroupStatus.ACTIVE);
}
}