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.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;
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;
67 class AutomationCompositionProviderTest {
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";
72 private static final Coder CODER = new StandardCoder();
73 private static final String AUTOMATION_COMPOSITION_JSON =
74 "src/test/resources/providers/TestAutomationCompositions.json";
76 private AutomationCompositions inputAutomationCompositions;
77 private List<JpaAutomationComposition> inputAutomationCompositionsJpa;
78 private final String originalJson = ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON);
81 void beforeSetupDao() throws Exception {
82 inputAutomationCompositions = CODER.decode(originalJson, AutomationCompositions.class);
83 inputAutomationCompositionsJpa =
84 ProviderUtils.getJpaAndValidateList(inputAutomationCompositions.getAutomationCompositionList(),
85 JpaAutomationComposition::new, "automation compositions");
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);
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);
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);
113 when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0)))
114 .thenReturn(inputAutomationCompositionsJpa.get(0));
116 var createdAutomationComposition = automationCompositionProvider
117 .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0));
119 assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition);
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");
131 assertThatThrownBy(() -> automationCompositionProvider
132 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
133 .hasMessage("compositionId is marked non-null but is null");
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);
150 acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
151 null, Pageable.unpaged());
152 assertThat(acList).hasSize(2);
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);
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));
170 () -> automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
171 .hasMessageMatching("AutomationComposition not found");
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);
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();
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());
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));
206 automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId());
207 assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
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);
217 List<JpaAutomationComposition> res1 = new ArrayList<>();
218 res1.add(inputAutomationCompositionsJpa.get(0));
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)))
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());
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");
246 assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(null))
247 .hasMessageMatching("instanceId is marked non-null but is null");
249 var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
250 when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
251 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
254 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
255 assertEquals(automationComposition, deletedAc);
257 when(acRollbackRepository.existsById(automationComposition.getInstanceId().toString())).thenReturn(true);
260 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
261 assertEquals(automationComposition, deletedAc);
262 verify(acRollbackRepository).deleteById(automationComposition.getInstanceId().toString());
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());
280 void testValidateElementIds() {
281 var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
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();
290 var jpaElement = new JpaAutomationCompositionElement(ac.getElements().values().iterator().next());
291 when(acElementRepository.findAllById(anyIterable()))
292 .thenReturn(List.of(jpaElement));
294 ac.setInstanceId(null);
295 result = automationCompositionProvider.validateElementIds(ac);
296 assertThat(result.isValid()).isFalse();
298 ac.setInstanceId(UUID.randomUUID());
299 jpaElement.setInstanceId(UUID.randomUUID().toString());
300 result = automationCompositionProvider.validateElementIds(ac);
301 assertThat(result.isValid()).isFalse();
303 ac.setInstanceId(UUID.randomUUID());
304 jpaElement.setInstanceId(ac.getInstanceId().toString());
305 result = automationCompositionProvider.validateElementIds(ac);
306 assertThat(result.isValid()).isTrue();
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);
319 verify(acRollbackRepository).save(any(JpaAutomationCompositionRollback.class));
320 var instanceId = ac.getInstanceId();
321 assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
322 .getAutomationCompositionRollback(instanceId));
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());
332 var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
333 when(acRollbackRepository.findById(anyString())).thenReturn(Optional.of(rollback));
335 var automationCompositionProvider = new AutomationCompositionProvider(
336 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
337 acRollbackRepository);
338 var rbFromDb = automationCompositionProvider.getAutomationCompositionRollback(ac.getInstanceId());
339 assertNotNull(rbFromDb);
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));
355 void testVersionCompatibility() {
357 var newDefinition = new PfConceptKey("policy.clamp.element", "1.2.3");
358 var oldDefinition = new PfConceptKey("policy.clamp.element", "1.2.3");
360 var instanceId = UUID.randomUUID();
361 assertDoesNotThrow(() ->
362 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
365 newDefinition.setVersion("1.2.4");
366 assertDoesNotThrow(() ->
367 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
370 newDefinition.setVersion("1.3.1");
371 assertDoesNotThrow(() ->
372 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
375 newDefinition.setVersion("2.1.1");
376 assertDoesNotThrow(() ->
377 AutomationCompositionProvider.checkCompatibility(newDefinition, oldDefinition, instanceId));
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");
388 void testValidateNameVersion() {
389 var automationCompositionRepository = mock(AutomationCompositionRepository.class);
390 var automationCompositionProvider = new AutomationCompositionProvider(
391 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
392 mock(AutomationCompositionRollbackRepository.class));
394 var acIdentifier = new ToscaConceptIdentifier();
395 assertDoesNotThrow(() -> {
396 automationCompositionProvider.validateNameVersion(acIdentifier);
399 when(automationCompositionRepository.findOne(Mockito.any()))
400 .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
401 assertThatThrownBy(() -> {
402 automationCompositionProvider.validateNameVersion(acIdentifier);
403 }).hasMessageContaining("already defined");
407 void testValidateInstanceEndpoint() {
408 var automationComposition = new AutomationComposition();
409 automationComposition.setCompositionId(UUID.randomUUID());
411 var compositionId = automationComposition.getCompositionId();
412 assertDoesNotThrow(() -> AutomationCompositionProvider
413 .validateInstanceEndpoint(compositionId, automationComposition));
415 var wrongCompositionId = UUID.randomUUID();
416 assertThatThrownBy(() -> AutomationCompositionProvider
417 .validateInstanceEndpoint(wrongCompositionId, automationComposition))
418 .hasMessageContaining("do not match with");
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);
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));
440 var acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
441 assertNotNull(acInstances);
442 assertEquals(2, acInstances.size());
444 stateChangeResults.add(StateChangeResult.NO_ERROR);
445 acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
446 assertNotNull(acInstances);
448 deployStates.add(DeployState.DEPLOYED);
449 acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
450 assertNotNull(acInstances);
452 stateChangeResults.clear();
453 acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
454 assertNotNull(acInstances);
458 void testGetAcInstancesByFilter_WithCompositionIds() {
459 Page<JpaAutomationComposition> mockPage = new PageImpl<>(inputAutomationCompositionsJpa);
460 var acRepository = mock(AutomationCompositionRepository.class);
462 var acIds = new ArrayList<String>();
463 var stateChangeResults = new ArrayList<StateChangeResult>();
464 var deployStates = new ArrayList<DeployState>();
465 var pageable = Pageable.unpaged();
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);
474 var acProvider = new AutomationCompositionProvider(acRepository,
475 mock(AutomationCompositionElementRepository.class), mock(AutomationCompositionRollbackRepository.class));
477 acIds.add(inputAutomationCompositions.getAutomationCompositionList().get(0).getCompositionId().toString());
479 var acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
480 assertNotNull(acInstances);
481 assertEquals(2, acInstances.size());
483 stateChangeResults.add(StateChangeResult.NO_ERROR);
484 acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
485 assertNotNull(acInstances);
487 deployStates.add(DeployState.DEPLOYED);
488 acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
489 assertNotNull(acInstances);
491 stateChangeResults.clear();
492 acInstances = acProvider.getAcInstancesByFilter(acIds, stateChangeResults, deployStates, pageable);
493 assertNotNull(acInstances);
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));