re base code
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / instance / GroupMembersUpdateOperationTest.java
1 package org.openecomp.sdc.be.components.impl.instance;
2
3 import fj.data.Either;
4 import org.junit.Before;
5 import org.junit.Test;
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.jsontitan.operations.GroupsOperation;
24 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
25
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.util.stream.Stream;
29
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;
36
37 @RunWith(MockitoJUnitRunner.class)
38 public class GroupMembersUpdateOperationTest {
39
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;
44     @Mock
45     private GroupsOperation groupsOperation;
46     @Captor
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";
53
54     @Before
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()
61                 .addGroup(group1)
62                 .addGroup(group2)
63                 .setUniqueId(CONTAINER_ID)
64                 .setComponentType(ComponentTypeEnum.RESOURCE)
65                 .build();
66         prevInst2Version = new ComponentInstanceBuilder()
67                 .setId(INSTANCE_ID_PRE_CHANGE)
68                 .build();
69         currInst2Version = new ComponentInstanceBuilder()
70                 .setId(INSTANCE_ID_POST_CHANGE)
71                 .build();
72     }
73
74     @Test
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);
78     }
79
80     @Test
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);
86     }
87
88     @Test
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()
95                 .addGroup(group1)
96                 .addGroup(group2)
97                 .build();
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);
101     }
102
103     @Test
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);
108     }
109
110     @Test
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();
118     }
119
120     @Test
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);
125     }
126
127     @Test
128     public void onDeleteInstance_whenNoGroupsOnContainer_returnOk() {
129         ActionStatus actionStatus = testInstance.onDelete(new Resource(), DONT_CARE_WHICH_ID);
130         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
131     }
132
133     @Test
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);
139     }
140
141     @Test
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()
148                 .addGroup(group1)
149                 .addGroup(group2)
150                 .build();
151         ActionStatus actionStatus = testInstance.onDelete(container, "inst1");
152         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
153     }
154
155     @Test
156     public void onDeleteInstance_whenDeletedInstanceIsNotAMemberOfAnyGroup_returnOk() {
157         ActionStatus actionStatus = testInstance.onDelete(container, "nonMemberInst");
158         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
159     }
160
161     @Test
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");
169     }
170
171     @Test
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);
176     }
177
178     private void assertUpdatedGroups(List<GroupDataDefinition> actual, GroupDataDefinition ... expected) {
179         assertThat(actual)
180                 .containsExactlyInAnyOrder(expected);
181     }
182
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");
187     }
188
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");
193     }
194
195     private void assertGroupMembersIds(GroupDefinition group, String ... expectedMembersIds) {
196         assertThat(group.getMembers())
197                 .containsValues(expectedMembersIds);
198     }
199
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();
205     }
206
207 }