re base code
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / merge / instance / ComponentInstanceCapabilitiesMergeBLTest.java
1 package org.openecomp.sdc.be.components.merge.instance;
2
3 import com.google.common.collect.ImmutableMap;
4 import fj.data.Either;
5 import org.junit.Before;
6 import org.junit.Test;
7 import org.junit.runner.RunWith;
8 import org.mockito.ArgumentCaptor;
9 import org.mockito.Captor;
10 import org.mockito.Mock;
11 import org.mockito.Mockito;
12 import org.mockito.junit.MockitoJUnitRunner;
13 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
14 import org.openecomp.sdc.be.components.merge.capability.SimpleCapabilityResolver;
15 import org.openecomp.sdc.be.components.merge.property.DataDefinitionsValuesMergingBusinessLogic;
16 import org.openecomp.sdc.be.components.utils.CapabilityDefinitionBuilder;
17 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
18 import org.openecomp.sdc.be.components.utils.ComponentInstancePropertyBuilder;
19 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
20 import org.openecomp.sdc.be.config.ConfigurationManager;
21 import org.openecomp.sdc.be.dao.api.ActionStatus;
22 import org.openecomp.sdc.be.impl.ComponentsUtils;
23 import org.openecomp.sdc.be.model.*;
24 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
25 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
26 import org.openecomp.sdc.common.api.ConfigurationSource;
27 import org.openecomp.sdc.common.impl.ExternalConfiguration;
28 import org.openecomp.sdc.common.impl.FSConfigurationSource;
29
30 import java.util.Arrays;
31 import java.util.Collections;
32 import java.util.List;
33
34 import static java.util.Collections.emptyMap;
35 import static java.util.Collections.singletonList;
36 import static org.assertj.core.api.Assertions.assertThat;
37 import static org.mockito.ArgumentMatchers.any;
38 import static org.mockito.ArgumentMatchers.anyList;
39 import static org.mockito.ArgumentMatchers.eq;
40 import static org.mockito.Mockito.*;
41
42 @RunWith(MockitoJUnitRunner.class)
43 public class ComponentInstanceCapabilitiesMergeBLTest {
44
45     private static final String INSTANCE1 = "inst1";
46     private static final String INSTANCE2 = "inst2";
47
48     private ComponentCapabilitiesPropertiesMergeBL testInstance;
49     private ComponentsUtils componentsUtils;
50     @Mock
51     private SimpleCapabilityResolver capabilityResolver;
52     @Mock
53     private ToscaOperationFacade toscaOperationFacade;
54     @Mock
55     private DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
56     @Captor
57     private ArgumentCaptor<List<ComponentInstanceProperty>> prevCapPropertiesCaptor;
58     @Captor
59     private ArgumentCaptor<List<ComponentInstanceProperty>> currCapPropertiesCaptor;
60     @Captor
61     private ArgumentCaptor<ComponentParametersView> getCurrResourceFilterCapture;
62
63     private CapabilityDefinition oldCap;
64     private CapabilityDefinition oldCap2;
65     private CapabilityDefinition newCap;
66     private CapabilityDefinition newCap2;
67
68     private ComponentParametersView getCapabilitiesPropsFilter;
69
70     protected static ConfigurationManager configurationManager = null;
71
72     @Before
73     public void setUp() throws Exception {
74         oldCap = new CapabilityDefinitionBuilder()
75                 .setOwnerId(INSTANCE1)
76                 .setOwnerName(INSTANCE1)
77                 .setId("cap1")
78                 .setType("type1")
79                 .setName("cap1")
80                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
81                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
82                 .build();
83
84         oldCap2 = new CapabilityDefinitionBuilder()
85                 .setOwnerId(INSTANCE2)
86                 .setOwnerName(INSTANCE2)
87                 .setId("cap2")
88                 .setType("type1")
89                 .setName("cap2")
90                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
91                 .build();
92
93         newCap = new CapabilityDefinitionBuilder()
94                 .setOwnerId(INSTANCE1)
95                 .setOwnerName(INSTANCE1)
96                 .setId("cap1")
97                 .setType("type1")
98                 .setName("cap1")
99                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
100                 .build();
101
102         newCap2 = new CapabilityDefinitionBuilder()
103                 .setOwnerId(INSTANCE2)
104                 .setOwnerName(INSTANCE2)
105                 .setId("cap2")
106                 .setType("type1")
107                 .setName("cap2")
108                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
109                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop3").build())
110                 .build();
111
112         getCapabilitiesPropsFilter = new ComponentParametersView();
113         getCapabilitiesPropsFilter.disableAll();
114         getCapabilitiesPropsFilter.setIgnoreComponentInstances(false);
115         getCapabilitiesPropsFilter.setIgnoreCapabilities(false);
116         getCapabilitiesPropsFilter.setIgnoreCapabiltyProperties(false);
117
118         ExternalConfiguration.setAppName("catalog-be");
119         String appConfigDir = "src/test/resources/config/catalog-be";
120         ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
121         ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
122         componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
123         testInstance = new ComponentCapabilitiesPropertiesMergeBL(dataDefinitionsValuesMergingBusinessLogic, toscaOperationFacade, componentsUtils, capabilityResolver);
124     }
125
126     @Test
127     public void mergeCapabilityProperties_singleCapability() {
128         ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
129         ComponentInstance newInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
130         Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
131         Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
132         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), getCurrResourceFilterCapture.capture())).thenReturn(Either.left(newResource));
133         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
134         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
135
136         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
137
138         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
139         verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
140         assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
141         assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
142         assertThat(getCurrResourceFilterCapture.getValue()).isEqualToComparingFieldByField(getCapabilitiesPropsFilter);
143     }
144
145     @Test
146     public void mergeCapabilityProperties_failToGetResourceWithPropsCapabilities() {
147         Resource currResource = new ResourceBuilder().setUniqueId("rid").build();
148         when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
149         ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), currResource);
150         assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
151     }
152
153     @Test
154     public void mergeCapabilityProperties_multipleCapabilitiesToMerge() {
155         ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
156         ComponentInstance prevInst2 = new ComponentInstanceBuilder().addCapability(oldCap2).setName(oldCap2.getOwnerName()).build();
157
158         ComponentInstance currInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
159         ComponentInstance currInst2 = new ComponentInstanceBuilder().addCapability(newCap2).setName(newCap2.getOwnerName()).build();
160
161         Resource currResource = new ResourceBuilder().addComponentInstance(currInst1).addComponentInstance(currInst2).build();
162         Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).addComponentInstance(prevInst2).build();
163         when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(currResource));
164         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, currInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
165         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst2, currInst2)).thenReturn(ImmutableMap.of(oldCap2, newCap2));
166         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(currResource)).thenReturn(StorageOperationStatus.OK);
167         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
168         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
169         verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
170     }
171
172     @Test
173     public void mergeCapabilityProperties_noNewCapabilitiesResolved() {
174         ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
175         ComponentInstance newInst1 = new ComponentInstanceBuilder().setName(oldCap.getOwnerName()).build();
176         Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
177         Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
178         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
179         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(emptyMap());
180         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
181         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
182         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
183         verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
184     }
185
186     @Test
187     public void mergeCapabilityProperties_noPrevCapabilitiesToMerge() {
188         Resource newResource = new Resource();
189         Resource prevResource = new Resource();
190         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
191         verifyNoMoreInteractions(toscaOperationFacade);
192         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
193         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
194         verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
195     }
196
197     @Test
198     public void mergeCapabilityProperties_failedToUpdateComponent() {
199         ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
200         Resource newResource = new Resource();
201         Resource prevResource = new ResourceBuilder().addComponentInstance(inst1).build();
202         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
203         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
204         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
205         assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
206     }
207
208     ////////////////////////////
209     @Test
210     public void mergeInstanceCapabilityProperties_singleCap() {
211         List<CapabilityDefinition> previousInstanceCapabilities = Collections.singletonList(oldCap);
212         ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).setId(newCap.getOwnerId()).build();
213         Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
214         Resource origInstanceNode = new Resource();
215         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, newCap.getOwnerId())).thenReturn(StorageOperationStatus.OK);
216         when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap));
217         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
218         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
219         verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
220
221         assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
222         assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
223     }
224
225     @Test
226     public void mergeInstanceCapabilityProperties() {
227         List<CapabilityDefinition> previousInstanceCapabilities = Arrays.asList(oldCap, oldCap2);
228         ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).addCapability(newCap2).setId(newCap.getOwnerId()).build();
229         Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
230         Resource origInstanceNode = new Resource();
231         when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap, oldCap2, newCap2));
232         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
233         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
234         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
235         verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
236     }
237
238     @Test
239     public void mergeInstanceCapabilityProperties_emptyCapabilitiesList() {
240         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(new Resource(), new Resource(),  "instanceId", Collections.emptyList());
241         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
242         verifyZeroInteractions(toscaOperationFacade, dataDefinitionsValuesMergingBusinessLogic, capabilityResolver);
243     }
244
245     @Test
246     public void mergeInstanceCapabilityProperties_failedToUpdateComponent() {
247         Resource container = new Resource();
248         Resource resource = new Resource();
249         List<CapabilityDefinition> capList = singletonList(oldCap);
250         when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, capList)).thenReturn(ImmutableMap.of(oldCap, newCap));
251         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
252         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, capList);
253         assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
254     }
255
256     @Test
257     public void mergeInstanceCapabilityProperties_noNewCapabilitiesFound() {
258         Resource container = new Resource();
259         Resource resource = new Resource();
260         List<CapabilityDefinition> prevCapabilities = singletonList(oldCap);
261         when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, prevCapabilities)).thenReturn(emptyMap());
262         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
263         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, prevCapabilities);
264         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
265         verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
266     }
267 }