Added oparent to sdc main
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / instance / GroupMembersUpdateOperationTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.components.impl.instance;
22
23 import fj.data.Either;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.ArgumentCaptor;
28 import org.mockito.Captor;
29 import org.mockito.Mock;
30 import org.mockito.junit.MockitoJUnitRunner;
31 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
32 import org.openecomp.sdc.be.components.impl.group.GroupMembersUpdater;
33 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
34 import org.openecomp.sdc.be.components.utils.GroupDefinitionBuilder;
35 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
36 import org.openecomp.sdc.be.dao.api.ActionStatus;
37 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
38 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
39 import org.openecomp.sdc.be.impl.ComponentsUtils;
40 import org.openecomp.sdc.be.model.ComponentInstance;
41 import org.openecomp.sdc.be.model.GroupDefinition;
42 import org.openecomp.sdc.be.model.Resource;
43 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.GroupsOperation;
44 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
45
46 import java.util.ArrayList;
47 import java.util.List;
48 import java.util.stream.Stream;
49
50 import static java.util.Collections.emptyMap;
51 import static org.assertj.core.api.Assertions.assertThat;
52 import static org.mockito.ArgumentMatchers.anyList;
53 import static org.mockito.ArgumentMatchers.eq;
54 import static org.mockito.Mockito.mock;
55 import static org.mockito.Mockito.when;
56
57 @RunWith(MockitoJUnitRunner.class)
58 public class GroupMembersUpdateOperationTest {
59
60     private static final String CONTAINER_ID = "containerId";
61     private static final String INSTANCE_ID_PRE_CHANGE = "inst2";
62     private static final String INSTANCE_ID_POST_CHANGE = "newInst2";
63     private GroupMembersUpdateOperation testInstance;
64     @Mock
65     private GroupsOperation groupsOperation;
66     @Captor
67     private ArgumentCaptor<List<GroupDataDefinition>> updatedGroupsCaptor;
68     private GroupDefinition group1, group2, group3;
69     private Resource container;
70     private ComponentInstance prevInst2Version, currInst2Version;
71     private static final ComponentInstance DONT_CARE_WHICH_INST = new ComponentInstance();
72     private static final String DONT_CARE_WHICH_ID = "someString";
73
74     @Before
75     public void setUp() throws Exception {
76         testInstance = new GroupMembersUpdateOperation(groupsOperation, new ComponentsUtils(mock(AuditingManager.class)), new GroupMembersUpdater());
77         group1 = createGroupWithMembers("group1", "inst1", INSTANCE_ID_PRE_CHANGE);
78         group2 = createGroupWithMembers("group2", "inst1", INSTANCE_ID_PRE_CHANGE, "inst3");
79         group3 = createGroupWithMembers("group3", "inst1", "inst3");
80         container = new ResourceBuilder()
81                 .addGroup(group1)
82                 .addGroup(group2)
83                 .setUniqueId(CONTAINER_ID)
84                 .setComponentType(ComponentTypeEnum.RESOURCE)
85                 .build();
86         prevInst2Version = new ComponentInstanceBuilder()
87                 .setId(INSTANCE_ID_PRE_CHANGE)
88                 .build();
89         currInst2Version = new ComponentInstanceBuilder()
90                 .setId(INSTANCE_ID_POST_CHANGE)
91                 .build();
92     }
93
94     @Test
95     public void onChangeVersion_whenNoGroupsOnContainer_returnOk() {
96         ActionStatus actionStatus = testInstance.onChangeVersion(new Resource(), DONT_CARE_WHICH_INST, DONT_CARE_WHICH_INST);
97         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
98     }
99
100     @Test
101     public void onChangeVersion_whenEmptyListOfGroups_returnOk() {
102         Resource resource = new Resource();
103         resource.setGroups(new ArrayList<>());
104         ActionStatus actionStatus = testInstance.onChangeVersion(resource, DONT_CARE_WHICH_INST, DONT_CARE_WHICH_INST);
105         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
106     }
107
108     @Test
109     public void onChangeVersion_whenGroupsHasNoMembers_returnOk() {
110         GroupDefinition group1 = new GroupDefinition();
111         group1.setMembers(emptyMap());
112         GroupDefinition group2 = new GroupDefinition();
113         group2.setMembers(emptyMap());
114         Resource container = new ResourceBuilder()
115                 .addGroup(group1)
116                 .addGroup(group2)
117                 .build();
118         ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("inst1").build();
119         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE_WHICH_INST);
120         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
121     }
122
123     @Test
124     public void onChangeVersion_whenPrevInstanceIsNotAMemberOfAnyGroup_returnOk() {
125         ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("nonMemberInst").build();
126         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE_WHICH_INST);
127         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
128     }
129
130     @Test
131     public void onChangeVersion_whenGroupHasPrevInstanceAsMember_replaceWithNewInstanceId_updateReplacedGroups() {
132         verifyAllGroupsHasPrevInstancesAsMembers();
133         when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.left(null));
134         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
135         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
136         assertUpdatedGroups(updatedGroupsCaptor.getValue(), group1, group2);
137         verifyGroupWithPrevInstanceMemberWereReplaced();
138     }
139
140     @Test
141     public void onChangeVersion_whenFailingToUpdateGroups_propagateError() {
142         when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
143         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
144         assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
145     }
146
147     @Test
148     public void onDeleteInstance_whenNoGroupsOnContainer_returnOk() {
149         ActionStatus actionStatus = testInstance.onDelete(new Resource(), DONT_CARE_WHICH_ID);
150         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
151     }
152
153     @Test
154     public void onDeleteInstance_whenEmptyListOfGroups_returnOk() {
155         Resource resource = new Resource();
156         resource.setGroups(new ArrayList<>());
157         ActionStatus actionStatus = testInstance.onDelete(resource, DONT_CARE_WHICH_ID);
158         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
159     }
160
161     @Test
162     public void onDeleteInstance_whenGroupsHasNoMembers_returnOk() {
163         GroupDefinition group1 = new GroupDefinition();
164         group1.setMembers(emptyMap());
165         GroupDefinition group2 = new GroupDefinition();
166         group2.setMembers(emptyMap());
167         Resource container = new ResourceBuilder()
168                 .addGroup(group1)
169                 .addGroup(group2)
170                 .build();
171         ActionStatus actionStatus = testInstance.onDelete(container, "inst1");
172         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
173     }
174
175     @Test
176     public void onDeleteInstance_whenDeletedInstanceIsNotAMemberOfAnyGroup_returnOk() {
177         ActionStatus actionStatus = testInstance.onDelete(container, "nonMemberInst");
178         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
179     }
180
181     @Test
182     public void onDeleteInstance_removeInstanceIdFromGroupMember() {
183         when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.left(null));
184         ActionStatus actionStatus = testInstance.onDelete(container, INSTANCE_ID_PRE_CHANGE);
185         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
186         assertUpdatedGroups(updatedGroupsCaptor.getValue(), group1, group2);
187         assertGroupMembersIds(group1, "inst1");
188         assertGroupMembersIds(group2, "inst1", "inst3");
189     }
190
191     @Test
192     public void onDeleteInstance_whenGroupsUpdateFails_propagateTheFailure() {
193         when(groupsOperation.updateGroups(eq(container), anyList(), eq(false))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
194         ActionStatus actionStatus = testInstance.onDelete(container, INSTANCE_ID_PRE_CHANGE);
195         assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
196     }
197
198     private void assertUpdatedGroups(List<GroupDataDefinition> actual, GroupDataDefinition ... expected) {
199         assertThat(actual)
200                 .containsExactlyInAnyOrder(expected);
201     }
202
203     private void verifyGroupWithPrevInstanceMemberWereReplaced() {
204         assertGroupMembersIds(group1, "inst1", INSTANCE_ID_POST_CHANGE);
205         assertGroupMembersIds(group2, "inst1", INSTANCE_ID_POST_CHANGE, "inst3");
206         assertGroupMembersIds(group3, "inst1", "inst3");
207     }
208
209     private void verifyAllGroupsHasPrevInstancesAsMembers() {
210         assertGroupMembersIds(group1, "inst1", INSTANCE_ID_PRE_CHANGE);
211         assertGroupMembersIds(group2, "inst1", INSTANCE_ID_PRE_CHANGE, "inst3");
212         assertGroupMembersIds(group3, "inst1", "inst3");
213     }
214
215     private void assertGroupMembersIds(GroupDefinition group, String ... expectedMembersIds) {
216         assertThat(group.getMembers())
217                 .containsValues(expectedMembersIds);
218     }
219
220     private GroupDefinition createGroupWithMembers(String groupId, String ... membersIds) {
221         GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create();
222         Stream.of(membersIds).forEach(groupDefinitionBuilder::addMember);
223         groupDefinitionBuilder.setUniqueId(groupId);
224         return groupDefinitionBuilder.build();
225     }
226
227 }