1 package org.openecomp.sdc.be.components.impl.instance;
4 import org.junit.Before;
6 import org.junit.runner.RunWith;
7 import org.mockito.ArgumentCaptor;
8 import org.mockito.Captor;
9 import org.mockito.Mock;
10 import org.mockito.junit.MockitoJUnitRunner;
11 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
12 import org.openecomp.sdc.be.components.impl.group.GroupMembersUpdater;
13 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
14 import org.openecomp.sdc.be.components.utils.GroupDefinitionBuilder;
15 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
16 import org.openecomp.sdc.be.dao.api.ActionStatus;
17 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
18 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
19 import org.openecomp.sdc.be.impl.ComponentsUtils;
20 import org.openecomp.sdc.be.model.ComponentInstance;
21 import org.openecomp.sdc.be.model.GroupDefinition;
22 import org.openecomp.sdc.be.model.Resource;
23 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.GroupsOperation;
24 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.util.stream.Stream;
30 import static java.util.Collections.emptyMap;
31 import static org.assertj.core.api.Assertions.assertThat;
32 import static org.mockito.ArgumentMatchers.anyList;
33 import static org.mockito.ArgumentMatchers.eq;
34 import static org.mockito.Mockito.mock;
35 import static org.mockito.Mockito.when;
37 @RunWith(MockitoJUnitRunner.class)
38 public class GroupMembersUpdateOperationTest {
40 private static final String CONTAINER_ID = "containerId";
41 private static final String INSTANCE_ID_PRE_CHANGE = "inst2";
42 private static final String INSTANCE_ID_POST_CHANGE = "newInst2";
43 private GroupMembersUpdateOperation testInstance;
45 private GroupsOperation groupsOperation;
47 private ArgumentCaptor<List<GroupDataDefinition>> updatedGroupsCaptor;
48 private GroupDefinition group1, group2, group3;
49 private Resource container;
50 private ComponentInstance prevInst2Version, currInst2Version;
51 private static final ComponentInstance DONT_CARE_WHICH_INST = new ComponentInstance();
52 private static final String DONT_CARE_WHICH_ID = "someString";
55 public void setUp() throws Exception {
56 testInstance = new GroupMembersUpdateOperation(groupsOperation, new ComponentsUtils(mock(AuditingManager.class)), new GroupMembersUpdater());
57 group1 = createGroupWithMembers("group1", "inst1", INSTANCE_ID_PRE_CHANGE);
58 group2 = createGroupWithMembers("group2", "inst1", INSTANCE_ID_PRE_CHANGE, "inst3");
59 group3 = createGroupWithMembers("group3", "inst1", "inst3");
60 container = new ResourceBuilder()
63 .setUniqueId(CONTAINER_ID)
64 .setComponentType(ComponentTypeEnum.RESOURCE)
66 prevInst2Version = new ComponentInstanceBuilder()
67 .setId(INSTANCE_ID_PRE_CHANGE)
69 currInst2Version = new ComponentInstanceBuilder()
70 .setId(INSTANCE_ID_POST_CHANGE)
75 public void onChangeVersion_whenNoGroupsOnContainer_returnOk() {
76 ActionStatus actionStatus = testInstance.onChangeVersion(new Resource(), DONT_CARE_WHICH_INST, DONT_CARE_WHICH_INST);
77 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
81 public void onChangeVersion_whenEmptyListOfGroups_returnOk() {
82 Resource resource = new Resource();
83 resource.setGroups(new ArrayList<>());
84 ActionStatus actionStatus = testInstance.onChangeVersion(resource, DONT_CARE_WHICH_INST, DONT_CARE_WHICH_INST);
85 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
89 public void onChangeVersion_whenGroupsHasNoMembers_returnOk() {
90 GroupDefinition group1 = new GroupDefinition();
91 group1.setMembers(emptyMap());
92 GroupDefinition group2 = new GroupDefinition();
93 group2.setMembers(emptyMap());
94 Resource container = new ResourceBuilder()
98 ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("inst1").build();
99 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE_WHICH_INST);
100 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
104 public void onChangeVersion_whenPrevInstanceIsNotAMemberOfAnyGroup_returnOk() {
105 ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("nonMemberInst").build();
106 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE_WHICH_INST);
107 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
111 public void onChangeVersion_whenGroupHasPrevInstanceAsMember_replaceWithNewInstanceId_updateReplacedGroups() {
112 verifyAllGroupsHasPrevInstancesAsMembers();
113 when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.left(null));
114 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
115 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
116 assertUpdatedGroups(updatedGroupsCaptor.getValue(), group1, group2);
117 verifyGroupWithPrevInstanceMemberWereReplaced();
121 public void onChangeVersion_whenFailingToUpdateGroups_propagateError() {
122 when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
123 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
124 assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
128 public void onDeleteInstance_whenNoGroupsOnContainer_returnOk() {
129 ActionStatus actionStatus = testInstance.onDelete(new Resource(), DONT_CARE_WHICH_ID);
130 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
134 public void onDeleteInstance_whenEmptyListOfGroups_returnOk() {
135 Resource resource = new Resource();
136 resource.setGroups(new ArrayList<>());
137 ActionStatus actionStatus = testInstance.onDelete(resource, DONT_CARE_WHICH_ID);
138 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
142 public void onDeleteInstance_whenGroupsHasNoMembers_returnOk() {
143 GroupDefinition group1 = new GroupDefinition();
144 group1.setMembers(emptyMap());
145 GroupDefinition group2 = new GroupDefinition();
146 group2.setMembers(emptyMap());
147 Resource container = new ResourceBuilder()
151 ActionStatus actionStatus = testInstance.onDelete(container, "inst1");
152 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
156 public void onDeleteInstance_whenDeletedInstanceIsNotAMemberOfAnyGroup_returnOk() {
157 ActionStatus actionStatus = testInstance.onDelete(container, "nonMemberInst");
158 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
162 public void onDeleteInstance_removeInstanceIdFromGroupMember() {
163 when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.left(null));
164 ActionStatus actionStatus = testInstance.onDelete(container, INSTANCE_ID_PRE_CHANGE);
165 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
166 assertUpdatedGroups(updatedGroupsCaptor.getValue(), group1, group2);
167 assertGroupMembersIds(group1, "inst1");
168 assertGroupMembersIds(group2, "inst1", "inst3");
172 public void onDeleteInstance_whenGroupsUpdateFails_propagateTheFailure() {
173 when(groupsOperation.updateGroups(eq(container), anyList(), eq(false))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
174 ActionStatus actionStatus = testInstance.onDelete(container, INSTANCE_ID_PRE_CHANGE);
175 assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
178 private void assertUpdatedGroups(List<GroupDataDefinition> actual, GroupDataDefinition ... expected) {
180 .containsExactlyInAnyOrder(expected);
183 private void verifyGroupWithPrevInstanceMemberWereReplaced() {
184 assertGroupMembersIds(group1, "inst1", INSTANCE_ID_POST_CHANGE);
185 assertGroupMembersIds(group2, "inst1", INSTANCE_ID_POST_CHANGE, "inst3");
186 assertGroupMembersIds(group3, "inst1", "inst3");
189 private void verifyAllGroupsHasPrevInstancesAsMembers() {
190 assertGroupMembersIds(group1, "inst1", INSTANCE_ID_PRE_CHANGE);
191 assertGroupMembersIds(group2, "inst1", INSTANCE_ID_PRE_CHANGE, "inst3");
192 assertGroupMembersIds(group3, "inst1", "inst3");
195 private void assertGroupMembersIds(GroupDefinition group, String ... expectedMembersIds) {
196 assertThat(group.getMembers())
197 .containsValues(expectedMembersIds);
200 private GroupDefinition createGroupWithMembers(String groupId, String ... membersIds) {
201 GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create();
202 Stream.of(membersIds).forEach(groupDefinitionBuilder::addMember);
203 groupDefinitionBuilder.setUniqueId(groupId);
204 return groupDefinitionBuilder.build();