0e51a24087abd8f2e38a3b608285afa36c9317de
[policy/clamp.git] /
1 /*-
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
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.junit.jupiter.api.Assertions.assertNotNull;
28 import static org.junit.jupiter.api.Assertions.assertThrows;
29 import static org.junit.jupiter.api.Assertions.assertTrue;
30 import static org.mockito.ArgumentMatchers.any;
31 import static org.mockito.ArgumentMatchers.anyCollection;
32 import static org.mockito.ArgumentMatchers.anyIterable;
33 import static org.mockito.ArgumentMatchers.anyString;
34 import static org.mockito.Mockito.mock;
35 import static org.mockito.Mockito.verify;
36 import static org.mockito.Mockito.when;
37
38 import java.util.ArrayList;
39 import java.util.List;
40 import java.util.Optional;
41 import java.util.UUID;
42 import org.junit.jupiter.api.BeforeEach;
43 import org.junit.jupiter.api.Test;
44 import org.mockito.Mockito;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
47 import org.onap.policy.clamp.models.acm.concepts.DeployState;
48 import org.onap.policy.clamp.models.acm.concepts.LockState;
49 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
50 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationComposition;
51 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionElement;
52 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
53 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionElementRepository;
54 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
55 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRollbackRepository;
56 import org.onap.policy.common.utils.coder.Coder;
57 import org.onap.policy.common.utils.coder.StandardCoder;
58 import org.onap.policy.common.utils.resources.ResourceUtils;
59 import org.onap.policy.models.base.PfConceptKey;
60 import org.onap.policy.models.base.PfModelRuntimeException;
61 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
62 import org.springframework.data.domain.Page;
63 import org.springframework.data.domain.PageImpl;
64 import org.springframework.data.domain.PageRequest;
65 import org.springframework.data.domain.Pageable;
66
67 class AutomationCompositionProviderTest {
68
69     private static final String AC_IS_NULL = "automationComposition is marked non-null but is null";
70     private static final String ACELEMENT_ID_IS_NULL = "elementId is marked non-null but is null";
71
72     private static final Coder CODER = new StandardCoder();
73     private static final String AUTOMATION_COMPOSITION_JSON =
74         "src/test/resources/providers/TestAutomationCompositions.json";
75
76     private AutomationCompositions inputAutomationCompositions;
77     private List<JpaAutomationComposition> inputAutomationCompositionsJpa;
78     private final String originalJson = ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON);
79
80     @BeforeEach
81     void beforeSetupDao() throws Exception {
82         inputAutomationCompositions = CODER.decode(originalJson, AutomationCompositions.class);
83         inputAutomationCompositionsJpa =
84             ProviderUtils.getJpaAndValidateList(inputAutomationCompositions.getAutomationCompositionList(),
85                 JpaAutomationComposition::new, "automation compositions");
86     }
87
88     @Test
89     void testAutomationCompositionCreate() {
90         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
91         when(automationCompositionRepository.save(any(JpaAutomationComposition.class)))
92             .thenReturn(inputAutomationCompositionsJpa.get(0));
93         var inputAc = inputAutomationCompositions.getAutomationCompositionList().get(0);
94
95         var automationCompositionProvider = new AutomationCompositionProvider(
96                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
97                 mock(AutomationCompositionRollbackRepository.class));
98         var createdAutomationComposition = automationCompositionProvider.createAutomationComposition(inputAc);
99         inputAc.setInstanceId(createdAutomationComposition.getInstanceId());
100         inputAc.setLastMsg(createdAutomationComposition.getLastMsg());
101         assertEquals(inputAc, createdAutomationComposition);
102     }
103
104     @Test
105     void testAutomationCompositionUpdate() {
106         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
107         var automationCompositionProvider = new AutomationCompositionProvider(
108                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
109                 mock(AutomationCompositionRollbackRepository.class));
110         assertThatThrownBy(() -> automationCompositionProvider.updateAutomationComposition(null))
111             .hasMessageMatching(AC_IS_NULL);
112
113         when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0)))
114             .thenReturn(inputAutomationCompositionsJpa.get(0));
115
116         var createdAutomationComposition = automationCompositionProvider
117             .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0));
118
119         assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition);
120     }
121
122     @Test
123     void testGetAutomationCompositionsWithNull() {
124         var automationCompositionProvider = new AutomationCompositionProvider(
125                 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
126                 mock(AutomationCompositionRollbackRepository.class));
127         assertThatThrownBy(() -> automationCompositionProvider
128             .getAutomationCompositions(UUID.randomUUID(), null, null, null))
129             .hasMessage("pageable is marked non-null but is null");
130
131         assertThatThrownBy(() -> automationCompositionProvider
132             .getAutomationCompositions(null, null, null, Pageable.unpaged()))
133             .hasMessage("compositionId is marked non-null but is null");
134     }
135
136     @Test
137     void testGetAutomationCompositions() {
138         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
139         var automationCompositionProvider = new AutomationCompositionProvider(
140                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
141                 mock(AutomationCompositionRollbackRepository.class));
142         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
143         when(automationCompositionRepository
144             .findAll(Mockito.any(), any(Pageable.class)))
145             .thenReturn(new PageImpl<>(inputAutomationCompositionsJpa));
146         var acList = automationCompositionProvider.getAutomationCompositions(UUID.randomUUID(),
147             automationComposition.getName(), automationComposition.getVersion(), Pageable.unpaged());
148         assertThat(acList).hasSize(2);
149
150         acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
151             null, Pageable.unpaged());
152         assertThat(acList).hasSize(2);
153
154         when(automationCompositionRepository
155             .findAll(Mockito.any(), Mockito.any(Pageable.class)))
156             .thenReturn(new PageImpl<>(inputAutomationCompositionsJpa));
157         acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
158             null, PageRequest.of(0, 10));
159         assertThat(acList).hasSize(2);
160     }
161
162     @Test
163     void testGetAutomationComposition() {
164         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
165         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
166         var automationCompositionProvider = new AutomationCompositionProvider(
167                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
168                 mock(AutomationCompositionRollbackRepository.class));
169         assertThatThrownBy(
170             () -> automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
171             .hasMessageMatching("AutomationComposition not found");
172
173         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
174             .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
175         var ac = automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId());
176         assertEquals(automationComposition, ac);
177     }
178
179     @Test
180     void testFindAutomationComposition() {
181         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
182         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
183         var automationCompositionProvider = new AutomationCompositionProvider(
184                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
185                 mock(AutomationCompositionRollbackRepository.class));
186         var acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
187         assertThat(acOpt).isEmpty();
188
189         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
190                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
191         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
192         assertTrue(acOpt.isPresent());
193         assertEquals(automationComposition, acOpt.get());
194     }
195
196     @Test
197     void testGetAcInstancesByCompositionId() {
198         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
199         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
200         when(automationCompositionRepository.findByCompositionId(automationComposition.getCompositionId().toString()))
201             .thenReturn(inputAutomationCompositionsJpa);
202         var automationCompositionProvider = new AutomationCompositionProvider(
203                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
204                 mock(AutomationCompositionRollbackRepository.class));
205         var acList =
206             automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId());
207         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
208     }
209
210     @Test
211     void testGetAcInstancesInTransition() {
212         inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
213         inputAutomationCompositions.getAutomationCompositionList().get(1).setLockState(LockState.LOCKING);
214         inputAutomationCompositionsJpa.get(0).setDeployState(DeployState.DEPLOYING);
215         inputAutomationCompositionsJpa.get(1).setLockState(LockState.LOCKING);
216
217         List<JpaAutomationComposition> res1 = new ArrayList<>();
218         res1.add(inputAutomationCompositionsJpa.get(0));
219
220         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
221         when(automationCompositionRepository.findByDeployStateIn(List.of(DeployState.DEPLOYING,
222             DeployState.UNDEPLOYING, DeployState.DELETING, DeployState.UPDATING, DeployState.MIGRATING,
223                 DeployState.MIGRATION_REVERTING)))
224             .thenReturn(res1);
225         when(automationCompositionRepository.findByLockStateIn(List.of(LockState.LOCKING, LockState.UNLOCKING)))
226             .thenReturn(List.of(inputAutomationCompositionsJpa.get(1)));
227         var automationCompositionProvider = new AutomationCompositionProvider(
228                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
229                 mock(AutomationCompositionRollbackRepository.class));
230         var acList = automationCompositionProvider.getAcInstancesInTransition();
231         assertThat(acList).hasSize(2)
232             .contains(inputAutomationCompositions.getAutomationCompositionList().get(0).getInstanceId())
233             .contains(inputAutomationCompositions.getAutomationCompositionList().get(1).getInstanceId());
234     }
235
236     @Test
237     void testDeleteAutomationComposition() {
238         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
239         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
240         var automationCompositionProvider = new AutomationCompositionProvider(
241                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
242                 acRollbackRepository);
243         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(UUID.randomUUID()))
244             .hasMessageMatching(".*.failed, automation composition does not exist");
245
246         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(null))
247                 .hasMessageMatching("instanceId is marked non-null but is null");
248
249         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
250         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
251             .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
252
253         var deletedAc =
254             automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
255         assertEquals(automationComposition, deletedAc);
256
257         when(acRollbackRepository.existsById(automationComposition.getInstanceId().toString())).thenReturn(true);
258
259         deletedAc =
260                 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
261         assertEquals(automationComposition, deletedAc);
262         verify(acRollbackRepository).deleteById(automationComposition.getInstanceId().toString());
263     }
264
265     @Test
266     void testDeleteElementById() {
267         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
268         var acElementRepository = mock(AutomationCompositionElementRepository.class);
269         var automationCompositionProvider = new AutomationCompositionProvider(
270                 automationCompositionRepository, acElementRepository,
271                 mock(AutomationCompositionRollbackRepository.class));
272         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationCompositionElement(null))
273             .hasMessageMatching(ACELEMENT_ID_IS_NULL);
274         var elementId = UUID.randomUUID();
275         automationCompositionProvider.deleteAutomationCompositionElement(elementId);
276         verify(acElementRepository).deleteById(elementId.toString());
277     }
278
279     @Test
280     void testValidateElementIds() {
281         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
282
283         var acElementRepository = mock(AutomationCompositionElementRepository.class);
284         var automationCompositionProvider = new AutomationCompositionProvider(
285                 mock(AutomationCompositionRepository.class), acElementRepository,
286                 mock(AutomationCompositionRollbackRepository.class));
287         var result = automationCompositionProvider.validateElementIds(ac);
288         assertThat(result.isValid()).isTrue();
289
290         var jpaElement = new JpaAutomationCompositionElement(ac.getElements().values().iterator().next());
291         when(acElementRepository.findAllById(anyIterable()))
292             .thenReturn(List.of(jpaElement));
293
294         ac.setInstanceId(null);
295         result = automationCompositionProvider.validateElementIds(ac);
296         assertThat(result.isValid()).isFalse();
297
298         ac.setInstanceId(UUID.randomUUID());
299         jpaElement.setInstanceId(UUID.randomUUID().toString());
300         result = automationCompositionProvider.validateElementIds(ac);
301         assertThat(result.isValid()).isFalse();
302
303         ac.setInstanceId(UUID.randomUUID());
304         jpaElement.setInstanceId(ac.getInstanceId().toString());
305         result = automationCompositionProvider.validateElementIds(ac);
306         assertThat(result.isValid()).isTrue();
307     }
308
309     @Test
310     void testCopyAcElements() {
311         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
312         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
313         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
314         var automationCompositionProvider = new AutomationCompositionProvider(
315                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
316                 acRollbackRepository);
317         automationCompositionProvider.copyAcElementsBeforeUpdate(ac);
318
319         verify(acRollbackRepository).save(any(JpaAutomationCompositionRollback.class));
320         var instanceId = ac.getInstanceId();
321         assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
322             .getAutomationCompositionRollback(instanceId));
323     }
324
325     @Test
326     void testGetRollbackSuccess() {
327         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
328         var rollback = new JpaAutomationCompositionRollback();
329         rollback.setInstanceId(ac.getInstanceId().toString());
330         rollback.setCompositionId(ac.getCompositionId().toString());
331
332         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
333         when(acRollbackRepository.findById(anyString())).thenReturn(Optional.of(rollback));
334
335         var automationCompositionProvider = new AutomationCompositionProvider(
336                 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
337                 acRollbackRepository);
338         var rbFromDb = automationCompositionProvider.getAutomationCompositionRollback(ac.getInstanceId());
339         assertNotNull(rbFromDb);
340     }
341
342     @Test
343     void testGetRollbackEmpty() {
344         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
345         var automationCompositionProvider = new AutomationCompositionProvider(
346                 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
347                 acRollbackRepository);
348         when(acRollbackRepository.findById(anyString())).thenReturn(Optional.empty());
349         var compositionId = UUID.randomUUID();
350         assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
351             .getAutomationCompositionRollback(compositionId));
352     }
353
354     @Test
355     void testVersionCompatibility() {
356         // Identical
357         var newDefinition = new PfConceptKey("policy.clamp.element", "1.2.3");
358         var oldDefinition = new PfConceptKey("policy.clamp.element", "1.2.3");
359
360         var instanceId = UUID.randomUUID();
361         assertDoesNotThrow(() ->
362                 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
363
364         // Patch
365         newDefinition.setVersion("1.2.4");
366         assertDoesNotThrow(() ->
367                 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
368
369         // Minor
370         newDefinition.setVersion("1.3.1");
371         assertDoesNotThrow(() ->
372                 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
373
374         // Major
375         newDefinition.setVersion("2.1.1");
376         assertDoesNotThrow(() ->
377                 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
378
379         // Not compatible
380         newDefinition.setName("policy.clamp.newElement");
381         newDefinition.setVersion("2.2.4");
382         assertThatThrownBy(() -> AutomationCompositionProvider
383                 .checkCompatibility(newDefinition, oldDefinition, instanceId))
384                 .hasMessageContaining("is not compatible");
385     }
386
387     @Test
388     void testValidateNameVersion() {
389         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
390         var automationCompositionProvider = new AutomationCompositionProvider(
391                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
392                 mock(AutomationCompositionRollbackRepository.class));
393
394         var acIdentifier = new ToscaConceptIdentifier();
395         assertDoesNotThrow(() -> {
396             automationCompositionProvider.validateNameVersion(acIdentifier);
397         });
398
399         when(automationCompositionRepository.findOne(Mockito.any()))
400                 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
401         assertThatThrownBy(() -> {
402             automationCompositionProvider.validateNameVersion(acIdentifier);
403         }).hasMessageContaining("already defined");
404     }
405
406     @Test
407     void testValidateInstanceEndpoint() {
408         var automationComposition = new AutomationComposition();
409         automationComposition.setCompositionId(UUID.randomUUID());
410
411         var compositionId = automationComposition.getCompositionId();
412         assertDoesNotThrow(() -> AutomationCompositionProvider
413                 .validateInstanceEndpoint(compositionId, automationComposition));
414
415         var wrongCompositionId = UUID.randomUUID();
416         assertThatThrownBy(() -> AutomationCompositionProvider
417                 .validateInstanceEndpoint(wrongCompositionId, automationComposition))
418                 .hasMessageContaining("do not match with");
419     }
420
421     @Test
422     void testGetAcInstancesByFilter_WithoutCompositionIds() {
423         Page<JpaAutomationComposition> mockPage = new PageImpl<>(inputAutomationCompositionsJpa);
424         var acRepository = mock(AutomationCompositionRepository.class);
425         when(acRepository.findByStateChangeResultIn(anyCollection(), any(Pageable.class)))
426             .thenReturn(mockPage);
427         when(acRepository.findByDeployStateIn(anyCollection(), any(Pageable.class)))
428             .thenReturn(mockPage);
429
430         var acIds = new ArrayList<String>();
431         var stateChangeResults = new ArrayList<StateChangeResult>();
432         var deployStates = new ArrayList<DeployState>();
433         var pageable = Pageable.unpaged();
434         when(acRepository.findByStateChangeResultInAndDeployStateIn(
435             stateChangeResults, deployStates, pageable)).thenReturn(mockPage);
436         when(acRepository.findAll(any(Pageable.class))).thenReturn(mockPage);
437         var acProvider = new AutomationCompositionProvider(acRepository,
438             mock(AutomationCompositionElementRepository.class), mock(AutomationCompositionRollbackRepository.class));
439
440         var acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
441         assertNotNull(acInstances);
442         assertEquals(2, acInstances.size());
443
444         stateChangeResults.add(StateChangeResult.NO_ERROR);
445         acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
446         assertNotNull(acInstances);
447
448         deployStates.add(DeployState.DEPLOYED);
449         acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
450         assertNotNull(acInstances);
451
452         stateChangeResults.clear();
453         acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
454         assertNotNull(acInstances);
455     }
456
457     @Test
458     void testGetAcInstancesByFilter_WithCompositionIds() {
459         Page<JpaAutomationComposition> mockPage = new PageImpl<>(inputAutomationCompositionsJpa);
460         var acRepository = mock(AutomationCompositionRepository.class);
461
462         var acIds = new ArrayList<String>();
463         var stateChangeResults = new ArrayList<StateChangeResult>();
464         var deployStates = new ArrayList<DeployState>();
465         var pageable = Pageable.unpaged();
466
467         when(acRepository.findByCompositionIdInAndStateChangeResultInAndDeployStateIn(
468             acIds, stateChangeResults, deployStates, pageable)).thenReturn(mockPage);
469         when(acRepository.findByCompositionIdInAndStateChangeResultIn(acIds, stateChangeResults, pageable))
470             .thenReturn(mockPage);
471         when(acRepository.findByCompositionIdInAndDeployStateIn(acIds, deployStates, pageable)).thenReturn(mockPage);
472         when(acRepository.findByCompositionIdIn(acIds, pageable)).thenReturn(mockPage);
473
474         var acProvider = new AutomationCompositionProvider(acRepository,
475             mock(AutomationCompositionElementRepository.class), mock(AutomationCompositionRollbackRepository.class));
476
477         acIds.add(inputAutomationCompositions.getAutomationCompositionList().get(0).getCompositionId().toString());
478
479         var acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
480         assertNotNull(acInstances);
481         assertEquals(2, acInstances.size());
482
483         stateChangeResults.add(StateChangeResult.NO_ERROR);
484         acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
485         assertNotNull(acInstances);
486
487         deployStates.add(DeployState.DEPLOYED);
488         acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
489         assertNotNull(acInstances);
490
491         stateChangeResults.clear();
492         acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
493         assertNotNull(acInstances);
494     }
495
496     @Test
497     void testGetAcInstancesByFilterWithNull() {
498         var provider = new AutomationCompositionProvider(mock(AutomationCompositionRepository.class),
499             mock(AutomationCompositionElementRepository.class), mock(AutomationCompositionRollbackRepository.class));
500         var acIds = new ArrayList<String>();
501         var stateChangeResults = new ArrayList<StateChangeResult>();
502         var deployStates = new ArrayList<DeployState>();
503         var pageable = Pageable.unpaged();
504         assertThrows(NullPointerException.class, () ->
505             provider.getAcInstancesByFilter(null, stateChangeResults, deployStates, pageable));
506         assertThrows(NullPointerException.class, () ->
507             provider.getAcInstancesByFilter(acIds, null, deployStates, pageable));
508         assertThrows(NullPointerException.class, () ->
509             provider.getAcInstancesByFilter(acIds, stateChangeResults, null, pageable));
510         assertThrows(NullPointerException.class, () ->
511             provider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, null));
512     }
513 }