re base code
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / merge / group / ComponentGroupMergeCommandTest.java
1 package org.openecomp.sdc.be.components.merge.group;
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.Mockito;
11 import org.mockito.junit.MockitoJUnitRunner;
12 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
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.enums.CreatedFrom;
18 import org.openecomp.sdc.be.impl.ComponentsUtils;
19 import org.openecomp.sdc.be.model.ComponentInstance;
20 import org.openecomp.sdc.be.model.GroupDefinition;
21 import org.openecomp.sdc.be.model.Resource;
22 import org.openecomp.sdc.be.model.jsontitan.operations.GroupsOperation;
23
24 import java.util.List;
25 import java.util.Map;
26 import java.util.stream.Stream;
27
28 import static java.util.Arrays.asList;
29 import static java.util.Collections.*;
30 import static java.util.stream.Collectors.toMap;
31 import static org.assertj.core.api.Assertions.assertThat;
32 import static org.mockito.ArgumentMatchers.eq;
33 import static org.mockito.Mockito.verifyZeroInteractions;
34 import static org.mockito.Mockito.when;
35
36 @RunWith(MockitoJUnitRunner.class)
37 public class ComponentGroupMergeCommandTest {
38
39     private static final Resource DONT_CARE = new Resource();
40     private ComponentGroupMergeCommand testInstance;
41     @Mock
42     private GroupsOperation groupsOperation;
43
44     @Captor
45     private ArgumentCaptor<List<GroupDefinition>> groupsToAddCaptor;
46
47     @Before
48     public void setUp() throws Exception {
49         testInstance = new ComponentGroupMergeCommand(groupsOperation, new ComponentsUtils(Mockito.mock(AuditingManager.class)));
50     }
51
52     @Test
53     public void whenPrevComponentHasNoGroups_returnOk() {
54         ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), DONT_CARE);
55         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
56
57         Resource prevResource = new Resource();
58         prevResource.setGroups(emptyList());
59
60         actionStatus = testInstance.mergeComponents(prevResource, DONT_CARE);
61         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
62         verifyZeroInteractions(groupsOperation);
63     }
64
65     @Test
66     public void whenAllPrevGroupsCreatedFromCsar_returnOk() {
67         GroupDefinition group1 = createCsarGroup("group1");
68         GroupDefinition group2 = createCsarGroup("group2");
69         Resource prevResource = createResourceWithGroups(group1, group2);
70         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, DONT_CARE);
71         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
72         verifyZeroInteractions(groupsOperation);
73     }
74
75     @Test
76     public void whenAllPrevGroupsAlreadyExistInNewComponent_returnOk() {
77         GroupDefinition group1 = createCsarGroup("group1");
78         GroupDefinition group2 = createUserDefinedGroup("group2");
79         GroupDefinition group3 = createUserDefinedGroup("group3");
80         Resource prevResource = createResourceWithGroups(group1, group2, group3);
81         Resource currResource = createResourceWithGroups(group1, group2, group3);
82         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
83         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
84         verifyZeroInteractions(groupsOperation);
85     }
86
87     @Test
88     public void addAllPrevUserDefinedGroupsToComponent() {
89         GroupDefinition group1 = createCsarGroup("group1");
90         GroupDefinition group2 = createUserDefinedGroup("group2");
91         GroupDefinition group3 = createUserDefinedGroup("group3");
92         Resource prevResource = createResourceWithGroups(group1, group2, group3);
93         Resource currResource = createResourceWithGroups(group1, group2);
94         when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
95         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
96         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
97         assertThat(groupsToAddCaptor.getValue())
98                 .containsExactlyInAnyOrder(group3);
99         assertThat(currResource.getGroups())
100                 .containsExactlyInAnyOrder(group1, group2, group3);
101     }
102
103     @Test
104     public void whenPrevUserDefinedGroupHasNoMembers_itShouldHaveNoMembersInNewComponent() {
105         GroupDefinition group1 = createUserDefinedGroup("group1");
106         Resource prevResource = createResourceWithGroups(group1);
107         Resource currResource = new Resource();
108         when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
109         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
110         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
111         List<GroupDefinition> groupsAdded = groupsToAddCaptor.getValue();
112         assertThat(groupsAdded)
113                 .extracting("members")
114                 .containsNull();
115     }
116
117     @Test
118     public void whenPrevUserDefinedGroupHasInstanceMembersThatNotExistInNewComponent_removeMembersFromGroup() {
119         GroupDefinition group1 = createUserDefinedGroup("group1", "inst1Id", "inst2Id", "inst3Id");
120         GroupDefinition group2 = createUserDefinedGroup("group2", "inst1Id");
121
122         ComponentInstance inst1 = createInstance("inst1", "inst1Id");
123         ComponentInstance inst2 = createInstance("inst2", "inst2Id");
124         ComponentInstance inst3 = createInstance("inst3", "inst3Id");
125
126         Resource prevResource = createResourceWithGroupsAndInstances(asList(group1, group2), asList(inst1, inst2, inst3));
127         Resource currResource = createResourceWithInstances(inst3);
128
129         when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
130         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
131
132         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
133         List<GroupDefinition> groupsAdded = groupsToAddCaptor.getValue();
134         Map<String, String> group1ExpectedMembers = cmptInstancesToGroups(inst3);
135         Map<String, String> group2ExpectedMembers = emptyMap();
136         assertThat(groupsAdded)
137                 .extracting("members")
138                 .containsExactlyInAnyOrder(group1ExpectedMembers, group2ExpectedMembers);
139     }
140
141     @Test
142     public void groupsMembersShouldBeUpdatedAccordingToNewInstancesIds() {
143         String prevInstance1Id = "inst1Id";
144         String prevInstance2Id = "inst2Id";
145
146         String currInstance1Id = "newInst1Id";
147         String currInstance2Id = "newInst2Id";
148
149         GroupDefinition group1 = createUserDefinedGroup("group1", prevInstance1Id, prevInstance2Id);
150         ComponentInstance prevInst1 = createInstance("inst1", prevInstance1Id);
151         ComponentInstance prevInst2 = createInstance("inst2", prevInstance2Id);
152         Resource prevResource = createResourceWithGroupsAndInstances(singletonList(group1), asList(prevInst1, prevInst2));
153
154         ComponentInstance currInst1 = createInstance("inst1", currInstance1Id);
155         ComponentInstance currInst2 = createInstance("inst2", currInstance2Id);
156         Resource currResource = createResourceWithInstances(currInst1, currInst2);
157
158         when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
159         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
160         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
161         List<GroupDefinition> groupsAdded = groupsToAddCaptor.getValue();
162         assertThat(groupsAdded)
163                 .extracting("members")
164                 .containsExactly(cmptInstancesToGroups(currInst1, currInst2));
165     }
166
167     private ComponentInstance createInstance(String name, String instId) {
168         return new ComponentInstanceBuilder()
169                     .setName(name)
170                     .setUniqueId(instId)
171                     .build();
172     }
173
174     private GroupDefinition createCsarGroup(String id) {
175         return createGroup(id, CreatedFrom.CSAR);
176     }
177
178     private GroupDefinition createUserDefinedGroup(String id, String ... members) {
179         return createGroup(id, CreatedFrom.UI, members);
180     }
181
182     private GroupDefinition createGroup(String id, CreatedFrom createdFrom, String ... members) {
183         GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create()
184                 .setUniqueId(id)
185                 .setCreatedFrom(createdFrom)
186                 .setName("name" + id)
187                 .setInvariantName("invName" + id);
188         Stream.of(members).forEach(groupDefinitionBuilder::addMember);
189         return groupDefinitionBuilder.build();
190     }
191
192     private Resource createResourceWithGroups(GroupDefinition ... groups) {
193         return createResourceWithGroupsAndInstances(asList(groups), null);
194     }
195
196     private Resource createResourceWithInstances(ComponentInstance ... instances) {
197         return createResourceWithGroupsAndInstances(null, asList(instances));
198     }
199
200     private Resource createResourceWithGroupsAndInstances(List<GroupDefinition> groups, List<ComponentInstance> instances) {
201         ResourceBuilder resourceBuilder = new ResourceBuilder();
202         if (groups != null) {
203             groups.forEach(resourceBuilder::addGroup);
204         }
205         if (instances != null) {
206             instances.forEach(resourceBuilder::addComponentInstance);
207         }
208         return resourceBuilder.build();
209     }
210
211     private Map<String, String> cmptInstancesToGroups(ComponentInstance ... instances) {
212         return Stream.of(instances).collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));
213     }
214
215 }