cadf22f599ef98e8d3ee4ea565c3995d5ed89008
[sdc.git] /
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.merge.group;
22
23
24 import fj.data.Either;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.ArgumentCaptor;
29 import org.mockito.Captor;
30 import org.mockito.Mock;
31 import org.mockito.junit.MockitoJUnitRunner;
32 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
33 import org.openecomp.sdc.be.components.merge.property.DataDefinitionsValuesMergingBusinessLogic;
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.enums.CreatedFrom;
38 import org.openecomp.sdc.be.impl.ComponentsUtils;
39 import org.openecomp.sdc.be.model.GroupDefinition;
40 import org.openecomp.sdc.be.model.Resource;
41 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.GroupsOperation;
42
43 import java.util.List;
44 import java.util.stream.Stream;
45
46 import static org.assertj.core.api.Assertions.assertThat;
47 import static org.mockito.ArgumentMatchers.eq;
48 import static org.mockito.Mockito.*;
49
50 @RunWith(MockitoJUnitRunner.class)
51 public class GroupPropertiesMergeCommandTest {
52
53     private GroupPropertiesMergeCommand testInstance;
54     @Mock
55     private DataDefinitionsValuesMergingBusinessLogic mergeBusinessLogic;
56     @Mock
57     private GroupsOperation groupsOperation;
58     @Captor
59     private ArgumentCaptor<List<GroupDefinition>> updatedGroupsCaptor;
60
61     private GroupDefinition newGroup1, newGroup2, newGroup3;
62     private GroupDefinition prevGroup1, prevGroup2, prevGroup3;
63     private Resource prevResource, newResource;
64
65
66     @Before
67     public void setUp() throws Exception {
68         testInstance = new GroupPropertiesMergeCommand(groupsOperation, new ComponentsUtils(mock(AuditingManager.class)), mergeBusinessLogic);
69         newGroup1 = createVspGroupWithProperties("group1Id", "group1New", "prop1", "prop2");
70         newGroup2 = createUserGroupWithProperties("group2Id", "group2New", "prop3", "prop4");
71         newGroup3 = createVspGroupWithProperties("group3Id", "group3New");
72         prevGroup1 = createVspGroupWithProperties("group1Id", "group1Old", "prop1", "prop2");
73         prevGroup2 = createUserGroupWithProperties("group2Id", "group2Old", "prop3", "prop4");
74         prevGroup3 = createVspGroupWithProperties("group3Id", "group3Old");
75
76         prevResource = new ResourceBuilder()
77                 .addGroup(prevGroup1)
78                 .addGroup(prevGroup2)
79                 .addGroup(prevGroup3)
80                 .addInput("input1")
81                 .addInput("input2")
82                 .build();
83
84         newResource = new ResourceBuilder()
85                 .addGroup(newGroup1)
86                 .addGroup(newGroup2)
87                 .addGroup(newGroup3)
88                 .addInput("input1")
89                 .build();
90     }
91
92     @Test
93     public void whenNewComponentHasNoGroups_returnOk() {
94         ActionStatus mergeStatus = testInstance.mergeComponents(prevResource, new Resource());
95         assertThat(mergeStatus).isEqualTo(ActionStatus.OK);
96         verifyZeroInteractions(mergeBusinessLogic, groupsOperation);
97     }
98
99     @Test
100     public void whenOldComponentHasNoGroups_returnOk() {
101         ActionStatus mergeStatus = testInstance.mergeComponents(new Resource(), newResource);
102         assertThat(mergeStatus).isEqualTo(ActionStatus.OK);
103         verifyZeroInteractions(mergeBusinessLogic, groupsOperation);
104     }
105
106     @Test
107     public void whenOldOrNewGroupHasNoProperties_noNeedToMergeItsProperties() {
108         GroupDefinition oldGrpNoProps = createVspGroupWithProperties("grp1", "grp1");
109         GroupDefinition newGrpWithProps = createVspGroupWithProperties("grp1", "grp1", "prop1", "prop2");
110
111         GroupDefinition oldGrpWithProps = createVspGroupWithProperties("grp2", "grp2", "prop3");
112         GroupDefinition newGrpNoProps = createVspGroupWithProperties("grp2", "grp2");
113
114         Resource prevResource = createResourceWithGroups(oldGrpNoProps, oldGrpWithProps);
115         Resource newResource = createResourceWithGroups(newGrpWithProps, newGrpNoProps);
116         ActionStatus mergeStatus = testInstance.mergeComponents(prevResource, newResource);
117         assertThat(mergeStatus).isEqualTo(ActionStatus.OK);
118         verifyZeroInteractions(mergeBusinessLogic, groupsOperation);
119     }
120
121     @Test
122     public void whenNewGroupIsUserDefined_itWasAlreadyMergedInEarlierCommand_noNeedToMerge() {
123         GroupDefinition oldUserDefinedGrp = createUserGroupWithProperties("grp1", "grp1", "prop1");
124         GroupDefinition newUserDefinedGrp = createVspGroupWithProperties("grp1", "grp1", "prop1");
125         Resource prevResource = createResourceWithGroups(oldUserDefinedGrp);
126         Resource newResource = createResourceWithGroups(newUserDefinedGrp);
127         ActionStatus mergeStatus = testInstance.mergeComponents(prevResource, newResource);
128         assertThat(mergeStatus).isEqualTo(ActionStatus.OK);
129         verifyZeroInteractions(mergeBusinessLogic, groupsOperation);
130     }
131
132     @Test
133     public void whenNewGroupWasntExistInPrevVersion_noMergeRequired_matchByInvariantName() {
134         GroupDefinition oldGrp = createUserGroupWithProperties("grp1", "grp1", "prop1");
135         GroupDefinition newGrp = createVspGroupWithProperties("newGrp1", "grp1", "prop1");
136         Resource prevResource = createResourceWithGroups(oldGrp);
137         Resource newResource = createResourceWithGroups(newGrp);
138         ActionStatus mergeStatus = testInstance.mergeComponents(prevResource, newResource);
139         assertThat(mergeStatus).isEqualTo(ActionStatus.OK);
140         verifyZeroInteractions(mergeBusinessLogic, groupsOperation);
141     }
142
143     @Test
144     public void mergeGroupProperties_updateGroupsAfterMerge_mergeOnlyGroups() {
145         when(groupsOperation.updateGroups(eq(newResource), updatedGroupsCaptor.capture(), eq(false))).thenReturn(Either.left(null));
146         ActionStatus mergeStatus = testInstance.mergeComponents(prevResource, newResource);
147         assertThat(mergeStatus).isEqualTo(ActionStatus.OK);
148         verify(mergeBusinessLogic).mergeInstanceDataDefinitions(prevGroup1.getProperties(), prevResource.getInputs(), newGroup1.getProperties(), newResource.getInputs());
149         assertThat(updatedGroupsCaptor.getValue())
150                 .containsExactly(newGroup1);
151
152     }
153
154     private GroupDefinition createUserGroupWithProperties(String invariantName, String groupName, String ... propsNames) {
155         return createGroupWithProperties(invariantName, groupName, CreatedFrom.UI, propsNames);
156     }
157
158     private GroupDefinition createVspGroupWithProperties(String invariantName, String groupName, String ... propsNames) {
159         return createGroupWithProperties(invariantName, groupName, CreatedFrom.CSAR, propsNames);
160     }
161
162     private GroupDefinition createGroupWithProperties(String invariantName, String groupName, CreatedFrom createdFrom, String ... propsNames) {
163         GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create()
164                 .setUniqueId(invariantName)
165                 .setName(groupName)
166                 .setCreatedFrom(createdFrom)
167                 .setInvariantName(invariantName);
168         Stream.of(propsNames).forEach(groupDefinitionBuilder::addProperty);
169         return groupDefinitionBuilder.build();
170     }
171
172     private Resource createResourceWithGroups(GroupDefinition ... groups) {
173         ResourceBuilder resourceBuilder = new ResourceBuilder();
174         Stream.of(groups).forEach(resourceBuilder::addGroup);
175         return resourceBuilder.build();
176     }
177 }