2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.models.acm.persistence.provider;
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.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertNotNull;
27 import static org.junit.jupiter.api.Assertions.assertThrows;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.ArgumentMatchers.anyIterable;
30 import static org.mockito.ArgumentMatchers.anyString;
31 import static org.mockito.Mockito.mock;
32 import static org.mockito.Mockito.verify;
33 import static org.mockito.Mockito.when;
35 import java.util.ArrayList;
36 import java.util.List;
37 import java.util.Optional;
38 import java.util.UUID;
39 import org.junit.jupiter.api.BeforeEach;
40 import org.junit.jupiter.api.Test;
41 import org.mockito.Mockito;
42 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
43 import org.onap.policy.clamp.models.acm.concepts.DeployState;
44 import org.onap.policy.clamp.models.acm.concepts.LockState;
45 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationComposition;
46 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionElement;
47 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
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.clamp.models.acm.persistence.repository.AutomationCompositionRollbackRepository;
51 import org.onap.policy.common.utils.coder.Coder;
52 import org.onap.policy.common.utils.coder.StandardCoder;
53 import org.onap.policy.common.utils.resources.ResourceUtils;
54 import org.onap.policy.models.base.PfModelRuntimeException;
55 import org.springframework.data.domain.PageImpl;
56 import org.springframework.data.domain.PageRequest;
57 import org.springframework.data.domain.Pageable;
59 class AutomationCompositionProviderTest {
61 private static final String AC_IS_NULL = "automationComposition is marked non-null but is null";
62 private static final String ACELEMENT_ID_IS_NULL = "elementId is marked non-null but is null";
64 private static final Coder CODER = new StandardCoder();
65 private static final String AUTOMATION_COMPOSITION_JSON =
66 "src/test/resources/providers/TestAutomationCompositions.json";
68 private AutomationCompositions inputAutomationCompositions;
69 private List<JpaAutomationComposition> inputAutomationCompositionsJpa;
70 private final String originalJson = ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON);
73 void beforeSetupDao() throws Exception {
74 inputAutomationCompositions = CODER.decode(originalJson, AutomationCompositions.class);
75 inputAutomationCompositionsJpa =
76 ProviderUtils.getJpaAndValidateList(inputAutomationCompositions.getAutomationCompositionList(),
77 JpaAutomationComposition::new, "automation compositions");
81 void testAutomationCompositionCreate() {
82 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
83 when(automationCompositionRepository.save(any(JpaAutomationComposition.class)))
84 .thenReturn(inputAutomationCompositionsJpa.get(0));
85 var inputAc = inputAutomationCompositions.getAutomationCompositionList().get(0);
87 var automationCompositionProvider = new AutomationCompositionProvider(
88 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
89 mock(AutomationCompositionRollbackRepository.class));
90 var createdAutomationComposition = automationCompositionProvider.createAutomationComposition(inputAc);
91 inputAc.setInstanceId(createdAutomationComposition.getInstanceId());
92 inputAc.setLastMsg(createdAutomationComposition.getLastMsg());
93 assertEquals(inputAc, createdAutomationComposition);
97 void testAutomationCompositionUpdate() {
98 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
99 var automationCompositionProvider = new AutomationCompositionProvider(
100 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
101 mock(AutomationCompositionRollbackRepository.class));
102 assertThatThrownBy(() -> automationCompositionProvider.updateAutomationComposition(null))
103 .hasMessageMatching(AC_IS_NULL);
105 when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0)))
106 .thenReturn(inputAutomationCompositionsJpa.get(0));
108 var createdAutomationComposition = automationCompositionProvider
109 .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0));
111 assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition);
115 void testGetAutomationCompositionsWithNull() {
116 var automationCompositionProvider = new AutomationCompositionProvider(
117 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
118 mock(AutomationCompositionRollbackRepository.class));
119 assertThatThrownBy(() -> automationCompositionProvider
120 .getAutomationCompositions(UUID.randomUUID(), null, null, null))
121 .hasMessage("pageable is marked non-null but is null");
123 assertThatThrownBy(() -> automationCompositionProvider
124 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
125 .hasMessage("compositionId is marked non-null but is null");
129 void testGetAutomationCompositions() {
130 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
131 var automationCompositionProvider = new AutomationCompositionProvider(
132 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
133 mock(AutomationCompositionRollbackRepository.class));
134 var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
135 when(automationCompositionRepository
136 .findAll(Mockito.any(), any(Pageable.class)))
137 .thenReturn(new PageImpl<>(inputAutomationCompositionsJpa));
138 var acList = automationCompositionProvider.getAutomationCompositions(UUID.randomUUID(),
139 automationComposition.getName(), automationComposition.getVersion(), Pageable.unpaged());
140 assertThat(acList).hasSize(2);
142 acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
143 null, Pageable.unpaged());
144 assertThat(acList).hasSize(2);
146 when(automationCompositionRepository
147 .findAll(Mockito.any(), Mockito.any(Pageable.class)))
148 .thenReturn(new PageImpl<>(inputAutomationCompositionsJpa));
149 acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
150 null, PageRequest.of(0, 10));
151 assertThat(acList).hasSize(2);
155 void testGetAutomationComposition() {
156 var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
157 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
158 var automationCompositionProvider = new AutomationCompositionProvider(
159 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
160 mock(AutomationCompositionRollbackRepository.class));
162 () -> automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
163 .hasMessageMatching("AutomationComposition not found");
165 when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
166 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
167 var ac = automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId());
168 assertEquals(automationComposition, ac);
172 void testFindAutomationComposition() {
173 var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
174 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
175 var automationCompositionProvider = new AutomationCompositionProvider(
176 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
177 mock(AutomationCompositionRollbackRepository.class));
178 var acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
179 assertThat(acOpt).isEmpty();
181 acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
182 assertThat(acOpt).isEmpty();
184 when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
185 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
186 acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
187 assertEquals(automationComposition, acOpt.get());
189 when(automationCompositionRepository.findOne(Mockito.any()))
190 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
191 acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
192 assertEquals(automationComposition, acOpt.get());
196 void testGetAcInstancesByCompositionId() {
197 var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
198 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
199 when(automationCompositionRepository.findByCompositionId(automationComposition.getCompositionId().toString()))
200 .thenReturn(inputAutomationCompositionsJpa);
201 var automationCompositionProvider = new AutomationCompositionProvider(
202 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
203 mock(AutomationCompositionRollbackRepository.class));
205 automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId());
206 assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
210 void testGetAcInstancesInTransition() {
211 inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
212 inputAutomationCompositions.getAutomationCompositionList().get(1).setLockState(LockState.LOCKING);
213 inputAutomationCompositionsJpa.get(0).setDeployState(DeployState.DEPLOYING);
214 inputAutomationCompositionsJpa.get(1).setLockState(LockState.LOCKING);
216 List<JpaAutomationComposition> res1 = new ArrayList<>();
217 res1.add(inputAutomationCompositionsJpa.get(0));
219 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
220 when(automationCompositionRepository.findByDeployStateIn(List.of(DeployState.DEPLOYING,
221 DeployState.UNDEPLOYING, DeployState.DELETING, DeployState.UPDATING, DeployState.MIGRATING,
222 DeployState.MIGRATION_REVERTING)))
224 when(automationCompositionRepository.findByLockStateIn(List.of(LockState.LOCKING, LockState.UNLOCKING)))
225 .thenReturn(List.of(inputAutomationCompositionsJpa.get(1)));
226 var automationCompositionProvider = new AutomationCompositionProvider(
227 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
228 mock(AutomationCompositionRollbackRepository.class));
229 var acList = automationCompositionProvider.getAcInstancesInTransition();
230 assertThat(acList).hasSize(2)
231 .contains(inputAutomationCompositions.getAutomationCompositionList().get(0).getInstanceId())
232 .contains(inputAutomationCompositions.getAutomationCompositionList().get(1).getInstanceId());
236 void testDeleteAutomationComposition() {
237 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
238 var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
239 var automationCompositionProvider = new AutomationCompositionProvider(
240 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
241 acRollbackRepository);
242 assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(UUID.randomUUID()))
243 .hasMessageMatching(".*.failed, automation composition does not exist");
245 assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(null))
246 .hasMessageMatching("instanceId is marked non-null but is null");
248 var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
249 when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
250 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
253 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
254 assertEquals(automationComposition, deletedAc);
256 when(acRollbackRepository.existsById(automationComposition.getInstanceId().toString())).thenReturn(true);
259 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
260 assertEquals(automationComposition, deletedAc);
261 verify(acRollbackRepository).deleteById(automationComposition.getInstanceId().toString());
265 void testDeleteElementById() {
266 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
267 var acElementRepository = mock(AutomationCompositionElementRepository.class);
268 var automationCompositionProvider = new AutomationCompositionProvider(
269 automationCompositionRepository, acElementRepository,
270 mock(AutomationCompositionRollbackRepository.class));
271 assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationCompositionElement(null))
272 .hasMessageMatching(ACELEMENT_ID_IS_NULL);
273 var elementId = UUID.randomUUID();
274 automationCompositionProvider.deleteAutomationCompositionElement(elementId);
275 verify(acElementRepository).deleteById(elementId.toString());
279 void testValidateElementIds() {
280 var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
282 var acElementRepository = mock(AutomationCompositionElementRepository.class);
283 var automationCompositionProvider = new AutomationCompositionProvider(
284 mock(AutomationCompositionRepository.class), acElementRepository,
285 mock(AutomationCompositionRollbackRepository.class));
286 var result = automationCompositionProvider.validateElementIds(ac);
287 assertThat(result.isValid()).isTrue();
289 var jpaElement = new JpaAutomationCompositionElement(ac.getElements().values().iterator().next());
290 when(acElementRepository.findAllById(anyIterable()))
291 .thenReturn(List.of(jpaElement));
293 ac.setInstanceId(null);
294 result = automationCompositionProvider.validateElementIds(ac);
295 assertThat(result.isValid()).isFalse();
297 ac.setInstanceId(UUID.randomUUID());
298 jpaElement.setInstanceId(UUID.randomUUID().toString());
299 result = automationCompositionProvider.validateElementIds(ac);
300 assertThat(result.isValid()).isFalse();
302 ac.setInstanceId(UUID.randomUUID());
303 jpaElement.setInstanceId(ac.getInstanceId().toString());
304 result = automationCompositionProvider.validateElementIds(ac);
305 assertThat(result.isValid()).isTrue();
309 void testCopyAcElements() {
310 var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
311 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
312 var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
313 var automationCompositionProvider = new AutomationCompositionProvider(
314 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
315 acRollbackRepository);
316 automationCompositionProvider.copyAcElementsBeforeUpdate(ac);
318 verify(acRollbackRepository).save(any(JpaAutomationCompositionRollback.class));
319 var instanceId = ac.getInstanceId();
320 assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
321 .getAutomationCompositionRollback(instanceId));
325 void testGetRollbackSuccess() {
326 var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
327 var rollback = new JpaAutomationCompositionRollback();
328 rollback.setInstanceId(ac.getInstanceId().toString());
329 rollback.setCompositionId(ac.getCompositionId().toString());
331 var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
332 when(acRollbackRepository.findById(anyString())).thenReturn(Optional.of(rollback));
334 var automationCompositionProvider = new AutomationCompositionProvider(
335 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
336 acRollbackRepository);
337 var rbFromDb = automationCompositionProvider.getAutomationCompositionRollback(ac.getInstanceId());
338 assertNotNull(rbFromDb);
342 void testGetRollbackEmpty() {
343 var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
344 var automationCompositionProvider = new AutomationCompositionProvider(
345 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
346 acRollbackRepository);
347 when(acRollbackRepository.findById(anyString())).thenReturn(Optional.empty());
348 var compositionId = UUID.randomUUID();
349 assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
350 .getAutomationCompositionRollback(compositionId));