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));