Refactoring Consolidation Service
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / version / PolicyTargetsUpdateOperationTest.java
1 package org.openecomp.sdc.be.components.impl.version;
2
3 import static org.assertj.core.api.Assertions.assertThat;
4 import static org.mockito.ArgumentMatchers.anyList;
5 import static org.mockito.ArgumentMatchers.eq;
6 import static org.mockito.Mockito.verifyZeroInteractions;
7 import static org.mockito.Mockito.when;
8 import static org.openecomp.sdc.be.components.impl.utils.TestGenerationUtils.getComponentsUtils;
9
10 import java.util.List;
11 import java.util.stream.Stream;
12
13 import org.junit.Before;
14 import org.junit.Test;
15 import org.junit.runner.RunWith;
16 import org.mockito.ArgumentCaptor;
17 import org.mockito.Captor;
18 import org.mockito.Mock;
19 import org.mockito.junit.MockitoJUnitRunner;
20 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
21 import org.openecomp.sdc.be.components.utils.PolicyDefinitionBuilder;
22 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
23 import org.openecomp.sdc.be.dao.api.ActionStatus;
24 import org.openecomp.sdc.be.model.Component;
25 import org.openecomp.sdc.be.model.ComponentInstance;
26 import org.openecomp.sdc.be.model.PolicyDefinition;
27 import org.openecomp.sdc.be.model.Resource;
28 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
29 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
30
31 @RunWith(MockitoJUnitRunner.class)
32 public class PolicyTargetsUpdateOperationTest {
33
34     private static final String CONTAINER_ID = "containerId";
35
36     private PolicyTargetsUpdateOperation policyTargetsUpdateOperation;
37     @Mock
38     private ToscaOperationFacade toscaOperationFacade;
39
40     @Captor
41     private ArgumentCaptor<List<PolicyDefinition>> updatedPoliciesCaptor;
42     private PolicyDefinition policy1, policy2, policy3;
43     private Resource container;
44
45     @Before
46     public void setUp() throws Exception {
47         policy1 = createPolicyWithCmptInstAsTargets("policy1", "inst1", "inst2");
48         policy2 = createPolicyWithCmptInstAsTargets("policy2", "inst1", "inst2", "inst3");
49         policy3 = createPolicyWithCmptInstAsTargets("policy3", "inst1", "inst3");
50         container = new ResourceBuilder()
51                 .addPolicy(policy1)
52                 .addPolicy(policy2)
53                 .addPolicy(policy3)
54                 .setUniqueId(CONTAINER_ID)
55                 .build();
56         policyTargetsUpdateOperation = new PolicyTargetsUpdateOperation(toscaOperationFacade, getComponentsUtils());
57     }
58
59     @Test
60     public void whenNoPolicies_returnActionOk() {
61         Component container = new Resource();
62         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("prevVersion").build();
63         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("newVersion").build();
64         ActionStatus operationStatus = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
65         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
66         verifyZeroInteractions(toscaOperationFacade);
67     }
68
69     @Test
70     public void whenNoCmptInstancePolicies_returnOk() {
71         PolicyDefinition policy = PolicyDefinitionBuilder.create().addGroupTarget("someGroup").build();
72         Component container = new ResourceBuilder().addPolicy(policy).build();
73         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("prevVersion").build();
74         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("newVersion").build();
75         ActionStatus operationStatus = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
76         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
77         verifyZeroInteractions(toscaOperationFacade);
78     }
79
80     @Test
81     public void whenNoPoliciesWithPrevInstanceAsTarget_returnActionOk() {
82         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("prevVersion").build();
83         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("newVersion").build();
84         ActionStatus operationStatus = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
85         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
86         verifyZeroInteractions(toscaOperationFacade);
87     }
88
89     @Test
90     public void replacePrevCmptInstanceIdWithNewInstanceIdAndUpdatePolicies() {
91         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("inst2").build();
92         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("inst2New").build();
93         when(toscaOperationFacade.updatePoliciesOfComponent(eq(CONTAINER_ID), updatedPoliciesCaptor.capture())).thenReturn(StorageOperationStatus.OK);
94         ActionStatus updatePoliciesRes = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
95         assertThat(updatePoliciesRes).isEqualTo(ActionStatus.OK);
96         List<PolicyDefinition> updatedPolicies = updatedPoliciesCaptor.getValue();
97         verifyUpdatedPolicies(updatedPolicies, policy1, policy2);//policy3 does not have "inst2" as target, no update needed
98         verifyUpdatedPolicyTargets(policy1, "inst1", "inst2New");
99         verifyUpdatedPolicyTargets(policy2, "inst1", "inst2New", "inst3");
100     }
101
102     @Test
103     public void whenUpdateOfPoliciesFails_propagateTheFailure() {
104         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("inst2").build();
105         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("inst2New").build();
106         when(toscaOperationFacade.updatePoliciesOfComponent(eq(CONTAINER_ID), anyList())).thenReturn(StorageOperationStatus.GENERAL_ERROR);
107         ActionStatus updatePoliciesRes = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
108         assertThat(updatePoliciesRes).isEqualTo(ActionStatus.GENERAL_ERROR);
109     }
110
111     private void verifyUpdatedPolicyTargets(PolicyDefinition updatedPolicy, String ... expectedCmptInstanceTargetIds) {
112         assertThat(updatedPolicy.resolveComponentInstanceTargets())
113                 .containsExactlyInAnyOrder(expectedCmptInstanceTargetIds);
114     }
115
116     private void verifyUpdatedPolicies(List<PolicyDefinition> updatedPolicies, PolicyDefinition ... expectedUpdatedPolicies) {
117         assertThat(updatedPolicies)
118                 .usingElementComparatorOnFields("targets")
119                 .containsExactlyInAnyOrder(expectedUpdatedPolicies);
120     }
121
122     private PolicyDefinition createPolicyWithCmptInstAsTargets(String uniqueId, String ... instId) {
123         PolicyDefinitionBuilder policyDefinitionBuilder = PolicyDefinitionBuilder.create();
124         Stream.of(instId).forEach(policyDefinitionBuilder::addComponentInstanceTarget);
125         return policyDefinitionBuilder.setUniqueId(uniqueId).build();
126     }
127 }