Fix error in userId handling
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / ComponentInstanceBusinessLogicTest.java
index 4408b3c..e813924 100644 (file)
 package org.openecomp.sdc.be.components.impl;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.DynamicTest.dynamicTest;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anySet;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import static org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum.RESOURCE_PARAM_NAME;
 
 import fj.data.Either;
 import java.util.ArrayList;
@@ -40,43 +51,53 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import lombok.SneakyThrows;
 import mockit.Deencapsulation;
 import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
 import org.assertj.core.util.Lists;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestFactory;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.mockito.junit.MockitoJUnitRunner;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.components.validation.UserValidations;
 import org.openecomp.sdc.be.config.ConfigurationManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphDao;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
-import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
+import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathElementDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ToscaGetFunctionDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.PropertySource;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType;
+import org.openecomp.sdc.be.exception.BusinessException;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.impl.ServletUtils;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.CapabilityDefinition;
 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
 import org.openecomp.sdc.be.model.ComponentInstanceInput;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
@@ -85,6 +106,7 @@ import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.LifecycleStateEnum;
 import org.openecomp.sdc.be.model.PolicyDefinition;
+import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.RelationshipImpl;
 import org.openecomp.sdc.be.model.RelationshipInfo;
 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
@@ -93,33 +115,35 @@ import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
+import org.openecomp.sdc.be.model.jsonjanusgraph.config.ContainerInstanceTypesData;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.OperationException;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.GraphLockOperation;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
-import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.be.model.validation.ToscaFunctionValidator;
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
 import org.openecomp.sdc.common.api.ConfigurationSource;
 import org.openecomp.sdc.common.impl.ExternalConfiguration;
 import org.openecomp.sdc.common.impl.FSConfigurationSource;
+import org.openecomp.sdc.common.util.ValidationUtils;
 import org.openecomp.sdc.exception.ResponseFormat;
 
 /**
  * The test suite designed for test functionality of ComponentInstanceBusinessLogic class
  */
-
-@RunWith(MockitoJUnitRunner.class)
-public class ComponentInstanceBusinessLogicTest {
+class ComponentInstanceBusinessLogicTest {
 
     private final static String USER_ID = "jh0003";
     private final static String COMPONENT_ID = "componentId";
     private final static String ORIGIN_COMPONENT_ID = "originComponentId";
-    private final static String COMPONENT_INST_ID = "componentInstId";
+    private final static String ORIGIN_COMPONENT_VERSION = "1.0";
     private final static String TO_INSTANCE_ID = "toInstanceId";
     private final static String TO_INSTANCE_NAME = "toInstanceName";
     private final static String COMPONENT_INSTANCE_ID = "componentInstanceId";
+    private final static String COMPONENT_INSTANCE_NAME = "componentInstanceName";
     private final static String FROM_INSTANCE_ID = "fromInstanceId";
     private final static String RELATION_ID = "relationId";
     private final static String CAPABILITY_OWNER_ID = "capabilityOwnerId";
@@ -136,85 +160,105 @@ public class ComponentInstanceBusinessLogicTest {
     private final static String ARTIFACT_5 = "cloudtech_openstack_configtemplate.zip";
     private final static String PROP_NAME = "propName";
     private final static String NON_EXIST_NAME = "nonExistName";
+    private final static String INPUT_ID = "inputId";
+    private final static String ICON_NAME = "icon";
 
-    static ConfigurationSource configurationSource = new FSConfigurationSource(
-        ExternalConfiguration.getChangeListener(),
-        "src/test/resources/config/catalog-be");
-    static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
-
-    @InjectMocks
-    private static ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
+    private ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
     @Mock
     private ComponentInstancePropInput componentInstancePropInput;
     @Mock
-    ArtifactsBusinessLogic artifactsBusinessLogic;
+    private ArtifactsBusinessLogic artifactsBusinessLogic;
     @Mock
     private ComponentsUtils componentsUtils;
     @Mock
-    private ServletUtils servletUtils;
-    @Mock
-    private ResponseFormat responseFormat;
-    @Mock
     private ToscaOperationFacade toscaOperationFacade;
     @Mock
-    private UserBusinessLogic userAdmin;
-    @Mock
     private ForwardingPathOperation forwardingPathOperation;
     @Mock
     private User user;
     @Mock
     private UserValidations userValidations;
     @Mock
-    GraphLockOperation graphLockOperation;
+    private GraphLockOperation graphLockOperation;
     @Mock
     private JanusGraphDao janusGraphDao;
     @Mock
-    ApplicationDataTypeCache dataTypeCache;
+    private ApplicationDataTypeCache applicationDataTypeCache;
     @Mock
-    PropertyOperation propertyOperation;
+    private PropertyOperation propertyOperation;
     @Mock
-    ApplicationDataTypeCache applicationDataTypeCache;
-
+    private ContainerInstanceTypesData containerInstanceTypeData;
+    @Mock
+    private CompositionBusinessLogic compositionBusinessLogic;
+    @Mock
+    private ToscaFunctionValidator toscaFunctionValidator;
+    @Mock
+    private PropertyBusinessLogic propertyBusinessLogic;
     private Component service;
     private Component resource;
     private ComponentInstance toInstance;
     private ComponentInstance fromInstance;
-    private CapabilityDataDefinition capability;
-    private RequirementDataDefinition requirement;
     private RequirementCapabilityRelDef relation;
+    private List<ComponentInstanceProperty> ciPropertyList;
+    private List<ComponentInstanceInput> ciInputList;
+
+    @BeforeAll
+    static void beforeAll() {
+        initConfig();
+    }
+
+    private static void initConfig() {
+        final ConfigurationSource configurationSource = new FSConfigurationSource(
+            ExternalConfiguration.getChangeListener(),
+            "src/test/resources/config/catalog-be"
+        );
+        new ConfigurationManager(configurationSource);
+    }
+
+    @BeforeEach
+    void init() {
+        MockitoAnnotations.openMocks(this);
+        componentInstanceBusinessLogic = new ComponentInstanceBusinessLogic(null, null, null, null, null, null, null, artifactsBusinessLogic, null,
+            null, forwardingPathOperation, null, null, toscaFunctionValidator, propertyBusinessLogic);
+        componentInstanceBusinessLogic.setComponentsUtils(componentsUtils);
+        componentInstanceBusinessLogic.setToscaOperationFacade(toscaOperationFacade);
+        componentInstanceBusinessLogic.setUserValidations(userValidations);
+        componentInstanceBusinessLogic.setGraphLockOperation(graphLockOperation);
+        componentInstanceBusinessLogic.setJanusGraphDao(janusGraphDao);
+        componentInstanceBusinessLogic.setApplicationDataTypeCache(applicationDataTypeCache);
+        componentInstanceBusinessLogic.setPropertyOperation(propertyOperation);
+        componentInstanceBusinessLogic.setContainerInstanceTypesData(containerInstanceTypeData);
+        componentInstanceBusinessLogic.setCompositionBusinessLogic(compositionBusinessLogic);
 
-    @Before
-    public void init() {
-        MockitoAnnotations.initMocks(componentInstanceBusinessLogic);
         stubMethods();
         createComponents();
     }
 
     @Test
-    public void testGetRelationByIdSuccess() {
+    void testGetRelationByIdSuccess() {
         getServiceRelationByIdSuccess(service);
         getServiceRelationByIdSuccess(resource);
     }
 
     @Test
-    public void testGetRelationByIdUserValidationFailure() {
+    void testGetRelationByIdUserValidationFailure() {
         getServiceRelationByIdUserValidationFailure(service);
         getServiceRelationByIdUserValidationFailure(resource);
     }
 
     @Test
-    public void testGetRelationByIdComponentNotFoundFailure() {
+    void testGetRelationByIdComponentNotFoundFailure() {
         getRelationByIdComponentNotFoundFailure(service);
         getRelationByIdComponentNotFoundFailure(resource);
     }
 
     @Test
-    public void testForwardingPathOnVersionChange() {
+    void testForwardingPathOnVersionChange() {
         getforwardingPathOnVersionChange();
     }
 
     @Test
-    public void testIsCloudSpecificArtifact() {
+    void testIsCloudSpecificArtifact() {
         assertThat(componentInstanceBusinessLogic.isCloudSpecificArtifact(ARTIFACT_1)).isTrue();
         assertThat(componentInstanceBusinessLogic.isCloudSpecificArtifact(ARTIFACT_2)).isTrue();
         assertThat(componentInstanceBusinessLogic.isCloudSpecificArtifact(ARTIFACT_3)).isTrue();
@@ -253,7 +297,7 @@ public class ComponentInstanceBusinessLogicTest {
         when(toscaOperationFacade.getToscaElement(eq(containerComponentID), any(ComponentParametersView.class)))
             .thenReturn(Either.left(component));
         when(toscaOperationFacade.validateComponentExists(any(String.class))).thenReturn(Either.left(Boolean.TRUE));
-        when(toscaOperationFacade.getToscaFullElement(eq(new_Comp_UID))).thenReturn(Either.left(component2));
+        when(toscaOperationFacade.getToscaFullElement(new_Comp_UID)).thenReturn(Either.left(component2));
 
         Either<Set<String>, ResponseFormat> resultOp = componentInstanceBusinessLogic
             .forwardingPathOnVersionChange(containerComponentParam,
@@ -264,8 +308,9 @@ public class ComponentInstanceBusinessLogicTest {
 
     }
 
+    @SneakyThrows
     @Test
-    public void testCreateOrUpdatePropertiesValues2() {
+    void testCreateOrUpdatePropertiesValues2() {
         String containerComponentID = "containerId";
         String resourceInstanceId = "resourceId";
         String componentInstanceID = "componentInstance";
@@ -274,6 +319,7 @@ public class ComponentInstanceBusinessLogicTest {
         property.setName("property");
         property.setValue("newVal");
         property.setType("string");
+        property.setUniqueId("propId");
         properties.add(property);
 
         List<ComponentInstanceProperty> origProperties = new ArrayList<>();
@@ -283,6 +329,14 @@ public class ComponentInstanceBusinessLogicTest {
         origProperty.setType("string");
         origProperties.add(origProperty);
 
+        List<PropertyDefinition> ciProperties = new ArrayList<>();
+        PropertyDefinition ciProperty = new ComponentInstanceProperty();
+        ciProperty.setName("property");
+        ciProperty.setValue("value");
+        ciProperty.setType("string");
+        ciProperty.setUniqueId("propId");
+        ciProperties.add(ciProperty);
+
         Map<String, DataTypeDefinition> types = new HashMap<>();
         DataTypeDefinition dataTypeDef = new DataTypeDefinition();
         types.put("string", dataTypeDef);
@@ -295,19 +349,15 @@ public class ComponentInstanceBusinessLogicTest {
         component.setComponentInstancesProperties(componentInstanceProps);
         ComponentInstance ci = createComponentInstance("ci1");
         ci.setUniqueId("resourceId");
+        ci.setProperties(ciProperties);
         component.setComponentInstances(Arrays.asList(ci, createComponentInstance("ci2"),
             createComponentInstance(componentInstanceID)));
-        HashMap<String, DataTypeDefinition> dataTypeDefinitionHashMap = new HashMap<>();
-        DataTypeDefinition dataTypeDefinition = new DataTypeDefinition();
-        dataTypeDefinition.setName("string");
-        dataTypeDefinitionHashMap.put("string", dataTypeDefinition);
 
-        //when(userValidations.validateUserExists(user.getUserId(), false)).thenReturn(user);
         when(toscaOperationFacade.getToscaElement(containerComponentID, JsonParseFlagEnum.ParseAll))
             .thenReturn(Either.left(component));
         when(graphLockOperation.lockComponent(containerComponentID, NodeTypeEnum.ResourceInstance))
             .thenReturn(StorageOperationStatus.OK);
-        when(dataTypeCache.getAll()).thenReturn(Either.left(types));
+        when(componentsUtils.getAllDataTypes(applicationDataTypeCache, component.getModel())).thenReturn(types);
         when(propertyOperation.validateAndUpdatePropertyValue(property.getType(), "newVal", true, null, types))
             .thenReturn(Either.left("newVal"));
         when(propertyOperation.validateAndUpdateRules("string", property.getRules(),
@@ -320,6 +370,10 @@ public class ComponentInstanceBusinessLogicTest {
         when(janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
         when(graphLockOperation.unlockComponent(containerComponentID, NodeTypeEnum.ResourceInstance))
             .thenReturn(StorageOperationStatus.OK);
+        when(propertyBusinessLogic.getComponentModelByComponentId(any())).thenReturn(component.getModel());
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(types));
+        PropertyValueConstraintValidationUtil validationUtil = Mockito.mock(PropertyValueConstraintValidationUtil.class);
+        when(validationUtil.validatePropertyConstraints(any(),any(),any())).thenReturn(Either.left(any()));
 
         Either<List<ComponentInstanceProperty>, ResponseFormat> responseFormatEither = componentInstanceBusinessLogic
             .createOrUpdatePropertiesValues(
@@ -327,8 +381,11 @@ public class ComponentInstanceBusinessLogicTest {
         assertThat(responseFormatEither.left().value()).isEqualTo(properties);
     }
 
+
+
+    @SneakyThrows
     @Test
-    public void testCreateOrUpdatePropertiesValuesPropertyNotExists() {
+    void testCreateOrUpdatePropertiesValuesPropertyNotExists() {
         String containerComponentID = "containerId";
         String resourceInstanceId = "resourceId";
         String componentInstanceID = "componentInstance";
@@ -341,10 +398,6 @@ public class ComponentInstanceBusinessLogicTest {
 
         List<ComponentInstanceProperty> origProperties = new ArrayList<>();
 
-        Map<String, DataTypeDefinition> types = new HashMap<>();
-        DataTypeDefinition dataTypeDef = new DataTypeDefinition();
-        types.put("string", dataTypeDef);
-
         Component component = new Service();
         component.setLastUpdaterUserId("userId");
         component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
@@ -355,20 +408,19 @@ public class ComponentInstanceBusinessLogicTest {
         ci.setUniqueId("resourceId");
         component.setComponentInstances(Arrays.asList(ci, createComponentInstance("ci2"),
             createComponentInstance(componentInstanceID)));
-        HashMap<String, DataTypeDefinition> dataTypeDefinitionHashMap = new HashMap<>();
-        DataTypeDefinition dataTypeDefinition = new DataTypeDefinition();
-        dataTypeDefinition.setName("string");
-        dataTypeDefinitionHashMap.put("string", dataTypeDefinition);
 
-        //when(userValidations.validateUserExists(user.getUserId(), false)).thenReturn(user);
         when(toscaOperationFacade.getToscaElement(containerComponentID, JsonParseFlagEnum.ParseAll))
             .thenReturn(Either.left(component));
         when(graphLockOperation.lockComponent(containerComponentID, NodeTypeEnum.ResourceInstance))
             .thenReturn(StorageOperationStatus.OK);
-        //when(dataTypeCache.getAll()).thenReturn(Either.left(types));
-        //when (janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
         when(graphLockOperation.unlockComponent(containerComponentID, NodeTypeEnum.ResourceInstance))
             .thenReturn(StorageOperationStatus.OK);
+        when(propertyBusinessLogic.getComponentModelByComponentId(any())).thenReturn(component.getModel());
+        Map<String, DataTypeDefinition> dataTypeMap = new HashMap<>();
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(dataTypeMap));
+        PropertyValueConstraintValidationUtil validationUtil = Mockito.mock(PropertyValueConstraintValidationUtil.class);
+        when(validationUtil.validatePropertyConstraints(any(),any(),any()))
+            .thenReturn(Either.left(any()));
 
         try {
             componentInstanceBusinessLogic.createOrUpdatePropertiesValues(
@@ -379,8 +431,9 @@ public class ComponentInstanceBusinessLogicTest {
 
     }
 
+    @SneakyThrows
     @Test
-    public void testCreateOrUpdatePropertiesValuesValidationFailure() {
+    void testCreateOrUpdatePropertiesValuesValidationFailure() {
         String containerComponentID = "containerId";
         String resourceInstanceId = "resourceId";
         String componentInstanceID = "componentInstance";
@@ -412,34 +465,34 @@ public class ComponentInstanceBusinessLogicTest {
         ci.setUniqueId("resourceId");
         component.setComponentInstances(Arrays.asList(ci, createComponentInstance("ci2"),
             createComponentInstance(componentInstanceID)));
-        HashMap<String, DataTypeDefinition> dataTypeDefinitionHashMap = new HashMap<>();
-        DataTypeDefinition dataTypeDefinition = new DataTypeDefinition();
-        dataTypeDefinition.setName("string");
-        dataTypeDefinitionHashMap.put("string", dataTypeDefinition);
 
-        //when(userValidations.validateUserExists(user.getUserId(), false)).thenReturn(user);
         when(toscaOperationFacade.getToscaElement(containerComponentID, JsonParseFlagEnum.ParseAll))
             .thenReturn(Either.left(component));
         when(graphLockOperation.lockComponent(containerComponentID, NodeTypeEnum.ResourceInstance))
             .thenReturn(StorageOperationStatus.OK);
-        when(dataTypeCache.getAll()).thenReturn(Either.left(types));
+        when(componentsUtils.getAllDataTypes(applicationDataTypeCache, component.getModel())).thenReturn(types);
         when(propertyOperation.validateAndUpdatePropertyValue(property.getType(), "newVal", true, null, types))
             .thenReturn(Either.right(false));
         when(componentsUtils.convertFromStorageResponse(StorageOperationStatus.BAD_REQUEST))
             .thenReturn(ActionStatus.INVALID_CONTENT);
-
-        try {
-            componentInstanceBusinessLogic.createOrUpdatePropertiesValues(
-                ComponentTypeEnum.RESOURCE_INSTANCE, containerComponentID, resourceInstanceId, properties, "userId");
-        } catch (ComponentException e) {
-            assertThat(e.getActionStatus()).isEqualTo(ActionStatus.INVALID_CONTENT);
-            return;
-        }
-        fail();
+        when(propertyBusinessLogic.getComponentModelByComponentId(any())).thenReturn(component.getModel());
+        Map<String, DataTypeDefinition> dataTypeMap = new HashMap<>();
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(dataTypeMap));
+        PropertyValueConstraintValidationUtil validationUtil = Mockito.mock(PropertyValueConstraintValidationUtil.class);
+        when(validationUtil.validatePropertyConstraints(any(),any(),any()))
+            .thenReturn(Either.left(any()));
+
+        final Either<List<ComponentInstanceProperty>, ResponseFormat> response = componentInstanceBusinessLogic.createOrUpdatePropertiesValues(
+            ComponentTypeEnum.RESOURCE_INSTANCE, containerComponentID, resourceInstanceId, properties, "userId");
+        assertThat(response.isRight()).as("Response should be an error").isTrue();
+        final ResponseFormat responseFormat = response.right().value();
+        assertThat(responseFormat.getStatus()).as("Response status should be as expected").isEqualTo(400);
+        assertThat(responseFormat.getMessageId()).as("Error message id should be as expected").isEqualTo("SVC4726");
     }
 
+    @SneakyThrows
     @Test
-    public void testCreateOrUpdatePropertiesValuesMissingFieldFailure() {
+    void testCreateOrUpdatePropertiesValuesMissingFieldFailure() {
         String containerComponentID = "containerId";
         String resourceInstanceId = "resourceId";
         String componentInstanceID = "componentInstance";
@@ -467,16 +520,16 @@ public class ComponentInstanceBusinessLogicTest {
         component.setComponentInstances(Arrays.asList(ci, createComponentInstance("ci2"),
             createComponentInstance(componentInstanceID)));
 
-        HashMap<String, DataTypeDefinition> dataTypeDefinitionHashMap = new HashMap<>();
-        DataTypeDefinition dataTypeDefinition = new DataTypeDefinition();
-        dataTypeDefinition.setName("string");
-        dataTypeDefinitionHashMap.put("string", dataTypeDefinition);
-
-        //when(userValidations.validateUserExists(user.getUserId(), false)).thenReturn(user);
         when(toscaOperationFacade.getToscaElement(containerComponentID, JsonParseFlagEnum.ParseAll))
             .thenReturn(Either.left(component));
         when(graphLockOperation.lockComponent(containerComponentID, NodeTypeEnum.ResourceInstance))
             .thenReturn(StorageOperationStatus.OK);
+        when(propertyBusinessLogic.getComponentModelByComponentId(any())).thenReturn(component.getModel());
+        Map<String, DataTypeDefinition> dataTypeMap = new HashMap<>();
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(dataTypeMap));
+        PropertyValueConstraintValidationUtil validationUtil = Mockito.mock(PropertyValueConstraintValidationUtil.class);
+        when(validationUtil.validatePropertyConstraints(any(),any(),any()))
+            .thenReturn(Either.left(any()));
 
         try {
             componentInstanceBusinessLogic.createOrUpdatePropertiesValues(
@@ -487,7 +540,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testDeleteForwardingPathsWhenComponentinstanceDeleted() {
+    void testDeleteForwardingPathsWhenComponentinstanceDeleted() {
 
         ComponentTypeEnum containerComponentType = ComponentTypeEnum.findByParamName("services");
         String containerComponentID = "Service-comp";
@@ -501,7 +554,7 @@ public class ComponentInstanceBusinessLogicTest {
         component.addForwardingPath(createPath("Path2", "NodeA2", "NodeB2", "2"));
         when(toscaOperationFacade.getToscaElement(eq(containerComponentID), any(ComponentParametersView.class)))
             .thenReturn(Either.left(component));
-        when(toscaOperationFacade.getToscaElement(eq(containerComponentID))).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getToscaElement(containerComponentID)).thenReturn(Either.left(component));
         when(forwardingPathOperation.deleteForwardingPath(any(Service.class), anySet()))
             .thenReturn(Either.left(new HashSet<>()));
         final ComponentInstance ci = new ComponentInstance();
@@ -509,12 +562,11 @@ public class ComponentInstanceBusinessLogicTest {
         ComponentInstance responseFormatEither = componentInstanceBusinessLogic
             .deleteForwardingPathsRelatedTobeDeletedComponentInstance(
                 containerComponentID, containerComponentType, ci);
-        assertThat(!responseFormatEither.isEmpty()).isEqualTo(true);
-
+        assertFalse(responseFormatEither.isEmpty());
     }
 
     @Test
-    public void testAddComponentInstanceDeploymentArtifacts() {
+    void testAddComponentInstanceDeploymentArtifacts() {
 
         Component containerComponent = new Service();
         ComponentInstance componentInstance = new ComponentInstance();
@@ -542,7 +594,6 @@ public class ComponentInstanceBusinessLogicTest {
         finalDeploymentArtifacts.put(deploymentArtifact3.getArtifactLabel(), deploymentArtifact3);
         finalDeploymentArtifacts.put(heatEnvPlaceHolder.getArtifactLabel(), heatEnvPlaceHolder);
         finalDeploymentArtifacts.put(heatEnvPlaceHolder2.getArtifactLabel(), heatEnvPlaceHolder2);
-
         when(artifactsBusinessLogic.getArtifacts(componentInstance.getComponentUid(), NodeTypeEnum.Resource,
             ArtifactGroupTypeEnum.DEPLOYMENT, null)).thenReturn(getResourceDeploymentArtifacts);
         when(artifactsBusinessLogic.createHeatEnvPlaceHolder(new ArrayList<>(),
@@ -554,10 +605,12 @@ public class ComponentInstanceBusinessLogicTest {
             NodeTypeEnum.ResourceInstance, componentInstance.getName(), user, containerComponent,
             null)).thenReturn(heatEnvPlaceHolder2);
 
+        componentInstanceBusinessLogic.setToscaOperationFacade(toscaOperationFacade);
         when(toscaOperationFacade.addDeploymentArtifactsToInstance(containerComponent.getUniqueId(), componentInstance,
             finalDeploymentArtifacts)).thenReturn(StorageOperationStatus.OK);
         when(toscaOperationFacade
-            .addGroupInstancesToComponentInstance(containerComponent, componentInstance, null, new HashMap<>()))
+            .addGroupInstancesToComponentInstance(containerComponent, componentInstance, new ArrayList<>(),
+                new HashMap<>()))
             .thenReturn(StorageOperationStatus.OK);
         when(toscaOperationFacade
             .addInformationalArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, null))
@@ -585,6 +638,7 @@ public class ComponentInstanceBusinessLogicTest {
         artifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
         artifactDefinition.setEsId("esId" + artifactLabel);
         artifactDefinition.setArtifactType(artifactType);
+        artifactDefinition.setArtifactName("artifactName");
         return artifactDefinition;
     }
 
@@ -626,7 +680,6 @@ public class ComponentInstanceBusinessLogicTest {
         return forwardingPaths;
     }
 
-    @SuppressWarnings("unchecked")
     private void getServiceRelationByIdSuccess(Component component) {
         Either<Component, StorageOperationStatus> getComponentRes = Either.left(component);
         when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
@@ -639,18 +692,16 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     private void getServiceRelationByIdUserValidationFailure(Component component) {
-        when(userValidations.validateUserExists(eq(USER_ID)))
-            .thenThrow(new ByActionStatusComponentException(ActionStatus.USER_NOT_FOUND));
+        doThrow(new ByActionStatusComponentException(ActionStatus.USER_NOT_FOUND)).when(userValidations).validateUserExists(USER_ID);
         try {
             componentInstanceBusinessLogic
                 .getRelationById(COMPONENT_ID, RELATION_ID, USER_ID, component.getComponentType());
         } catch (ByActionStatusComponentException e) {
-            assertSame(e.getActionStatus(), ActionStatus.USER_NOT_FOUND);
+            assertSame(ActionStatus.USER_NOT_FOUND, e.getActionStatus());
         }
     }
 
     private void getRelationByIdComponentNotFoundFailure(Component component) {
-        Either<User, ActionStatus> eitherCreator = Either.left(user);
         Either<Component, StorageOperationStatus> getComponentRes = Either.right(StorageOperationStatus.NOT_FOUND);
         when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
             .thenReturn(getComponentRes);
@@ -663,8 +714,9 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     private void stubMethods() {
-        when(userValidations.validateUserExists(eq(USER_ID))).thenReturn(user);
-        when(componentsUtils
+        Mockito.lenient().when(userValidations.validateUserExists(eq(USER_ID))).thenReturn(user);
+        Mockito.lenient().when(userValidations.isSameUser(eq(USER_ID),eq(USER_ID))).thenReturn(true);
+        Mockito.lenient().when(componentsUtils
             .convertFromStorageResponse(eq(StorageOperationStatus.GENERAL_ERROR), any(ComponentTypeEnum.class)))
             .thenReturn(ActionStatus.GENERAL_ERROR);
     }
@@ -672,12 +724,14 @@ public class ComponentInstanceBusinessLogicTest {
     private void createComponents() {
         createRelation();
         createInstances();
+        createProperties();
+        createInputs();
         createService();
-        createResource();
+        resource = createResource();
     }
 
-    private void createResource() {
-        resource = new Resource();
+    private Resource createResource() {
+        final Resource resource = new Resource();
         resource.setUniqueId(COMPONENT_ID);
         resource.setComponentInstancesRelations(Lists.newArrayList(relation));
         resource.setComponentInstances(Lists.newArrayList(toInstance, fromInstance));
@@ -685,6 +739,7 @@ public class ComponentInstanceBusinessLogicTest {
         resource.setRequirements(fromInstance.getRequirements());
         resource.setComponentType(ComponentTypeEnum.RESOURCE);
         resource.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+        return resource;
     }
 
     private void createService() {
@@ -696,6 +751,15 @@ public class ComponentInstanceBusinessLogicTest {
         service.setRequirements(fromInstance.getRequirements());
         service.setComponentType(ComponentTypeEnum.SERVICE);
         service.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+        service.setLastUpdaterUserId(USER_ID);
+
+        Map<String, List<ComponentInstanceProperty>> ciPropertyMap = new HashMap<>();
+        ciPropertyMap.put(TO_INSTANCE_ID, ciPropertyList);
+        service.setComponentInstancesProperties(ciPropertyMap);
+
+        Map<String, List<ComponentInstanceInput>> ciInputMap = new HashMap<>();
+        ciInputMap.put(TO_INSTANCE_ID, ciInputList);
+        service.setComponentInstancesInputs(ciInputMap);
     }
 
     private void createInstances() {
@@ -706,7 +770,7 @@ public class ComponentInstanceBusinessLogicTest {
         fromInstance = new ComponentInstance();
         fromInstance.setUniqueId(FROM_INSTANCE_ID);
 
-        capability = new CapabilityDataDefinition();
+        CapabilityDataDefinition capability = new CapabilityDataDefinition();
         capability.setOwnerId(CAPABILITY_OWNER_ID);
         capability.setUniqueId(CAPABILITY_UID);
         capability.setName(CAPABILITY_NAME);
@@ -718,7 +782,7 @@ public class ComponentInstanceBusinessLogicTest {
         capabilityDefinition.setProperties(properties);
         capabilities.put(capability.getName(), Lists.newArrayList(capabilityDefinition));
 
-        requirement = new RequirementDataDefinition();
+        RequirementDataDefinition requirement = new RequirementDataDefinition();
         requirement.setOwnerId(REQUIREMENT_OWNER_ID);
         requirement.setUniqueId(REQUIREMENT_UID);
         requirement.setName(REQUIREMENT_NAME);
@@ -729,6 +793,7 @@ public class ComponentInstanceBusinessLogicTest {
 
         toInstance.setCapabilities(capabilities);
         fromInstance.setRequirements(requirements);
+
     }
 
     private void createRelation() {
@@ -754,12 +819,43 @@ public class ComponentInstanceBusinessLogicTest {
         relationInfo.setRelationships(relationshipImpl);
     }
 
+    private void createProperties() {
+        // Create GetInputValueData
+        GetInputValueDataDefinition inputValueDef = new GetInputValueDataDefinition();
+        inputValueDef.setInputId(INPUT_ID);
+        List<GetInputValueDataDefinition> inputValueDefList = new ArrayList<>();
+        inputValueDefList.add(inputValueDef);
+        // Create ComponentInstanceProperty
+        ComponentInstanceProperty ciProperty = new ComponentInstanceProperty();
+        ciProperty.setGetInputValues(inputValueDefList);
+        ciProperty.setName(PROP_NAME);
+        // Create ComponentInstanceProperty list
+        ciPropertyList = new ArrayList<>();
+        ciPropertyList.add(ciProperty);
+    }
+
+    private void createInputs() {
+        // Create GetInputValueData
+        GetInputValueDataDefinition inputValueDef = new GetInputValueDataDefinition();
+        inputValueDef.setInputId(INPUT_ID);
+        List<GetInputValueDataDefinition> inputValueDefList = new ArrayList<>();
+        inputValueDefList.add(inputValueDef);
+        // Create ComponentInstanceInput
+        ComponentInstanceInput ciInput = new ComponentInstanceInput();
+        ciInput.setUniqueId(INPUT_ID);
+        ciInput.setName(PROP_NAME);
+        ciInput.setGetInputValues(inputValueDefList);
+        // Create ComponentInstanceInput list
+        ciInputList = new ArrayList<>();
+        ciInputList.add(ciInput);
+    }
+
     private ComponentInstanceBusinessLogic createTestSubject() {
         return componentInstanceBusinessLogic;
     }
 
     @Test
-    public void testChangeServiceProxyVersion() {
+    void testChangeServiceProxyVersion() {
         ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
 
         Either<ComponentInstance, ResponseFormat> result;
@@ -771,7 +867,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testCreateServiceProxy() {
+    void testCreateServiceProxy() {
         ComponentInstanceBusinessLogic testSubject;
         Either<ComponentInstance, ResponseFormat> result;
 
@@ -782,7 +878,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testDeleteServiceProxy() {
+    void testDeleteServiceProxy() {
         ComponentInstanceBusinessLogic testSubject;
 
         Either<ComponentInstance, ResponseFormat> result;
@@ -794,33 +890,54 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testGetComponentInstanceInputsByInputId() {
-        ComponentInstanceBusinessLogic testSubject;
+    void testGetComponentInstanceInputsByInputIdEmpty() {
         Component component = new Service();
         String inputId = "";
         List<ComponentInstanceInput> result;
 
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getComponentInstanceInputsByInputId(component, inputId);
+        result = componentInstanceBusinessLogic.getComponentInstanceInputsByInputId(component, inputId);
         assertNotNull(result);
+        assertThat(result.isEmpty()).isTrue();
     }
 
     @Test
-    public void testGetComponentInstancePropertiesByInputId() {
-        ComponentInstanceBusinessLogic testSubject;
+    void testGetComponentInstanceInputsByInputIdPresent() {
+        List<ComponentInstanceInput> result;
+
+        result = componentInstanceBusinessLogic.getComponentInstanceInputsByInputId(service, INPUT_ID);
+        assertNotNull(result);
+        assertThat(result.isEmpty()).isFalse();
+        assertThat(result.size()).isOne();
+        ComponentInstanceInput resultInput = result.get(0);
+        assertThat(resultInput.getComponentInstanceId()).isEqualTo(TO_INSTANCE_ID);
+        assertThat(resultInput.getComponentInstanceName()).isEqualTo(TO_INSTANCE_NAME);
+    }
+
+    @Test
+    void testGetComponentInstancePropertiesByInputIdEmpty() {
         Component component = new Service();
         String inputId = "";
         List<ComponentInstanceProperty> result;
 
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getComponentInstancePropertiesByInputId(component, inputId);
+        result = componentInstanceBusinessLogic.getComponentInstancePropertiesByInputId(component, inputId);
         assertNotNull(result);
+        assertThat(result.isEmpty()).isTrue();
     }
 
     @Test
-    public void testGetRelationById() {
+    void testGetComponentInstancePropertiesByInputIdPresent() {
+        List<ComponentInstanceProperty> result;
+
+        result = componentInstanceBusinessLogic.getComponentInstancePropertiesByInputId(service, INPUT_ID);
+        assertNotNull(result);
+        assertThat(result.size()).isOne();
+        ComponentInstanceProperty resultProperty = result.get(0);
+        assertThat(resultProperty.getComponentInstanceId()).isEqualTo(TO_INSTANCE_ID);
+        assertThat(resultProperty.getComponentInstanceName()).isEqualTo(TO_INSTANCE_NAME);
+    }
+
+    @Test
+    void testGetRelationById() {
         ComponentInstanceBusinessLogic testSubject;
         String componentId = "";
         String relationId = "";
@@ -835,20 +952,20 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testValidateParent() {
+    void testValidateParent() {
         ComponentInstanceBusinessLogic testSubject;
-        createResource();
+        resource = createResource();
         String nodeTemplateId = "";
         boolean result;
 
         // default test
         testSubject = createTestSubject();
         result = Deencapsulation.invoke(testSubject, "validateParent", new Object[]{resource, nodeTemplateId});
-        assertNotNull(result);
+        assertFalse(result);
     }
 
     @Test
-    public void testGetComponentType() {
+    void testGetComponentType() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentTypeEnum result;
 
@@ -859,7 +976,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testGetNewGroupName() {
+    void testGetNewGroupName() {
         ComponentInstanceBusinessLogic testSubject;
         String oldPrefix = "";
         String newNormailzedPrefix = "";
@@ -874,10 +991,9 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testUpdateComponentInstanceMetadata_3() {
+    void testUpdateComponentInstanceMetadata_3() {
         ComponentInstanceBusinessLogic testSubject;
         createInstances();
-        ComponentInstance newComponentInstance = null;
         ComponentInstance result;
 
         // default test
@@ -888,7 +1004,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testFindRelation() throws Exception {
+    void testFindRelation() {
         ComponentInstanceBusinessLogic testSubject;
         String relationId = "";
         List<RequirementCapabilityRelDef> requirementCapabilityRelations = new ArrayList<>();
@@ -898,13 +1014,14 @@ public class ComponentInstanceBusinessLogicTest {
         testSubject = createTestSubject();
         result = Deencapsulation.invoke(testSubject, "findRelation",
             new Object[]{relationId, requirementCapabilityRelations});
+        assertNull(result);
     }
 
     @Test
-    public void testCreateOrUpdatePropertiesValues() throws Exception {
+    void testCreateOrUpdatePropertiesValues() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.RESOURCE;
-        createResource();
+        resource = createResource();
         String componentId = resource.getUniqueId();
         String resourceInstanceId = "";
         List<ComponentInstanceProperty> properties = new ArrayList<>();
@@ -934,11 +1051,11 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testUpdateCapabilityPropertyOnContainerComponent() throws Exception {
+    void testUpdateCapabilityPropertyOnContainerComponent() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentInstanceProperty property = new ComponentInstanceProperty();
         String newValue = "";
-        createResource();
+        resource = createResource();
         createInstances();
         String capabilityType = "";
         String capabilityName = "";
@@ -948,13 +1065,14 @@ public class ComponentInstanceBusinessLogicTest {
         testSubject = createTestSubject();
         result = Deencapsulation.invoke(testSubject, "updateCapabilityPropertyOnContainerComponent",
             new Object[]{property, newValue, resource, toInstance, capabilityType, capabilityName});
+        assertNull(result);
     }
 
     @Test
-    public void testCreateOrUpdateInstanceInputValues() throws Exception {
+    void testCreateOrUpdateInstanceInputValues() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.RESOURCE;
-        createResource();
+        resource = createResource();
         String componentId = resource.getUniqueId();
         String resourceInstanceId = "";
         List<ComponentInstanceInput> inputs = new ArrayList<>();
@@ -983,10 +1101,10 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testCreateOrUpdateGroupInstancePropertyValue() throws Exception {
+    void testCreateOrUpdateGroupInstancePropertyValue() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.RESOURCE;
-        createResource();
+        resource = createResource();
         String componentId = resource.getUniqueId();
         String resourceInstanceId = "";
         String groupInstanceId = "";
@@ -1016,7 +1134,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testDeletePropertyValue() throws Exception {
+    void testDeletePropertyValue() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.RESOURCE;
         createService();
@@ -1045,7 +1163,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testGetComponentParametersViewForForwardingPath() throws Exception {
+    void testGetComponentParametersViewForForwardingPath() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentParametersView result;
 
@@ -1056,9 +1174,9 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testGetResourceInstanceById() throws Exception {
+    void testGetResourceInstanceById() {
         ComponentInstanceBusinessLogic testSubject;
-        createResource();
+        resource = createResource();
         String instanceId = "";
         Either<ComponentInstance, StorageOperationStatus> result;
 
@@ -1069,10 +1187,10 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testUpdateInstanceCapabilityProperties_1() throws Exception {
+    void testUpdateInstanceCapabilityProperties_1() {
         ComponentInstanceBusinessLogic testSubject;
         ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.RESOURCE;
-        createResource();
+        resource = createResource();
         String containerComponentId = resource.getUniqueId();
         String componentInstanceUniqueId = "";
         String capabilityType = "";
@@ -1095,7 +1213,37 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testCopyComponentInstanceWrongUserId() {
+    void testUpdateInstanceRequirement() {
+        ComponentInstanceBusinessLogic testSubject;
+        ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.RESOURCE;
+        createComponents();
+        String userId = "userId";
+        resource.setLastUpdaterUserId(userId);
+        String containerComponentId = resource.getUniqueId();
+        String componentInstanceUniqueId = TO_INSTANCE_ID;
+        String capabilityType = "";
+        String capabilityName = "";
+        RequirementDefinition requirementDef = new RequirementDefinition();
+
+        Either<RequirementDefinition, ResponseFormat> result;
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId)).thenReturn(Either.left(resource));
+        testSubject = createTestSubject();
+        when(toscaOperationFacade.updateComponentInstanceRequirement(containerComponentId, TO_INSTANCE_ID, requirementDef)).thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(resource)).thenReturn(Either.left(resource));
+        when(graphLockOperation.unlockComponent(Mockito.anyString(), eq(NodeTypeEnum.Resource)))
+            .thenReturn(StorageOperationStatus.OK);
+        when(graphLockOperation.lockComponent(Mockito.anyString(), eq(NodeTypeEnum.Resource)))
+            .thenReturn(StorageOperationStatus.OK);
+
+        result = testSubject.updateInstanceRequirement(componentTypeEnum, containerComponentId,
+            componentInstanceUniqueId, requirementDef, userId);
+        assertEquals(requirementDef, result.left().value());
+
+    }
+
+    @Test
+    void testCopyComponentInstanceWrongUserId() {
 
         Either<Map<String, ComponentInstance>, ResponseFormat> result;
         ComponentInstance inputComponentInstance = createComponetInstanceFromComponent(resource);
@@ -1124,7 +1272,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testCopyComponentInstanceComponentWrongState() {
+    void testCopyComponentInstanceComponentWrongState() {
         Either<Map<String, ComponentInstance>, ResponseFormat> result;
         ComponentInstance inputComponentInstance = createComponetInstanceFromComponent(resource);
         String containerComponentId = service.getUniqueId();
@@ -1141,7 +1289,6 @@ public class ComponentInstanceBusinessLogicTest {
             .thenReturn(StorageOperationStatus.OK);
         when(graphLockOperation.lockComponent(Mockito.anyString(), eq(NodeTypeEnum.Service)))
             .thenReturn(StorageOperationStatus.OK);
-        Either<Component, StorageOperationStatus> getComponentRes = Either.left(resource);
         result = componentInstanceBusinessLogic
             .copyComponentInstance(inputComponentInstance, containerComponentId, componentInstanceId, USER_ID);
         assertNotNull(result);
@@ -1150,7 +1297,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testCopyComponentInstance() {
+    void testCopyComponentInstance() {
         Either<Map<String, ComponentInstance>, ResponseFormat> result;
         ComponentInstance inputComponentInstance = createComponetInstanceFromComponent(resource);
         String containerComponentId = service.getUniqueId();
@@ -1168,12 +1315,6 @@ public class ComponentInstanceBusinessLogicTest {
             .thenReturn(StorageOperationStatus.OK);
         when(graphLockOperation.lockComponent(Mockito.anyString(), eq(NodeTypeEnum.Service)))
             .thenReturn(StorageOperationStatus.OK);
-        Either<Component, StorageOperationStatus> getComponentRes = Either.left(resource);
-        ImmutablePair<Component, String> pair = new ImmutablePair<>(resource, TO_INSTANCE_ID);
-        Either<ImmutablePair<Component, String>, StorageOperationStatus> result2 = Either.left(pair);
-        Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getResourceDeploymentArtifacts = Either
-            .left(new HashMap<String, ArtifactDefinition>());
-        StorageOperationStatus artStatus = StorageOperationStatus.OK;
 
         result = componentInstanceBusinessLogic
             .copyComponentInstance(inputComponentInstance, containerComponentId, componentInstanceId,
@@ -1183,26 +1324,23 @@ public class ComponentInstanceBusinessLogicTest {
         service.setLastUpdaterUserId(oldServiceLastUpdatedUserId);
         resource.setLifecycleState(oldResourceLifeCycle);
 
-        assertThat(result.isLeft());
+        assertThat(result.isLeft()).isFalse();
     }
 
     @Test
-    public void testCreateOrUpdateAttributeValueForCopyPaste() {
+    void testCreateOrUpdateAttributeValueForCopyPaste() {
         ComponentInstance serviceComponentInstance = createComponetInstanceFromComponent(service);
-        ComponentInstanceProperty attribute = new ComponentInstanceProperty();
+        ComponentInstanceAttribute attribute = new ComponentInstanceAttribute();
         attribute.setType("string");
         attribute.setUniqueId("testCreateOrUpdateAttributeValueForCopyPaste");
-        SchemaDefinition def = Mockito.mock(SchemaDefinition.class);
-        attribute.setSchema(def);
         LifecycleStateEnum oldLifeCycleState = service.getLifecycleState();
         String oldLastUpdatedUserId = service.getLastUpdaterUserId();
         service.setLastUpdaterUserId(USER_ID);
         service.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
 
-        Map<String, List<ComponentInstanceProperty>> instAttrsMap =
-            new HashMap<String, List<ComponentInstanceProperty>>();
-        List<ComponentInstanceProperty> instAttrsList = new ArrayList<ComponentInstanceProperty>();
-        ComponentInstanceProperty prop = new ComponentInstanceProperty();
+        Map<String, List<ComponentInstanceAttribute>> instAttrsMap = new HashMap<>();
+        List<ComponentInstanceAttribute> instAttrsList = new ArrayList<>();
+        ComponentInstanceAttribute prop = new ComponentInstanceAttribute();
         prop.setUniqueId(attribute.getUniqueId());
         instAttrsList.add(prop);
         instAttrsMap.put(toInstance.getUniqueId(), instAttrsList);
@@ -1216,7 +1354,7 @@ public class ComponentInstanceBusinessLogicTest {
         when(toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(service))
             .thenReturn(serviceEitherLeft);
 
-        Either<ComponentInstanceProperty, ResponseFormat> result = Deencapsulation
+        Either<ComponentInstanceAttribute, ResponseFormat> result = Deencapsulation
             .invoke(componentInstanceBusinessLogic,
                 "createOrUpdateAttributeValueForCopyPaste",
                 ComponentTypeEnum.SERVICE,
@@ -1230,13 +1368,13 @@ public class ComponentInstanceBusinessLogicTest {
         service.setLifecycleState(oldLifeCycleState);
 
         assertThat(result.isLeft()).isTrue();
-        ComponentInstanceProperty resultProp = result.left().value();
-        assertEquals(resultProp.getPath().size(), 1);
+        ComponentInstanceAttribute resultProp = result.left().value();
+        assertEquals(1, resultProp.getPath().size());
         assertEquals(resultProp.getPath().get(0), toInstance.getUniqueId());
     }
 
     @Test
-    public void testUpdateComponentInstanceProperty() {
+    void testUpdateComponentInstanceProperty() {
 
         String containerComponentId = service.getUniqueId();
         String componentInstanceId = "dummy_id";
@@ -1258,11 +1396,11 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testGetInputListDefaultValue() {
+    void testGetInputListDefaultValue() {
         Component component = service;
         String inputId = "dummy_id";
         String defaultValue = "dummy_default_value";
-        List<InputDefinition> newInputs = new ArrayList<InputDefinition>();
+        List<InputDefinition> newInputs = new ArrayList<>();
         InputDefinition in = new InputDefinition();
         in.setUniqueId(inputId);
         in.setDefaultValue(defaultValue);
@@ -1279,20 +1417,19 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testBatchDeleteComponentInstanceFailureWrongType() {
+    void testBatchDeleteComponentInstanceFailureWrongType() {
         Map<String, List<String>> result;
         List<String> componentInstanceIdList = new ArrayList<>();
         String containerComponentParam = "WRONG_TYPE";
         String containerComponentId = "containerComponentId";
         String componentInstanceId = "componentInstanceId";
         componentInstanceIdList.add(componentInstanceId);
-        String userId = USER_ID;
         Map<String, List<String>> deleteErrorMap = new HashMap<>();
         List<String> deleteErrorIds = new ArrayList<>();
         deleteErrorIds.add(componentInstanceId);
         deleteErrorMap.put("deleteFailedIds", deleteErrorIds);
         Either<Component, StorageOperationStatus> cont = Either.left(service);
-        when(componentsUtils.convertFromStorageResponse(eq(StorageOperationStatus.NOT_FOUND), eq(null)))
+        when(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, null))
             .thenReturn(ActionStatus.GENERAL_ERROR);
         when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class)))
             .thenReturn(cont);
@@ -1300,7 +1437,7 @@ public class ComponentInstanceBusinessLogicTest {
         try {
             result = componentInstanceBusinessLogic
                 .batchDeleteComponentInstance(containerComponentParam, containerComponentId, componentInstanceIdList,
-                    userId);
+                    USER_ID);
             assertNotNull(result);
             assertEquals(deleteErrorMap, result);
         } catch (ComponentException e) {
@@ -1309,14 +1446,12 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testBatchDeleteComponentInstanceFailureCompIds() {
-        Map<String, List<String>> result = new HashMap<>();
+    void testBatchDeleteComponentInstanceFailureCompIds() {
         String containerComponentParam = ComponentTypeEnum.SERVICE_PARAM_NAME;
         String containerComponentId = "containerComponentId";
         String componentInstanceId = "componentInstanceId";
         List<String> componentInstanceIdList = new ArrayList<>();
         componentInstanceIdList.add(componentInstanceId);
-        String userId = USER_ID;
         Map<String, List<String>> deleteErrorMap = new HashMap<>();
         List<String> deleteErrorIds = new ArrayList<>();
         deleteErrorIds.add(componentInstanceId);
@@ -1327,9 +1462,8 @@ public class ComponentInstanceBusinessLogicTest {
             .thenReturn(err);
 
         try {
-            result = componentInstanceBusinessLogic
-                .batchDeleteComponentInstance(containerComponentParam, containerComponentId, componentInstanceIdList,
-                    userId);
+            Map<String, List<String>> result = componentInstanceBusinessLogic.batchDeleteComponentInstance(
+                containerComponentParam, containerComponentId, componentInstanceIdList, USER_ID);
             assertNotNull(result);
             assertEquals(deleteErrorMap, result);
         } catch (ComponentException e) {
@@ -1338,7 +1472,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testBatchDeleteComponentInstanceSuccess() {
+    void testBatchDeleteComponentInstanceSuccess() {
         Map<String, List<String>> result;
         String containerComponentParam = ComponentTypeEnum.SERVICE_PARAM_NAME;
         LifecycleStateEnum oldLifeCycleState = service.getLifecycleState();
@@ -1347,7 +1481,6 @@ public class ComponentInstanceBusinessLogicTest {
         service.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
         String containerComponentId = service.getUniqueId();
         String componentInstanceId = TO_INSTANCE_ID;
-        String userId = USER_ID;
         List<String> componentInstanceIdList = new ArrayList<>();
         componentInstanceIdList.add(componentInstanceId);
         Map<String, List<String>> deleteErrorMap = new HashMap<>();
@@ -1369,7 +1502,7 @@ public class ComponentInstanceBusinessLogicTest {
 
         result = componentInstanceBusinessLogic
             .batchDeleteComponentInstance(containerComponentParam, containerComponentId,
-                componentInstanceIdList, userId);
+                componentInstanceIdList, USER_ID);
         assertNotNull(result);
 
         service.setLastUpdaterUserId(oldLastUpdatedUserId);
@@ -1378,7 +1511,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testDissociateRIFromRIFailDissociate() {
+    void testDissociateRIFromRIFailDissociate() {
 
         List<RequirementCapabilityRelDef> result;
         RequirementCapabilityRelDef ref = new RequirementCapabilityRelDef();
@@ -1395,7 +1528,6 @@ public class ComponentInstanceBusinessLogicTest {
         requirementDefList.add(ref);
         ComponentTypeEnum componentTypeEnum = service.getComponentType();
         String componentId = service.getUniqueId();
-        String userId = USER_ID;
         LifecycleStateEnum oldLifeCycleState = service.getLifecycleState();
         String oldLastUpdatedUserId = service.getLastUpdaterUserId();
         service.setLastUpdaterUserId(USER_ID);
@@ -1410,13 +1542,13 @@ public class ComponentInstanceBusinessLogicTest {
             .thenReturn(StorageOperationStatus.OK);
         Either<RequirementCapabilityRelDef, StorageOperationStatus> resultEither;
         resultEither = Either.right(StorageOperationStatus.OK);
-        when(componentsUtils.convertFromStorageResponseForResourceInstance(eq(StorageOperationStatus.OK), eq(true)))
+        when(componentsUtils.convertFromStorageResponseForResourceInstance(StorageOperationStatus.OK, true))
             .thenReturn(ActionStatus.GENERAL_ERROR);
         when(toscaOperationFacade.dissociateResourceInstances(componentId, ref)).thenReturn(resultEither);
 
         try {
             result = componentInstanceBusinessLogic
-                .batchDissociateRIFromRI(componentId, userId, requirementDefList, componentTypeEnum);
+                .batchDissociateRIFromRI(componentId, USER_ID, requirementDefList, componentTypeEnum);
             assertNotNull(result);
             assertEquals(new ArrayList<>(), result);
         } catch (ComponentException e) {
@@ -1429,7 +1561,7 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testDissociateRIFromRISuccess() {
+    void testDissociateRIFromRISuccess() {
 
         List<RequirementCapabilityRelDef> result;
         RequirementCapabilityRelDef ref = new RequirementCapabilityRelDef();
@@ -1437,7 +1569,6 @@ public class ComponentInstanceBusinessLogicTest {
         requirementDefList.add(ref);
         ComponentTypeEnum componentTypeEnum = service.getComponentType();
         String componentId = service.getUniqueId();
-        String userId = USER_ID;
         LifecycleStateEnum oldLifeCycleState = service.getLifecycleState();
         String oldLastUpdatedUserId = service.getLastUpdaterUserId();
         service.setLastUpdaterUserId(USER_ID);
@@ -1455,7 +1586,7 @@ public class ComponentInstanceBusinessLogicTest {
         when(toscaOperationFacade.dissociateResourceInstances(componentId, ref)).thenReturn(resultEither);
 
         result = componentInstanceBusinessLogic
-            .batchDissociateRIFromRI(componentId, userId, requirementDefList, componentTypeEnum);
+            .batchDissociateRIFromRI(componentId, USER_ID, requirementDefList, componentTypeEnum);
         assertNotNull(result);
 
         service.setLastUpdaterUserId(oldLastUpdatedUserId);
@@ -1465,16 +1596,16 @@ public class ComponentInstanceBusinessLogicTest {
     }
 
     @Test
-    public void testGetComponentInstancePropertyByPolicyId_success() {
+    void testGetComponentInstancePropertyByPolicyId_success() {
         Optional<ComponentInstanceProperty> propertyCandidate =
             getComponentInstanceProperty(PROP_NAME);
 
-        assertThat(propertyCandidate.isPresent()).isTrue();
-        assertEquals(propertyCandidate.get().getName(), PROP_NAME);
+        assertThat(propertyCandidate).isPresent();
+        assertEquals(PROP_NAME, propertyCandidate.get().getName());
     }
 
     @Test
-    public void testGetComponentInstancePropertyByPolicyId_failure() {
+    void testGetComponentInstancePropertyByPolicyId_failure() {
         Optional<ComponentInstanceProperty> propertyCandidate =
             getComponentInstanceProperty(NON_EXIST_NAME);
 
@@ -1489,14 +1620,14 @@ public class ComponentInstanceBusinessLogicTest {
         componentInstanceProperty.setGetPolicyValues(policyDefinition.getGetPolicyValues());
 
         service.setComponentInstancesProperties(
-            Collections.singletonMap(COMPONENT_INST_ID, Collections.singletonList(componentInstanceProperty)));
+            Collections.singletonMap(COMPONENT_INSTANCE_ID, Collections.singletonList(componentInstanceProperty)));
 
         return componentInstanceBusinessLogic.getComponentInstancePropertyByPolicyId(service, policyDefinition);
     }
 
     private PolicyDefinition getPolicyDefinition() {
         PolicyDefinition policyDefinition = new PolicyDefinition();
-        policyDefinition.setInstanceUniqueId(COMPONENT_INST_ID);
+        policyDefinition.setInstanceUniqueId(COMPONENT_INSTANCE_ID);
         policyDefinition.setName(PROP_NAME);
 
         GetPolicyValueDataDefinition getPolicy = new GetPolicyValueDataDefinition();
@@ -1521,4 +1652,608 @@ public class ComponentInstanceBusinessLogicTest {
         componentInst.setDeploymentArtifacts(component.getDeploymentArtifacts());
         return componentInst;
     }
+
+    // Prepare ComponentInstance & Resource objects used in createComponentInstance() tests
+
+    private Pair<ComponentInstance, Resource> prepareResourcesForCreateComponentInstanceTest() {
+        ComponentInstance instanceToBeCreated = new ComponentInstance();
+        instanceToBeCreated.setName(COMPONENT_INSTANCE_NAME);
+        instanceToBeCreated.setUniqueId(COMPONENT_INSTANCE_ID);
+        instanceToBeCreated.setComponentUid(ORIGIN_COMPONENT_ID);
+        instanceToBeCreated.setOriginType(OriginTypeEnum.VF);
+
+        Resource originComponent = new Resource();
+        originComponent.setLifecycleState(LifecycleStateEnum.CERTIFIED);
+        originComponent.setResourceType(ResourceTypeEnum.VF);
+        originComponent.setVersion(ORIGIN_COMPONENT_VERSION);
+        originComponent.setIcon(ICON_NAME);
+
+        return Pair.of(instanceToBeCreated, originComponent);
+    }
+    // Common part for testing component instance name validation
+
+    private void testCreateComponentInstanceNameValidationFailure(String ciName) {
+        ComponentInstance ci = new ComponentInstance();
+        ci.setName(ciName);
+
+        // Stub for getting component
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+
+        // Expecting ByActionStatusComponentException
+        ByActionStatusComponentException e = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        assertEquals(ActionStatus.INVALID_COMPONENT_NAME, e.getActionStatus());
+    }
+    @TestFactory
+    Iterable<DynamicTest> testCreateComponentInstanceNameValidationFailureFactory() {
+        String longName = String.join("", Collections.nCopies(ValidationUtils.COMPONENT_NAME_MAX_LENGTH + 1, "x"));
+        String invalidName = "componentInstance#name";
+        return Arrays.asList(
+            dynamicTest("instance name is empty", () ->
+                testCreateComponentInstanceNameValidationFailure("")),
+            dynamicTest("instance name is too long", () ->
+                testCreateComponentInstanceNameValidationFailure(longName)),
+            dynamicTest("instance name includes invalid character", () ->
+                testCreateComponentInstanceNameValidationFailure(invalidName))
+        );
+    }
+
+    @Test
+    void testCreateComponentInstanceFailToGetComponent() {
+        ComponentInstance ci = prepareResourcesForCreateComponentInstanceTest().getLeft();
+
+        // Stub for getting component
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+        when(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, ComponentTypeEnum.RESOURCE))
+            .thenReturn(ActionStatus.RESOURCE_NOT_FOUND);
+
+        ByActionStatusComponentException e = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        assertThat(e.getActionStatus()).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
+    }
+
+    @Test
+    void testCreateComponentInstanceFailureInvalidState() {
+        Pair<ComponentInstance, Resource> p = prepareResourcesForCreateComponentInstanceTest();
+        ComponentInstance ci = p.getLeft();
+        Resource originComponent = p.getRight();
+        originComponent.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        // Stub for getting component
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+
+        ByActionStatusComponentException e = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        assertThat(e.getActionStatus()).isEqualTo(ActionStatus.CONTAINER_CANNOT_CONTAIN_COMPONENT_IN_STATE);
+    }
+
+    @Test
+    void testCreateComponentInstanceFailureArchived() {
+        Pair<ComponentInstance, Resource> p = prepareResourcesForCreateComponentInstanceTest();
+        ComponentInstance ci = p.getLeft();
+        Resource originComponent = p.getRight();
+        originComponent.setArchived(Boolean.TRUE);
+
+        // Stub for getting component
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+
+        ByActionStatusComponentException e = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        assertThat(e.getActionStatus()).isEqualTo(ActionStatus.COMPONENT_IS_ARCHIVED);
+    }
+
+    @Test
+    void testCreateComponentInstanceFailureInvalidOriginType() {
+        Pair<ComponentInstance, Resource> p = prepareResourcesForCreateComponentInstanceTest();
+        ComponentInstance ci = p.getLeft();
+        Resource originComponent = p.getRight();
+        ci.setOriginType(OriginTypeEnum.VFC); // Set different type from origin
+
+        // Stub for getting component
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+
+        final ByActionStatusComponentException e = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        assertThat(e.getActionStatus()).isEqualTo(ActionStatus.INVALID_CONTENT);
+    }
+
+    @Test
+    void testCreateComponentInstanceFailureCannotContainInstance() {
+        final Pair<ComponentInstance, Resource> p = prepareResourcesForCreateComponentInstanceTest();
+        final ComponentInstance ci = p.getLeft();
+        final Resource originComponent = p.getRight();
+
+        // Stub for getting component
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+        // Assume services cannot contain VF resource
+        when(containerInstanceTypeData.isAllowedForServiceComponent(ResourceTypeEnum.VF, null))
+            .thenReturn(false);
+
+        ByActionStatusComponentException actualException = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        assertThat(actualException.getActionStatus()).isEqualTo(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE);
+        verify(containerInstanceTypeData, times(1)).isAllowedForServiceComponent(ResourceTypeEnum.VF, null);
+
+        //given
+        final Resource resource = createResource();
+        resource.setResourceType(ResourceTypeEnum.VF);
+        resource.setLastUpdaterUserId(USER_ID);
+        //when
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(resource));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+        when(containerInstanceTypeData.isAllowedForResourceComponent(ResourceTypeEnum.VF, ResourceTypeEnum.VF))
+            .thenReturn(false);
+        actualException = assertThrows(ByActionStatusComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(RESOURCE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        //then
+        assertThat(actualException.getActionStatus()).isEqualTo(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE);
+    }
+
+    @Test
+    void testCreateComponentInstanceFailureAddToGraph() {
+        final Pair<ComponentInstance, Resource> p = prepareResourcesForCreateComponentInstanceTest();
+        final ComponentInstance ci = p.getLeft();
+        final Resource originComponent = p.getRight();
+
+        // TODO Refactor createComponentInstance() method and reduce these mocks
+        //      not to target the internal details too much
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+        when(containerInstanceTypeData.isAllowedForServiceComponent(ResourceTypeEnum.VF, null))
+            .thenReturn(true);
+        Mockito.doNothing().when(compositionBusinessLogic).validateAndSetDefaultCoordinates(ci);
+        when(graphLockOperation.lockComponent(COMPONENT_ID, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.addComponentInstanceToTopologyTemplate(service, originComponent, ci, false, user))
+            .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
+        when(componentsUtils.convertFromStorageResponseForResourceInstance(StorageOperationStatus.BAD_REQUEST, true))
+            .thenReturn(ActionStatus.INVALID_CONTENT);
+        when(componentsUtils.getResponseFormatForResourceInstance(ActionStatus.INVALID_CONTENT, "", null))
+            .thenReturn(new ResponseFormat());
+        when(janusGraphDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
+        when(graphLockOperation.unlockComponent(COMPONENT_ID, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+
+        assertThrows(ByResponseFormatComponentException.class, () -> {
+            componentInstanceBusinessLogic.createComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, ci);
+        });
+        verify(containerInstanceTypeData, times(1))
+            .isAllowedForServiceComponent(ResourceTypeEnum.VF, null);
+        verify(compositionBusinessLogic, times(1)).validateAndSetDefaultCoordinates(ci);
+        verify(toscaOperationFacade, times(1))
+            .addComponentInstanceToTopologyTemplate(service, originComponent, ci, false, user);
+        verify(graphLockOperation, times(1)).unlockComponent(COMPONENT_ID, NodeTypeEnum.Service);
+    }
+
+    @Test
+    void testCreateComponentInstanceSuccess() {
+        final Pair<ComponentInstance, Resource> p = prepareResourcesForCreateComponentInstanceTest();
+        final ComponentInstance instanceToBeCreated = p.getLeft();
+        final Resource originComponent = p.getRight();
+
+        final Service updatedService = new Service();
+        updatedService.setComponentInstances(Collections.singletonList(instanceToBeCreated));
+        updatedService.setUniqueId(service.getUniqueId());
+
+        // TODO Refactor createComponentInstance() method and reduce these mocks
+        //      not to target the internal details too much
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originComponent));
+        when(containerInstanceTypeData.isAllowedForServiceComponent(ResourceTypeEnum.VF, null))
+            .thenReturn(true);
+        Mockito.doNothing().when(compositionBusinessLogic).validateAndSetDefaultCoordinates(instanceToBeCreated);
+        when(graphLockOperation.lockComponent(COMPONENT_ID, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.addComponentInstanceToTopologyTemplate(service, originComponent, instanceToBeCreated, false, user))
+            .thenReturn(Either.left(new ImmutablePair<>(updatedService, COMPONENT_INSTANCE_ID)));
+        when(artifactsBusinessLogic.getArtifacts(
+            ORIGIN_COMPONENT_ID, NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null))
+            .thenReturn(Either.left(new HashMap<>()));
+        when(toscaOperationFacade
+            .addInformationalArtifactsToInstance(service.getUniqueId(), instanceToBeCreated, originComponent.getArtifacts()))
+            .thenReturn(StorageOperationStatus.OK);
+        when(janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
+        when(graphLockOperation.unlockComponent(COMPONENT_ID, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+
+        final ComponentInstance result = componentInstanceBusinessLogic.createComponentInstance(
+            ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, instanceToBeCreated);
+        assertThat(result).isEqualTo(instanceToBeCreated);
+        assertThat(instanceToBeCreated.getComponentVersion()).isEqualTo(originComponent.getVersion());
+        assertThat(instanceToBeCreated.getIcon()).isEqualTo(originComponent.getIcon());
+        verify(containerInstanceTypeData, times(1))
+            .isAllowedForServiceComponent(ResourceTypeEnum.VF, null);
+        verify(compositionBusinessLogic, times(1)).validateAndSetDefaultCoordinates(instanceToBeCreated);
+        verify(toscaOperationFacade, times(1))
+            .addComponentInstanceToTopologyTemplate(service, originComponent, instanceToBeCreated, false, user);
+        // Check graph db change was committed
+        verify(janusGraphDao, times(1)).commit();
+    }
+    
+    @Test
+    void testCreateComponentInstanceServiceSubstitutionSuccess() {
+        ComponentInstance instanceToBeCreated = createServiceSubstitutionComponentInstance();
+        Service originService = createServiceSubstitutionOriginService();
+        Component serviceBaseComponent = createServiceSubstitutionServiceDerivedFromComponent();
+
+        Service updatedService = new Service();
+        updatedService.setComponentInstances(Collections.singletonList(instanceToBeCreated));
+        updatedService.setUniqueId(service.getUniqueId());
+        
+        when(toscaOperationFacade.getToscaElement(eq(COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(service));
+        when(toscaOperationFacade.getToscaFullElement(ORIGIN_COMPONENT_ID))
+            .thenReturn(Either.left(originService));
+        when(toscaOperationFacade.getLatestByToscaResourceName(eq(originService.getDerivedFromGenericType()), isNull()))
+            .thenReturn(Either.left(serviceBaseComponent));
+        when(toscaOperationFacade.getToscaElement(eq(ORIGIN_COMPONENT_ID), any(ComponentParametersView.class)))
+            .thenReturn(Either.left(originService));
+        Mockito.doNothing().when(compositionBusinessLogic).validateAndSetDefaultCoordinates(instanceToBeCreated);
+        when(graphLockOperation.lockComponent(COMPONENT_ID, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.addComponentInstanceToTopologyTemplate(service, serviceBaseComponent, instanceToBeCreated, false, user))
+            .thenReturn(Either.left(new ImmutablePair<>(updatedService, COMPONENT_INSTANCE_ID)));
+        when(artifactsBusinessLogic.getArtifacts(
+                "baseComponentId", NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null))
+            .thenReturn(Either.left(new HashMap<>()));
+        when(toscaOperationFacade
+            .addInformationalArtifactsToInstance(service.getUniqueId(), instanceToBeCreated, originService.getArtifacts()))
+            .thenReturn(StorageOperationStatus.OK);
+        when(janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
+        when(graphLockOperation.unlockComponent(COMPONENT_ID, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+
+        ComponentInstance result = componentInstanceBusinessLogic.createComponentInstance(
+            ComponentTypeEnum.SERVICE_PARAM_NAME, COMPONENT_ID, USER_ID, instanceToBeCreated);
+        assertThat(result).isEqualTo(instanceToBeCreated);
+        assertThat(instanceToBeCreated.getComponentVersion()).isEqualTo(originService.getVersion());
+        assertThat(instanceToBeCreated.getIcon()).isEqualTo(originService.getIcon());
+        verify(compositionBusinessLogic, times(1)).validateAndSetDefaultCoordinates(instanceToBeCreated);
+        verify(toscaOperationFacade, times(1))
+            .addComponentInstanceToTopologyTemplate(service, serviceBaseComponent, instanceToBeCreated, false, user);
+        // Check graph db change was committed
+        verify(janusGraphDao, times(1)).commit();
+    }
+
+    @Test
+    void testGetComponentInstanceAttributesById_success() {
+        final ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
+        componentInstanceAttribute.setComponentInstanceId(TO_INSTANCE_ID);
+
+        final HashMap<String, List<ComponentInstanceAttribute>> map = new HashMap<>();
+        map.put(TO_INSTANCE_ID, Arrays.asList(componentInstanceAttribute));
+        resource.setComponentInstancesAttributes(map);
+
+        final Either<Component, StorageOperationStatus> leftServiceOp = Either.left(resource);
+        doReturn(leftServiceOp).when(toscaOperationFacade).getToscaElement(COMPONENT_ID);
+
+        final List<ComponentInstanceAttribute> result = componentInstanceBusinessLogic
+            .getComponentInstanceAttributesById(RESOURCE_PARAM_NAME, COMPONENT_ID, TO_INSTANCE_ID, USER_ID);
+        assertThat(result).isNotNull().isNotEmpty();
+        verify(toscaOperationFacade, times(1)).getToscaElement(COMPONENT_ID);
+    }
+
+    @Test
+    void testGetComponentInstanceAttributesById_fail_missing_ComponentInstancesAttributes() {
+        final Either<Component, StorageOperationStatus> leftServiceOp = Either.left(resource);
+        doReturn(leftServiceOp).when(toscaOperationFacade).getToscaElement(COMPONENT_ID);
+
+        final List<ComponentInstanceAttribute> result = componentInstanceBusinessLogic
+            .getComponentInstanceAttributesById(RESOURCE_PARAM_NAME, COMPONENT_ID, TO_INSTANCE_ID, USER_ID);
+        assertThat(result).isNotNull().isEmpty();
+        verify(toscaOperationFacade, times(1)).getToscaElement(COMPONENT_ID);
+    }
+
+    @Test
+    void testGetComponentInstanceAttributesById_fail_getToscaElement() {
+        final ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
+        componentInstanceAttribute.setComponentInstanceId(TO_INSTANCE_ID);
+
+        final HashMap<String, List<ComponentInstanceAttribute>> map = new HashMap<>();
+        map.put(TO_INSTANCE_ID, Arrays.asList(componentInstanceAttribute));
+        resource.setComponentInstancesAttributes(map);
+
+        final Either<Object, StorageOperationStatus> right = Either.right(StorageOperationStatus.BAD_REQUEST);
+        doReturn(right).when(toscaOperationFacade).getToscaElement(COMPONENT_ID);
+        doReturn(ActionStatus.BAD_REQUEST_MISSING_RESOURCE).when(componentsUtils).convertFromStorageResponse(StorageOperationStatus.BAD_REQUEST);
+
+        assertThrows(ByActionStatusComponentException.class, () -> {
+            final List<ComponentInstanceAttribute> result = componentInstanceBusinessLogic
+                .getComponentInstanceAttributesById(RESOURCE_PARAM_NAME, COMPONENT_ID, TO_INSTANCE_ID, USER_ID);
+
+        });
+
+    }
+
+    @Test
+    void testGetComponentInstanceAttributesById_fail_getResourceInstanceById() {
+        final ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
+        componentInstanceAttribute.setComponentInstanceId(TO_INSTANCE_ID);
+
+        final HashMap<String, List<ComponentInstanceAttribute>> map = new HashMap<>();
+        map.put(TO_INSTANCE_ID, Arrays.asList(componentInstanceAttribute));
+        resource.setComponentInstancesAttributes(map);
+
+        final Either<Component, StorageOperationStatus> leftServiceOp = Either.left(resource);
+        doReturn(leftServiceOp).when(toscaOperationFacade).getToscaElement(COMPONENT_ID);
+        doReturn(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE).when(componentsUtils).convertFromStorageResponse(StorageOperationStatus.PARENT_RESOURCE_NOT_FOUND);
+
+        assertThrows(ByActionStatusComponentException.class, () -> {
+            final List<ComponentInstanceAttribute> result = componentInstanceBusinessLogic
+                .getComponentInstanceAttributesById(RESOURCE_PARAM_NAME, COMPONENT_ID, "", USER_ID);
+
+        });
+
+    }
+
+    @Test
+    void updateInstanceCapabilitySuccessTest() {
+        var containerComponentId = "containerComponentId";
+        var componentInstanceUniqueId = "componentInstanceUniqueId";
+        var capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setUniqueId("uniqueId");
+
+        final Component component = new Service();
+        component.setUniqueId(containerComponentId);
+        component.setLastUpdaterUserId(USER_ID);
+        component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        var componentInstance = new ComponentInstance();
+        componentInstance.setUniqueId(componentInstanceUniqueId);
+        component.setComponentInstances(Collections.singletonList(componentInstance));
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId))
+            .thenReturn(Either.left(component));
+        when(toscaOperationFacade.updateComponentInstanceCapability(containerComponentId, componentInstanceUniqueId, capabilityDefinition))
+            .thenReturn(capabilityDefinition);
+        when(toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(component))
+            .thenReturn(Either.left(component));
+        when(graphLockOperation.lockComponent(containerComponentId, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+
+        final Either<CapabilityDefinition, ResponseFormat> resultEither = componentInstanceBusinessLogic
+            .updateInstanceCapability(ComponentTypeEnum.SERVICE, containerComponentId, componentInstanceUniqueId, capabilityDefinition, USER_ID);
+        assertTrue(resultEither.isLeft());
+        final CapabilityDefinition actualCapabilityDefinition = resultEither.left().value();
+        assertNotEquals(capabilityDefinition, actualCapabilityDefinition);
+        assertEquals(capabilityDefinition.getUniqueId(), actualCapabilityDefinition.getUniqueId());
+    }
+
+    @Test
+    void updateInstanceCapabilityNoContainerComponentTypeTest() {
+        var responseFormat = new ResponseFormat();
+        when(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED)).thenReturn(responseFormat);
+        final Either<CapabilityDefinition, ResponseFormat> resultEither = componentInstanceBusinessLogic
+            .updateInstanceCapability(null, "containerComponentId", "componentInstanceUniqueId", new CapabilityDefinition(), USER_ID);
+        assertTrue(resultEither.isRight(), "Either return should be right");
+        final ResponseFormat actualResponseFormat = resultEither.right().value();
+        assertEquals(responseFormat, actualResponseFormat);
+    }
+
+    @Test
+    void updateInstanceCapabilityContainerComponentNotFoundTest() {
+        var containerComponentId = "containerComponentId";
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId)).thenReturn(Either.right(null));
+        var responseFormat = new ResponseFormat();
+        when(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NOT_FOUND, containerComponentId)).thenReturn(responseFormat);
+        final Either<CapabilityDefinition, ResponseFormat> resultEither = componentInstanceBusinessLogic
+            .updateInstanceCapability(ComponentTypeEnum.SERVICE, "containerComponentId", "componentInstanceUniqueId", new CapabilityDefinition(), USER_ID);
+        assertTrue(resultEither.isRight(), "Either return should be right");
+        final ResponseFormat actualResponseFormat = resultEither.right().value();
+        assertEquals(responseFormat, actualResponseFormat);
+    }
+
+    @Test
+    void updateInstanceCapabilityCannotWorkOnComponentTest() {
+        var containerComponentId = "containerComponentId";
+        var componentInstanceUniqueId = "componentInstanceUniqueId";
+
+        final Component component = new Service();
+        component.setUniqueId(containerComponentId);
+        component.setLastUpdaterUserId("anotherUse");
+        component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        var expectedResponseFormat = new ResponseFormat();
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId))
+            .thenReturn(Either.left(component));
+        when(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION))
+            .thenReturn(expectedResponseFormat);
+
+        final Either<CapabilityDefinition, ResponseFormat> resultEither = componentInstanceBusinessLogic
+            .updateInstanceCapability(ComponentTypeEnum.SERVICE, containerComponentId, componentInstanceUniqueId, new CapabilityDefinition(), USER_ID);
+        assertTrue(resultEither.isRight(), "Either return should be right");
+        final ResponseFormat actualResponseFormat = resultEither.right().value();
+        assertEquals(expectedResponseFormat, actualResponseFormat);
+    }
+
+    @Test
+    void updateInstanceCapabilityResourceInstanceNotFoundTest() {
+        var containerComponentId = "containerComponentId";
+        var componentInstanceUniqueId = "componentInstanceUniqueId";
+
+        final Component component = new Service();
+        component.setUniqueId(containerComponentId);
+        component.setLastUpdaterUserId(USER_ID);
+        component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        var expectedResponseFormat = new ResponseFormat();
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId))
+            .thenReturn(Either.left(component));
+        when(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId))
+            .thenReturn(expectedResponseFormat);
+
+        final Either<CapabilityDefinition, ResponseFormat> resultEither = componentInstanceBusinessLogic
+            .updateInstanceCapability(ComponentTypeEnum.SERVICE, containerComponentId, componentInstanceUniqueId, new CapabilityDefinition(), USER_ID);
+        assertTrue(resultEither.isRight(), "Either return should be right");
+        final ResponseFormat actualResponseFormat = resultEither.right().value();
+        assertEquals(expectedResponseFormat, actualResponseFormat);
+    }
+
+    @Test
+    void updateInstanceCapabilityUpdateMetadataFailTest() {
+        var containerComponentId = "containerComponentId";
+        var componentInstanceUniqueId = "componentInstanceUniqueId";
+        var capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setUniqueId("uniqueId");
+
+        final Component component = new Service();
+        component.setUniqueId(containerComponentId);
+        component.setLastUpdaterUserId(USER_ID);
+        component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        var componentInstance = new ComponentInstance();
+        componentInstance.setUniqueId(componentInstanceUniqueId);
+        component.setComponentInstances(Collections.singletonList(componentInstance));
+
+        var expectedResponseFormat = new ResponseFormat();
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId))
+            .thenReturn(Either.left(component));
+        when(graphLockOperation.lockComponent(containerComponentId, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.updateComponentInstanceCapability(containerComponentId, componentInstanceUniqueId, capabilityDefinition))
+            .thenReturn(capabilityDefinition);
+        when(toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(component))
+            .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR));
+        when(componentsUtils.convertFromStorageResponse(StorageOperationStatus.GENERAL_ERROR, ComponentTypeEnum.SERVICE))
+            .thenReturn(ActionStatus.GENERAL_ERROR);
+        when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR))
+            .thenReturn(expectedResponseFormat);
+
+        final Either<CapabilityDefinition, ResponseFormat> resultEither = componentInstanceBusinessLogic
+            .updateInstanceCapability(ComponentTypeEnum.SERVICE, containerComponentId, componentInstanceUniqueId, capabilityDefinition, USER_ID);
+        assertTrue(resultEither.isRight(), "Either return should be right");
+        final ResponseFormat actualResponseFormat = resultEither.right().value();
+        assertEquals(expectedResponseFormat, actualResponseFormat);
+    }
+
+    @Test
+    void updateInstanceCapabilityBusinessExceptionHandlingTest() {
+        var containerComponentId = "containerComponentId";
+        var componentInstanceUniqueId = "componentInstanceUniqueId";
+        var capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setUniqueId("uniqueId");
+
+        final Component component = new Service();
+        component.setUniqueId(containerComponentId);
+        component.setLastUpdaterUserId(USER_ID);
+        component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        var componentInstance = new ComponentInstance();
+        componentInstance.setUniqueId(componentInstanceUniqueId);
+        component.setComponentInstances(Collections.singletonList(componentInstance));
+
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId))
+            .thenReturn(Either.left(component));
+        when(graphLockOperation.lockComponent(containerComponentId, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.updateComponentInstanceCapability(containerComponentId, componentInstanceUniqueId, capabilityDefinition))
+            .thenThrow(new OperationException(ActionStatus.GENERAL_ERROR));
+
+        final BusinessException businessException = assertThrows(BusinessException.class, () -> {
+            componentInstanceBusinessLogic
+                .updateInstanceCapability(ComponentTypeEnum.SERVICE, containerComponentId, componentInstanceUniqueId, capabilityDefinition, USER_ID);
+        });
+        assertTrue(businessException instanceof OperationException);
+        assertEquals(ActionStatus.GENERAL_ERROR, ((OperationException) businessException).getActionStatus());
+    }
+
+    @Test
+    void updateInstanceCapabilityUnknownExceptionHandlingTest() {
+        var containerComponentId = "containerComponentId";
+        var componentInstanceUniqueId = "componentInstanceUniqueId";
+        var capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setUniqueId("uniqueId");
+
+        final Component component = new Service();
+        component.setUniqueId(containerComponentId);
+        component.setLastUpdaterUserId(USER_ID);
+        component.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+
+        var componentInstance = new ComponentInstance();
+        componentInstance.setUniqueId(componentInstanceUniqueId);
+        component.setComponentInstances(Collections.singletonList(componentInstance));
+
+        var expectedResponseFormat = new ResponseFormat();
+
+        when(toscaOperationFacade.getToscaFullElement(containerComponentId))
+            .thenReturn(Either.left(component));
+        when(graphLockOperation.lockComponent(containerComponentId, NodeTypeEnum.Service))
+            .thenReturn(StorageOperationStatus.OK);
+        when(toscaOperationFacade.updateComponentInstanceCapability(containerComponentId, componentInstanceUniqueId, capabilityDefinition))
+            .thenThrow(new RuntimeException());
+        when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR))
+            .thenReturn(expectedResponseFormat);
+
+        final Exception exception = assertThrows(BusinessException.class, () ->
+            componentInstanceBusinessLogic
+                .updateInstanceCapability(ComponentTypeEnum.SERVICE, containerComponentId, componentInstanceUniqueId, capabilityDefinition, USER_ID));
+        assertTrue(exception instanceof ByResponseFormatComponentException);
+        final ByResponseFormatComponentException actualException = (ByResponseFormatComponentException) exception;
+        assertEquals(expectedResponseFormat, actualException.getResponseFormat());
+    }
+
+    private ComponentInstance createServiceSubstitutionComponentInstance() {
+        final ComponentInstance instanceToBeCreated = new ComponentInstance();
+        instanceToBeCreated.setName(COMPONENT_INSTANCE_NAME);
+        instanceToBeCreated.setUniqueId(COMPONENT_INSTANCE_ID);
+        instanceToBeCreated.setComponentUid(ORIGIN_COMPONENT_ID);
+        instanceToBeCreated.setOriginType(OriginTypeEnum.ServiceSubstitution);
+
+        return instanceToBeCreated;
+    }
+    
+    private Service createServiceSubstitutionOriginService() {
+        final Service originComponent = new Service();
+        originComponent.setLifecycleState(LifecycleStateEnum.CERTIFIED);
+        originComponent.setVersion(ORIGIN_COMPONENT_VERSION);
+        originComponent.setIcon(ICON_NAME);
+        originComponent.setDerivedFromGenericType("org.openecomp.resource.abstract.nodes.service");
+        originComponent.setName("myService");
+        return originComponent;
+    }
+    
+    private Component createServiceSubstitutionServiceDerivedFromComponent() {
+        final Resource component = new Resource();
+        component.setLifecycleState(LifecycleStateEnum.CERTIFIED);
+        component.setVersion(ORIGIN_COMPONENT_VERSION);
+        component.setIcon(ICON_NAME);
+        component.setToscaResourceName("org.openecomp.resource.abstract.nodes.service");
+        component.setUniqueId("baseComponentId");
+        return component;
+    }
+
 }
+