1 package org.openecomp.sdc.be.components.impl.version;
3 import static java.util.Collections.emptyMap;
4 import static org.assertj.core.api.Assertions.assertThat;
5 import static org.mockito.ArgumentMatchers.eq;
6 import static org.mockito.Mockito.when;
8 import java.util.ArrayList;
10 import java.util.stream.Stream;
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 import org.mockito.ArgumentCaptor;
16 import org.mockito.Captor;
17 import org.mockito.InjectMocks;
18 import org.mockito.Mock;
19 import org.mockito.junit.MockitoJUnitRunner;
20 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
21 import org.openecomp.sdc.be.components.utils.GroupDefinitionBuilder;
22 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
23 import org.openecomp.sdc.be.dao.api.ActionStatus;
24 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
25 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
26 import org.openecomp.sdc.be.impl.ComponentsUtils;
27 import org.openecomp.sdc.be.model.ComponentInstance;
28 import org.openecomp.sdc.be.model.GroupDefinition;
29 import org.openecomp.sdc.be.model.Resource;
30 import org.openecomp.sdc.be.model.jsontitan.operations.GroupsOperation;
31 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
33 import fj.data.Either;
35 @RunWith(MockitoJUnitRunner.class)
36 public class GroupMembersUpdateOperationTest {
38 private static final String CONTAINER_ID = "containerId";
39 private static final String INSTANCE_ID_PRE_CHANGE = "inst2";
40 private static final String INSTANCE_ID_POST_CHANGE = "newInst2";
42 private GroupMembersUpdateOperation testInstance;
44 private GroupsOperation groupsOperation;
46 private ComponentsUtils componentsUtils;
49 private ArgumentCaptor<List<GroupDataDefinition>> updatedGroupsCaptor;
50 private GroupDefinition group1, group2, group3;
51 private Resource container;
52 private ComponentInstance prevInst2Version, currInst2Version;
53 private static final ComponentInstance DONT_CARE = new ComponentInstance();
56 public void setUp() throws Exception {
57 group1 = createGroupWithMembers("group1", "inst1", INSTANCE_ID_PRE_CHANGE);
58 group2 = createGroupWithMembers("group2", "inst1", "inst2", "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 whenNoGroupsOnContainer_returnOk() {
76 ActionStatus actionStatus = testInstance.onChangeVersion(new Resource(), DONT_CARE, DONT_CARE);
77 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
81 public void whenEmptyListOfGroups_returnOk() {
82 Resource resource = new Resource();
83 resource.setGroups(new ArrayList<>());
84 ActionStatus actionStatus = testInstance.onChangeVersion(resource, DONT_CARE, DONT_CARE);
85 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
89 public void 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);
100 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
104 public void whenPrevInstanceIsNotAMemberOfAnyGroup_returnOk() {
105 ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("nonMemberInst").build();
106 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE);
107 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
111 public void whenGroupHasPrevInstanceAsMember_replaceWithNewInstanceId_updateReplacedGroups() {
112 verifyAllGroupsHasPrevInstancesAsMembers();
113 when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture())).thenReturn(Either.left(null));
114 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
115 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
116 verifyGroupWithPrevInstanceMemberWereReplaced();
117 assertThat(updatedGroupsCaptor.getValue())
118 .containsExactlyInAnyOrder(group1, group2);
122 public void whenFailingToUpdateGroups_propagateError() {
123 when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture())).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
124 when(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, ComponentTypeEnum.RESOURCE)).thenCallRealMethod();
125 ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
126 assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
129 private void verifyGroupWithPrevInstanceMemberWereReplaced() {
130 assertGroupMembersIds(group1, "inst1", INSTANCE_ID_POST_CHANGE);
131 assertGroupMembersIds(group2, "inst1", INSTANCE_ID_POST_CHANGE, "inst3");
132 assertGroupMembersIds(group3, "inst1", "inst3");
135 private void verifyAllGroupsHasPrevInstancesAsMembers() {
136 assertGroupMembersIds(group1, "inst1", INSTANCE_ID_PRE_CHANGE);
137 assertGroupMembersIds(group2, "inst1", INSTANCE_ID_PRE_CHANGE, "inst3");
138 assertGroupMembersIds(group3, "inst1", "inst3");
141 private void assertGroupMembersIds(GroupDefinition group, String ... expectedMembersIds) {
142 assertThat(group.getMembers())
143 .containsValues(expectedMembersIds);
146 private GroupDefinition createGroupWithMembers(String groupId, String ... membersIds) {
147 GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create();
148 Stream.of(membersIds).forEach(memberId -> groupDefinitionBuilder.addMember(memberId + "name", memberId));
149 groupDefinitionBuilder.setUniqueId(groupId);
150 return groupDefinitionBuilder.build();