1 package org.openecomp.sdc.be.components.merge.group;
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.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;
24 import java.util.List;
26 import java.util.stream.Stream;
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;
36 @RunWith(MockitoJUnitRunner.class)
37 public class ComponentGroupMergeCommandTest {
39 private static final Resource DONT_CARE = new Resource();
40 private ComponentGroupMergeCommand testInstance;
42 private GroupsOperation groupsOperation;
45 private ArgumentCaptor<List<GroupDefinition>> groupsToAddCaptor;
48 public void setUp() throws Exception {
49 testInstance = new ComponentGroupMergeCommand(groupsOperation, new ComponentsUtils(Mockito.mock(AuditingManager.class)));
53 public void whenPrevComponentHasNoGroups_returnOk() {
54 ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), DONT_CARE);
55 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
57 Resource prevResource = new Resource();
58 prevResource.setGroups(emptyList());
60 actionStatus = testInstance.mergeComponents(prevResource, DONT_CARE);
61 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
62 verifyZeroInteractions(groupsOperation);
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);
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);
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);
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")
118 public void whenPrevUserDefinedGroupHasInstanceMembersThatNotExistInNewComponent_removeMembersFromGroup() {
119 GroupDefinition group1 = createUserDefinedGroup("group1", "inst1Id", "inst2Id", "inst3Id");
120 GroupDefinition group2 = createUserDefinedGroup("group2", "inst1Id");
122 ComponentInstance inst1 = createInstance("inst1", "inst1Id");
123 ComponentInstance inst2 = createInstance("inst2", "inst2Id");
124 ComponentInstance inst3 = createInstance("inst3", "inst3Id");
126 Resource prevResource = createResourceWithGroupsAndInstances(asList(group1, group2), asList(inst1, inst2, inst3));
127 Resource currResource = createResourceWithInstances(inst3);
129 when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
130 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
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);
142 public void groupsMembersShouldBeUpdatedAccordingToNewInstancesIds() {
143 String prevInstance1Id = "inst1Id";
144 String prevInstance2Id = "inst2Id";
146 String currInstance1Id = "newInst1Id";
147 String currInstance2Id = "newInst2Id";
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));
154 ComponentInstance currInst1 = createInstance("inst1", currInstance1Id);
155 ComponentInstance currInst2 = createInstance("inst2", currInstance2Id);
156 Resource currResource = createResourceWithInstances(currInst1, currInst2);
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));
167 private ComponentInstance createInstance(String name, String instId) {
168 return new ComponentInstanceBuilder()
174 private GroupDefinition createCsarGroup(String id) {
175 return createGroup(id, CreatedFrom.CSAR);
178 private GroupDefinition createUserDefinedGroup(String id, String ... members) {
179 return createGroup(id, CreatedFrom.UI, members);
182 private GroupDefinition createGroup(String id, CreatedFrom createdFrom, String ... members) {
183 GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create()
185 .setCreatedFrom(createdFrom)
186 .setName("name" + id)
187 .setInvariantName("invName" + id);
188 Stream.of(members).forEach(groupDefinitionBuilder::addMember);
189 return groupDefinitionBuilder.build();
192 private Resource createResourceWithGroups(GroupDefinition ... groups) {
193 return createResourceWithGroupsAndInstances(asList(groups), null);
196 private Resource createResourceWithInstances(ComponentInstance ... instances) {
197 return createResourceWithGroupsAndInstances(null, asList(instances));
200 private Resource createResourceWithGroupsAndInstances(List<GroupDefinition> groups, List<ComponentInstance> instances) {
201 ResourceBuilder resourceBuilder = new ResourceBuilder();
202 if (groups != null) {
203 groups.forEach(resourceBuilder::addGroup);
205 if (instances != null) {
206 instances.forEach(resourceBuilder::addComponentInstance);
208 return resourceBuilder.build();
211 private Map<String, String> cmptInstancesToGroups(ComponentInstance ... instances) {
212 return Stream.of(instances).collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));