c2368fe10350346925ab420017d5ca418e822106
[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     private static final String ACELEMENT_ID_IS_NULL = "elementId is marked non-null but is null";
60
61     private static final Coder CODER = new StandardCoder();
62     private static final String AUTOMATION_COMPOSITION_JSON =
63             "src/test/resources/providers/TestAutomationCompositions.json";
64
65     private AutomationCompositions inputAutomationCompositions;
66     private List<JpaAutomationComposition> inputAutomationCompositionsJpa;
67     private final String originalJson = ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON);
68
69     @BeforeEach
70     void beforeSetupDao() throws Exception {
71         inputAutomationCompositions = CODER.decode(originalJson, AutomationCompositions.class);
72         inputAutomationCompositionsJpa =
73                 ProviderUtils.getJpaAndValidateList(inputAutomationCompositions.getAutomationCompositionList(),
74                         JpaAutomationComposition::new, "automation compositions");
75     }
76
77     @Test
78     void testAutomationCompositionCreate() {
79         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
80         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
81                 mock(AutomationCompositionElementRepository.class));
82
83         when(automationCompositionRepository.save(any(JpaAutomationComposition.class)))
84                 .thenReturn(inputAutomationCompositionsJpa.get(0));
85         var inputAc = inputAutomationCompositions.getAutomationCompositionList().get(0);
86
87         var createdAutomationComposition = automationCompositionProvider.createAutomationComposition(inputAc);
88         inputAc.setInstanceId(createdAutomationComposition.getInstanceId());
89         inputAc.setLastMsg(createdAutomationComposition.getLastMsg());
90         assertEquals(inputAc, createdAutomationComposition);
91     }
92
93     @Test
94     void testAutomationCompositionUpdate() {
95         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
96         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
97                 mock(AutomationCompositionElementRepository.class));
98
99         assertThatThrownBy(() -> automationCompositionProvider.updateAutomationComposition(null))
100                 .hasMessageMatching(AC_IS_NULL);
101
102         when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0)))
103                 .thenReturn(inputAutomationCompositionsJpa.get(0));
104
105         var createdAutomationComposition = automationCompositionProvider
106                 .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0));
107
108         assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition);
109     }
110
111     @Test
112     void testGetAutomationCompositions() {
113         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
114         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
115                 mock(AutomationCompositionElementRepository.class));
116
117         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
118         var acList = automationCompositionProvider.getAutomationCompositions(UUID.randomUUID(),
119                 automationComposition.getName(), automationComposition.getVersion());
120         assertThat(acList).isEmpty();
121
122         when(automationCompositionRepository.findAll(Mockito.<Example<JpaAutomationComposition>>any()))
123                 .thenReturn(inputAutomationCompositionsJpa);
124         acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
125                 null);
126         assertThat(acList).hasSize(2);
127     }
128
129     @Test
130     void testGetAutomationComposition() {
131         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
132         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
133                 mock(AutomationCompositionElementRepository.class));
134
135         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
136         assertThatThrownBy(
137                 () -> automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
138                         .hasMessageMatching("AutomationComposition not found");
139
140         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
141                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
142         var ac = automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId());
143         assertEquals(automationComposition, ac);
144     }
145
146     @Test
147     void testFindAutomationComposition() {
148         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
149         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
150                 mock(AutomationCompositionElementRepository.class));
151
152         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
153         var acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
154         assertThat(acOpt).isEmpty();
155
156         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
157         assertThat(acOpt).isEmpty();
158
159         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
160                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
161         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
162         assertEquals(automationComposition, acOpt.get());
163
164         when(automationCompositionRepository.findOne(Mockito.<Example<JpaAutomationComposition>>any()))
165                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
166         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
167         assertEquals(automationComposition, acOpt.get());
168     }
169
170     @Test
171     void testGetAcInstancesByCompositionId() {
172         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
173         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
174                 mock(AutomationCompositionElementRepository.class));
175
176         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
177         when(automationCompositionRepository.findByCompositionId(automationComposition.getCompositionId().toString()))
178                 .thenReturn(inputAutomationCompositionsJpa);
179         var acList =
180                 automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId());
181         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
182     }
183
184     @Test
185     void testGetAcInstancesInTransition() {
186         inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
187         inputAutomationCompositions.getAutomationCompositionList().get(1).setLockState(LockState.LOCKING);
188         inputAutomationCompositionsJpa.get(0).setDeployState(DeployState.DEPLOYING);
189         inputAutomationCompositionsJpa.get(1).setLockState(LockState.LOCKING);
190
191         List<JpaAutomationComposition> res1 = new ArrayList<>();
192         res1.add(inputAutomationCompositionsJpa.get(0));
193         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
194         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
195             mock(AutomationCompositionElementRepository.class));
196         when(automationCompositionRepository.findByDeployStateIn(List.of(DeployState.DEPLOYING,
197             DeployState.UNDEPLOYING, DeployState.DELETING, DeployState.UPDATING, DeployState.MIGRATING)))
198             .thenReturn(res1);
199         when(automationCompositionRepository.findByLockStateIn(List.of(LockState.LOCKING, LockState.UNLOCKING)))
200             .thenReturn(List.of(inputAutomationCompositionsJpa.get(1)));
201         var acList = automationCompositionProvider.getAcInstancesInTransition();
202         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
203     }
204
205     @Test
206     void testDeleteAutomationComposition() {
207         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
208         var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository,
209                 mock(AutomationCompositionElementRepository.class));
210
211         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(UUID.randomUUID()))
212                 .hasMessageMatching(".*.failed, automation composition does not exist");
213
214         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
215         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
216                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
217
218         var deletedAc =
219                 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
220         assertEquals(automationComposition, deletedAc);
221     }
222
223     @Test
224     void testAutomationCompositionElementUpdate() {
225         var acElementRepository = mock(AutomationCompositionElementRepository.class);
226         var automationCompositionProvider = new AutomationCompositionProvider(
227             mock(AutomationCompositionRepository.class), acElementRepository);
228
229         assertThatThrownBy(() -> automationCompositionProvider.updateAutomationCompositionElement(null))
230             .hasMessageMatching(ACELEMENT_IS_NULL);
231
232         var acElement = inputAutomationCompositions.getAutomationCompositionList().get(0).getElements().values()
233             .iterator().next();
234         var jpa = new JpaAutomationCompositionElement();
235         jpa.setElementId(acElement.getId().toString());
236         jpa.setInstanceId(UUID.randomUUID().toString());
237         jpa.fromAuthorative(acElement);
238         when(acElementRepository.getReferenceById(acElement.getId().toString())).thenReturn(jpa);
239
240         automationCompositionProvider.updateAutomationCompositionElement(acElement);
241         verify(acElementRepository).save(any());
242     }
243
244     @Test
245     void testDeleteElementById() {
246         var acElementRepository = mock(AutomationCompositionElementRepository.class);
247         var automationCompositionProvider = new AutomationCompositionProvider(
248                 mock(AutomationCompositionRepository.class), acElementRepository);
249         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationCompositionElement(null))
250                 .hasMessageMatching(ACELEMENT_ID_IS_NULL);
251         var elementId = UUID.randomUUID();
252         automationCompositionProvider.deleteAutomationCompositionElement(elementId);
253         verify(acElementRepository).deleteById(elementId.toString());
254     }
255
256     @Test
257     void testValidateElementIds() {
258         var acElementRepository = mock(AutomationCompositionElementRepository.class);
259         var automationCompositionProvider = new AutomationCompositionProvider(
260             mock(AutomationCompositionRepository.class), acElementRepository);
261
262         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
263
264         var result = automationCompositionProvider.validateElementIds(ac);
265         assertThat(result.isValid()).isTrue();
266
267         var jpaElement = new JpaAutomationCompositionElement(ac.getElements().values().iterator().next());
268         when(acElementRepository.findAllById(anyIterable()))
269             .thenReturn(List.of(jpaElement));
270
271         ac.setInstanceId(null);
272         result = automationCompositionProvider.validateElementIds(ac);
273         assertThat(result.isValid()).isFalse();
274
275         ac.setInstanceId(UUID.randomUUID());
276         jpaElement.setInstanceId(UUID.randomUUID().toString());
277         result = automationCompositionProvider.validateElementIds(ac);
278         assertThat(result.isValid()).isFalse();
279
280         ac.setInstanceId(UUID.randomUUID());
281         jpaElement.setInstanceId(ac.getInstanceId().toString());
282         result = automationCompositionProvider.validateElementIds(ac);
283         assertThat(result.isValid()).isTrue();
284     }
285
286     @Test
287     void testUpgradeStates() {
288         var acElementRepository = mock(AutomationCompositionElementRepository.class);
289         var automationCompositionProvider = new AutomationCompositionProvider(
290             mock(AutomationCompositionRepository.class), acElementRepository);
291
292         assertDoesNotThrow(() -> automationCompositionProvider.upgradeStates(List.of()));
293         var acElement = inputAutomationCompositions.getAutomationCompositionList().get(0).getElements().values()
294             .iterator().next();
295
296         var acInfo = new AutomationCompositionInfo();
297         var acElementInfo = new AutomationCompositionElementInfo();
298         acInfo.setElements(List.of(acElementInfo));
299         acElementInfo.setAutomationCompositionElementId(acElement.getId());
300
301         when(acElementRepository.getReferenceById(acElement.getId().toString()))
302             .thenReturn(new JpaAutomationCompositionElement(acElement));
303
304         automationCompositionProvider.upgradeStates(List.of(acInfo));
305         verify(acElementRepository).saveAll(anyList());
306     }
307 }