515dfaa8389b13d75b0042f260a5c2288c634633
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2021-2024 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.models.acm.persistence.provider;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
26 import static org.junit.jupiter.api.Assertions.assertEquals;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.ArgumentMatchers.anyIterable;
29 import static org.mockito.ArgumentMatchers.anyList;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.verify;
32 import static org.mockito.Mockito.when;
33
34 import java.util.ArrayList;
35 import java.util.List;
36 import java.util.Optional;
37 import java.util.UUID;
38 import org.junit.jupiter.api.BeforeEach;
39 import org.junit.jupiter.api.Test;
40 import org.mockito.Mockito;
41 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementInfo;
42 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionInfo;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
44 import org.onap.policy.clamp.models.acm.concepts.DeployState;
45 import org.onap.policy.clamp.models.acm.concepts.LockState;
46 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationComposition;
47 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionElement;
48 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionElementRepository;
49 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
50 import org.onap.policy.common.utils.coder.Coder;
51 import org.onap.policy.common.utils.coder.StandardCoder;
52 import org.onap.policy.common.utils.resources.ResourceUtils;
53 import org.springframework.data.domain.Example;
54
55 class AutomationCompositionProviderTest {
56
57     private static final String AC_IS_NULL = "automationComposition is marked non-null but is null";
58     private static final String ACELEMENT_IS_NULL = "element is marked non-null but is null";
59
60     private static final Coder CODER = new StandardCoder();
61     private static final String AUTOMATION_COMPOSITION_JSON =
62             "src/test/resources/providers/TestAutomationCompositions.json";
63
64     private AutomationCompositions inputAutomationCompositions;
65     private List<JpaAutomationComposition> inputAutomationCompositionsJpa;
66     private final String originalJson = ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON);
67
68     @BeforeEach
69     void beforeSetupDao() throws Exception {
70         inputAutomationCompositions = CODER.decode(originalJson, AutomationCompositions.class);
71         inputAutomationCompositionsJpa =
72                 ProviderUtils.getJpaAndValidateList(inputAutomationCompositions.getAutomationCompositionList(),
73                         JpaAutomationComposition::new, "automation compositions");
74     }
75
76     @Test
77     void testAutomationCompositionCreate() {
78         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
79         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
80                 mock(AutomationCompositionElementRepository.class));
81
82         when(automationCompositionRepository.save(any(JpaAutomationComposition.class)))
83                 .thenReturn(inputAutomationCompositionsJpa.get(0));
84         var inputAc = inputAutomationCompositions.getAutomationCompositionList().get(0);
85
86         var createdAutomationComposition = automationCompositionProvider.createAutomationComposition(inputAc);
87         inputAc.setInstanceId(createdAutomationComposition.getInstanceId());
88         inputAc.setLastMsg(createdAutomationComposition.getLastMsg());
89         assertEquals(inputAc, createdAutomationComposition);
90     }
91
92     @Test
93     void testAutomationCompositionUpdate() {
94         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
95         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
96                 mock(AutomationCompositionElementRepository.class));
97
98         assertThatThrownBy(() -> automationCompositionProvider.updateAutomationComposition(null))
99                 .hasMessageMatching(AC_IS_NULL);
100
101         when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0)))
102                 .thenReturn(inputAutomationCompositionsJpa.get(0));
103
104         var createdAutomationComposition = automationCompositionProvider
105                 .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0));
106
107         assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition);
108     }
109
110     @Test
111     void testGetAutomationCompositions() {
112         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
113         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
114                 mock(AutomationCompositionElementRepository.class));
115
116         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
117         var acList = automationCompositionProvider.getAutomationCompositions(UUID.randomUUID(),
118                 automationComposition.getName(), automationComposition.getVersion());
119         assertThat(acList).isEmpty();
120
121         when(automationCompositionRepository.findAll(Mockito.<Example<JpaAutomationComposition>>any()))
122                 .thenReturn(inputAutomationCompositionsJpa);
123         acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
124                 null);
125         assertThat(acList).hasSize(2);
126     }
127
128     @Test
129     void testGetAutomationComposition() {
130         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
131         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
132                 mock(AutomationCompositionElementRepository.class));
133
134         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
135         assertThatThrownBy(
136                 () -> automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
137                         .hasMessageMatching("AutomationComposition not found");
138
139         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
140                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
141         var ac = automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId());
142         assertEquals(automationComposition, ac);
143     }
144
145     @Test
146     void testFindAutomationComposition() {
147         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
148         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
149                 mock(AutomationCompositionElementRepository.class));
150
151         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
152         var acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
153         assertThat(acOpt).isEmpty();
154
155         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
156         assertThat(acOpt).isEmpty();
157
158         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
159                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
160         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
161         assertEquals(automationComposition, acOpt.get());
162
163         when(automationCompositionRepository.findOne(Mockito.<Example<JpaAutomationComposition>>any()))
164                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
165         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
166         assertEquals(automationComposition, acOpt.get());
167     }
168
169     @Test
170     void testGetAcInstancesByCompositionId() {
171         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
172         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
173                 mock(AutomationCompositionElementRepository.class));
174
175         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
176         when(automationCompositionRepository.findByCompositionId(automationComposition.getCompositionId().toString()))
177                 .thenReturn(inputAutomationCompositionsJpa);
178         var acList =
179                 automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId());
180         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
181     }
182
183     @Test
184     void testGetAcInstancesInTransition() {
185         inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
186         inputAutomationCompositions.getAutomationCompositionList().get(1).setLockState(LockState.LOCKING);
187         inputAutomationCompositionsJpa.get(0).setDeployState(DeployState.DEPLOYING);
188         inputAutomationCompositionsJpa.get(1).setLockState(LockState.LOCKING);
189
190         List<JpaAutomationComposition> res1 = new ArrayList<>();
191         res1.add(inputAutomationCompositionsJpa.get(0));
192         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
193         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
194             mock(AutomationCompositionElementRepository.class));
195         when(automationCompositionRepository.findByDeployStateIn(List.of(DeployState.DEPLOYING,
196             DeployState.UNDEPLOYING, DeployState.DELETING, DeployState.UPDATING, DeployState.MIGRATING)))
197             .thenReturn(res1);
198         when(automationCompositionRepository.findByLockStateIn(List.of(LockState.LOCKING, LockState.UNLOCKING)))
199             .thenReturn(List.of(inputAutomationCompositionsJpa.get(1)));
200         var acList = automationCompositionProvider.getAcInstancesInTransition();
201         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
202     }
203
204     @Test
205     void testDeleteAutomationComposition() {
206         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
207         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
208                 mock(AutomationCompositionElementRepository.class));
209
210         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(UUID.randomUUID()))
211                 .hasMessageMatching(".*.failed, automation composition does not exist");
212
213         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
214         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
215                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
216
217         var deletedAc =
218                 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
219         assertEquals(automationComposition, deletedAc);
220     }
221
222     @Test
223     void testAutomationCompositionElementUpdate() {
224         var acElementRepository = mock(AutomationCompositionElementRepository.class);
225         var automationCompositionProvider = new AutomationCompositionProvider(
226             mock(AutomationCompositionRepository.class), acElementRepository);
227
228         assertThatThrownBy(() -> automationCompositionProvider.updateAutomationCompositionElement(null))
229             .hasMessageMatching(ACELEMENT_IS_NULL);
230
231         var acElement = inputAutomationCompositions.getAutomationCompositionList().get(0).getElements().values()
232             .iterator().next();
233         var jpa = new JpaAutomationCompositionElement();
234         jpa.setElementId(acElement.getId().toString());
235         jpa.setInstanceId(UUID.randomUUID().toString());
236         jpa.fromAuthorative(acElement);
237         when(acElementRepository.getReferenceById(acElement.getId().toString())).thenReturn(jpa);
238
239         automationCompositionProvider.updateAutomationCompositionElement(acElement);
240         verify(acElementRepository).save(any());
241     }
242
243     @Test
244     void testValidateElementIds() {
245         var acElementRepository = mock(AutomationCompositionElementRepository.class);
246         var automationCompositionProvider = new AutomationCompositionProvider(
247             mock(AutomationCompositionRepository.class), acElementRepository);
248
249         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
250
251         var result = automationCompositionProvider.validateElementIds(ac);
252         assertThat(result.isValid()).isTrue();
253
254         var jpaElement = new JpaAutomationCompositionElement(ac.getElements().values().iterator().next());
255         when(acElementRepository.findAllById(anyIterable()))
256             .thenReturn(List.of(jpaElement));
257
258         ac.setInstanceId(null);
259         result = automationCompositionProvider.validateElementIds(ac);
260         assertThat(result.isValid()).isFalse();
261
262         ac.setInstanceId(UUID.randomUUID());
263         jpaElement.setInstanceId(UUID.randomUUID().toString());
264         result = automationCompositionProvider.validateElementIds(ac);
265         assertThat(result.isValid()).isFalse();
266
267         ac.setInstanceId(UUID.randomUUID());
268         jpaElement.setInstanceId(ac.getInstanceId().toString());
269         result = automationCompositionProvider.validateElementIds(ac);
270         assertThat(result.isValid()).isTrue();
271     }
272
273     @Test
274     void testUpgradeStates() {
275         var acElementRepository = mock(AutomationCompositionElementRepository.class);
276         var automationCompositionProvider = new AutomationCompositionProvider(
277             mock(AutomationCompositionRepository.class), acElementRepository);
278
279         assertDoesNotThrow(() -> automationCompositionProvider.upgradeStates(List.of()));
280         var acElement = inputAutomationCompositions.getAutomationCompositionList().get(0).getElements().values()
281             .iterator().next();
282
283         var acInfo = new AutomationCompositionInfo();
284         var acElementInfo = new AutomationCompositionElementInfo();
285         acInfo.setElements(List.of(acElementInfo));
286         acElementInfo.setAutomationCompositionElementId(acElement.getId());
287
288         when(acElementRepository.getReferenceById(acElement.getId().toString()))
289             .thenReturn(new JpaAutomationCompositionElement(acElement));
290
291         automationCompositionProvider.upgradeStates(List.of(acInfo));
292         verify(acElementRepository).saveAll(anyList());
293     }
294 }