Create plugin point for csar generation
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / tosca / ToscaExportHandlerTest.java
index d54fc98..0b37962 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
 
 package org.openecomp.sdc.be.tosca;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyList;
@@ -30,6 +36,10 @@ import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.doReturn;
+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.ResourceTypeEnum.VF;
 import static org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType.PROPERTY;
 
 import fj.data.Either;
@@ -37,39 +47,41 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import mockit.Deencapsulation;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Triple;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.openecomp.sdc.be.components.BeConfDependentTest;
 import org.openecomp.sdc.be.components.utils.PropertyDataDefinitionBuilder;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
-import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.ForwardingPathElementDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyFilterConstraintDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ToscaArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ConstraintType;
 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.exception.ToscaExportException;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.AttributeDefinition;
 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.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.ComponentParametersView;
@@ -78,7 +90,9 @@ import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.GroupInstance;
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 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;
 import org.openecomp.sdc.be.model.RequirementDefinition;
@@ -90,9 +104,8 @@ import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
-import org.openecomp.sdc.be.tosca.model.SubstitutionMapping;
+import org.openecomp.sdc.be.tosca.exception.ToscaConversionException;
 import org.openecomp.sdc.be.tosca.model.ToscaCapability;
-import org.openecomp.sdc.be.tosca.model.ToscaMetadata;
 import org.openecomp.sdc.be.tosca.model.ToscaNodeTemplate;
 import org.openecomp.sdc.be.tosca.model.ToscaNodeType;
 import org.openecomp.sdc.be.tosca.model.ToscaProperty;
@@ -101,32 +114,40 @@ import org.openecomp.sdc.be.tosca.model.ToscaTemplateArtifact;
 import org.openecomp.sdc.be.tosca.model.ToscaTemplateRequirement;
 import org.openecomp.sdc.be.tosca.model.ToscaTopolgyTemplate;
 import org.openecomp.sdc.be.tosca.utils.InputConverter;
+import org.openecomp.sdc.be.tosca.utils.OutputConverter;
+import org.openecomp.sdc.common.test.BaseConfDependent;
 
-public class ToscaExportHandlerTest extends BeConfDependentTest {
+class ToscaExportHandlerTest extends BaseConfDependent {
 
     private static final String COMPONENT_PROPERTY_NAME = "prop1";
     private static final String COMPONENT_PROPERTY_TYPE = "string";
     private static final String COMPONENT_INPUT_NAME = "input1";
+    private static final String COMPONENT_OUTPUT_NAME = "output1";
     private static final String COMPONENT_INPUT_TYPE = "integer";
+    private static final String COMPONENT_OUTPUT_TYPE = "integer";
     private static final String RESOURCE_NAME = "resource";
     private static final String TOSCA_VERSION = "tosca_simple_yaml_1_1";
-    private static final Map<String, DataTypeDefinition> DATA_TYPES = new HashMap<>();
+    private static final String LOCAL_INTERFACE_TYPE = "Local";
+    private static final String UNIQUE_ID = "1L";
 
     @InjectMocks
     private ToscaExportHandler testSubject;
 
     @Mock
-    private ApplicationDataTypeCache dataTypeCache;
+    private ApplicationDataTypeCache applicationDataTypeCache;
 
     @Mock
     private ToscaOperationFacade toscaOperationFacade;
 
     @Mock
-    private CapabilityRequirementConverter capabiltyRequirementConvertor;
+    private CapabilityRequirementConverter capabilityRequirementConverter;
 
     @Mock
     private InputConverter inputConverter;
 
+    @Mock
+    private OutputConverter outputConverter;
+
     @Mock
     private GroupExportParser groupExportParser;
 
@@ -145,16 +166,27 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
     @Mock
     private PolicyExportParser policyExportParser;
 
-    @Before
-    public void setUpMock() throws Exception {
-        MockitoAnnotations.initMocks(this);
-               doReturn(new ToscaProperty()).when(propertyConvertor).convertProperty(any(), any(), eq(PROPERTY));
+    @Mock
+    private AttributeConverter attributeConverter;
+
+    @BeforeAll
+    public static void setupBeforeClass() {
+        componentName = "catalog-be";
+        confPath = "src/test/resources/config";
+        setUp();
+    }
+
+    @BeforeEach
+    void setUpMock() {
+        MockitoAnnotations.openMocks(this);
+        doReturn(new ToscaProperty()).when(propertyConvertor).convertProperty(any(), any(), eq(PROPERTY));
         doReturn(new HashMap<String, Object>()).when(interfacesOperationsConverter)
-                .getInterfacesMap(any(), isNull(), anyMap(), anyMap(), anyBoolean(), anyBoolean());
+                .getInterfacesMap(any(), isNull(), anyMap(), anyMap(), anyBoolean());
     }
 
     private Resource getNewResource() {
         Resource resource = new Resource();
+        resource.setUniqueId("resourceUniqueId");
         List<CategoryDefinition> categories = new ArrayList<>();
         CategoryDefinition category = new CategoryDefinition();
         List<SubCategoryDefinition> subcategories = new ArrayList<>();
@@ -164,13 +196,13 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         dataType.setName("dataTypeName");
         dataType.setDerivedFromName("tosca.datatypes.Root");
         PropertyDataDefinition propData = new PropertyDataDefinitionBuilder()
-            .setName("property")
-            .setType("type")
-            .build();
+                .setName("property")
+                .setType("type")
+                .build();
         List<PropertyDataDefinition> propDataList = Arrays.asList(propData);
         dataType.setPropertiesData(propDataList);
         List<PropertyDefinition> propList = propDataList.stream().map(PropertyDefinition::new)
-            .collect(Collectors.toList());
+                .collect(Collectors.toList());
         dataType.setProperties(propList);
         dataTypes.add(dataType);
 
@@ -180,6 +212,13 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         category.setSubcategories(subcategories);
         categories.add(category);
 
+        final List<PropertyDefinition> properties = new ArrayList<>();
+        properties.add(new PropertyDefinition());
+        resource.setProperties(properties);
+        Map<String, InterfaceDefinition> proxyInterfaces = new HashMap<>();
+        proxyInterfaces.put("Local", new InterfaceDefinition("Local", "desc", new HashMap<>()));
+        resource.setInterfaces(proxyInterfaces);
+
         resource.setCategories(categories);
         resource.setVersion("version");
         resource.setVendorName("vendorName");
@@ -213,58 +252,65 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
     }
 
     @Test
-    public void testExportComponent() throws Exception {
+    void testExportComponent() {
         Component component = getNewResource();
         Either<ToscaRepresentation, ToscaError> result;
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Resource.class),
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
                 any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.left(Collections.emptyMap()));
 
         // default test when component is Resource
         result = testSubject.exportComponent(component);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
 
         component = getNewService();
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Service.class),
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Service.class),
                 any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
 
         // default test when component is Service
         result = testSubject.exportComponent(component);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
     }
 
     @Test
-    public void testExportComponentInterface() throws Exception {
-        Component component = getNewResource();
+    void testExportComponentInterface() {
+        Resource component = getNewResource();
         Either<ToscaRepresentation, ToscaError> result;
 
-        ((Resource) component).setInterfaces(new HashMap<>());
+        component.setInterfaces(new HashMap<>());
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.left(Collections.emptyMap()));
         // default test when convertInterfaceNodeType is right
         result = testSubject.exportComponentInterface(component, false);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Resource.class),
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
                 any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         // default test when convertInterfaceNodeType is left
         result = testSubject.exportComponentInterface(component, false);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
+    }
+
+    @Test
+    void testExportDataType() {
+        DataTypeDefinition dataTypeDefinition = new DataTypeDefinition();
+        dataTypeDefinition.setUniqueId("uniqueId");
+        Either<ToscaRepresentation, ToscaError> result;
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        result = testSubject.exportDataType(dataTypeDefinition);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertInterfaceNodeTypeProperties() throws Exception {
+    void testConvertInterfaceNodeTypeProperties() {
 
         Resource component = getNewResource();
 
@@ -280,58 +326,86 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         component.setName(RESOURCE_NAME);
         component.setToscaResourceName(RESOURCE_NAME);
 
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
         // when convertRequirements is called, make it return the same value as 3rd (index=2) argument.
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Resource.class),
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
                 any(ToscaNodeType.class))).thenAnswer(i -> Either.left(i.getArgument(2)));
 
-        Either<ToscaTemplate, ToscaError> result = (Either<ToscaTemplate, ToscaError>) Deencapsulation
-            .invoke(testSubject, "convertInterfaceNodeType", new HashMap<String, Component>(), component,
+        final var result = testSubject.convertInterfaceNodeType(new HashMap<String, Component>(), component,
                 new ToscaTemplate(TOSCA_VERSION), new HashMap<String, ToscaNodeType>(), false);
-        Assert.assertNotNull(result);
-        assertThat(result.isLeft(), is(true));
+        assertNotNull(result);
+        assertTrue(result.isLeft());
         Map<String, ToscaNodeType> nodeTypeMap = result.left().value().getNode_types();
-        assertThat(nodeTypeMap.size(), is(1));
+        assertNotNull(nodeTypeMap);
+        assertEquals(1, nodeTypeMap.size());
         ToscaNodeType toscaNodeType = nodeTypeMap.values().iterator().next();
+        assertNotNull(toscaNodeType);
         Map<String, ToscaProperty> propertyMap = toscaNodeType.getProperties();
         // Check if inputs and properties in component are merged properly
-        assertThat(propertyMap.size(), is(2));
-        assertThat(propertyMap.containsKey(COMPONENT_INPUT_NAME), is(true));
-        assertThat(propertyMap.containsKey(COMPONENT_PROPERTY_NAME), is(true));
+        assertNotNull(propertyMap);
+        assertEquals(1, propertyMap.size());
+        assertFalse(propertyMap.containsKey(COMPONENT_INPUT_NAME));
+        assertTrue(propertyMap.containsKey(COMPONENT_PROPERTY_NAME));
     }
 
     @Test
-    public void testCreateToscaRepresentation() throws Exception {
-        ToscaTemplate toscaTemplate = new ToscaTemplate("");
-        ToscaRepresentation result;
+    void testGetDependencies() {
+
+        Component component = new Resource();
+        Either<ToscaTemplate, ToscaError> result;
 
         // default test
-        result = testSubject.createToscaRepresentation(toscaTemplate);
-        Assert.assertNotNull(result);
+        result = testSubject.getDependencies(component);
+        assertNotNull(result);
     }
 
     @Test
-    public void testGetDependencies() throws Exception {
+    void testSetImports() {
+        Resource resource = new Resource();
+        resource.setResourceType(ResourceTypeEnum.PNF);
 
-        Component component = new Resource();
-        Either<ToscaTemplate, ToscaError> result;
+        resource.setName("TestResourceName");
+        Map<String, ArtifactDefinition> artifactList = new HashMap<>();
+        ArtifactDefinition artifact = new ArtifactDefinition();
+        artifact.setArtifactName("name.name2");
+        artifactList.put("assettoscatemplate", artifact);
+        resource.setArtifacts(artifactList);
+        resource.setToscaArtifacts(artifactList);
+        ToscaTemplate toscaTemplate = new ToscaTemplate("");
 
-        // default test
-        result = testSubject.getDependencies(component);
-        Assert.assertNotNull(result);
+        ComponentInstance ci = new ComponentInstance();
+        ci.setComponentUid("name");
+        ci.setOriginType(OriginTypeEnum.PNF);
+        ci.setSourceModelUid("modelName");
+        List<ComponentInstance> componentInstanceList = new LinkedList<>();
+        componentInstanceList.add(ci);
+        resource.setComponentInstances(componentInstanceList);
+
+        when(toscaOperationFacade.getToscaFullElement("name")).thenReturn(Either.left(resource));
+
+        Either<ImmutablePair<ToscaTemplate, Map<String, Component>>, ToscaError> result;
+        result = Deencapsulation.invoke(testSubject, "fillImports", resource, toscaTemplate, false);
+
+        verify(toscaOperationFacade, times(1)).getToscaFullElement("name");
+        assertTrue(result.isLeft());
+        ToscaTemplate toscaTemplateRes = result.left().value().left;
+        assertEquals(8, toscaTemplateRes.getImports().size());
+        assertNotNull(toscaTemplateRes.getImports().get(6).get("resource-TestResourceName-interface"));
+        assertNotNull(toscaTemplateRes.getImports().get(7).get("resource-TestResourceName"));
+        assertEquals(1, toscaTemplateRes.getDependencies().size());
+        assertEquals("name.name2", toscaTemplateRes.getDependencies().get(0).getLeft());
     }
 
     @Test
-    public void testConvertToscaTemplate() throws Exception {
+    void testConvertToscaTemplate() throws Exception {
 
-        Component component = getNewResource();
-        ToscaTemplate toscaNode = new ToscaTemplate("");
+        final Component component = getNewResource();
+        final ToscaTemplate toscaNode = new ToscaTemplate("");
         Either<ToscaTemplate, ToscaError> result;
-        List<ComponentInstance> resourceInstances = new ArrayList<>();
-        ComponentInstance instance = new ComponentInstance();
+        final List<ComponentInstance> resourceInstances = new ArrayList<>();
+        final ComponentInstance instance = new ComponentInstance();
 
         instance.setOriginType(OriginTypeEnum.SERVICE);
         instance.setSourceModelUid("targetModelUid");
@@ -339,20 +413,22 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         component.setComponentInstances(resourceInstances);
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
-        Mockito.when(capabiltyRequirementConvertor.getOriginComponent(any(Map.class),
-            any(ComponentInstance.class))).thenReturn(Either.right(false));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.right(false));
+
+        final Map<String, ToscaProperty> map = new HashMap<>();
+        map.put("mock", new ToscaProperty());
+        doReturn(map).when(outputConverter).convert(any(), any());
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode);
-        Assert.assertNotNull(result);
+        result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode, false);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertToscaTemplateWhenComponentContainsGroup() {
+    void testConvertToscaTemplateWhenComponentContainsGroup() throws ToscaConversionException {
         Component component = getNewResource();
         ToscaTemplate toscaNode = new ToscaTemplate("");
-        Either<ToscaTemplate, ToscaError> result;
         component.setComponentInstances(new ArrayList<>());
 
         List<GroupDefinition> groups = new ArrayList<>();
@@ -364,32 +440,43 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         groups.add(group);
         component.setGroups(groups);
 
+        final var input = new InputDefinition();
+        input.setName(COMPONENT_INPUT_NAME);
+        input.setType(COMPONENT_INPUT_TYPE);
+        component.setInputs(Collections.singletonList(input));
+
+        final var output = new OutputDefinition();
+        output.setName(COMPONENT_OUTPUT_NAME);
+        output.setType(COMPONENT_OUTPUT_TYPE);
+        component.setOutputs(Collections.singletonList(output));
+
         Map<String, String[]> substitutionMappingMap = new HashMap<>();
         String[] array = {"value1", "value2"};
         substitutionMappingMap.put("key", array);
 
-        Mockito.when(capabiltyRequirementConvertor.convertSubstitutionMappingCapabilities(any(Map.class),
-            any(Component.class))).thenReturn(Either.left(substitutionMappingMap));
+        when(capabilityRequirementConverter.convertSubstitutionMappingCapabilities(anyMap(),
+                any(Component.class))).thenReturn(Either.left(substitutionMappingMap));
+
+        when(capabilityRequirementConverter.convertSubstitutionMappingRequirements(any(Component.class), anyMap()))
+                .thenReturn(Either.left(Collections.emptyMap()));
 
-        Mockito.when(capabiltyRequirementConvertor.convertSubstitutionMappingRequirements(any(Map.class),
-            any(Component.class), any(SubstitutionMapping.class)))
-            .thenReturn(Either.left(new SubstitutionMapping()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
+        when(inputConverter.convertInputs(anyList(), anyMap())).thenReturn(new HashMap<>());
 
-        Mockito.when(inputConverter.convertInputs(any(List.class), any(Map.class)))
-            .thenReturn(new HashMap<>());
+        when(groupExportParser.getGroups(component)).thenReturn(null);
 
-        Mockito.when(groupExportParser.getGroups(component))
-            .thenReturn(null);
+        final Map<String, ToscaProperty> map = new HashMap<>();
+        map.put("mock", new ToscaProperty());
+        doReturn(map).when(outputConverter).convert(any(), any());
 
         // test component contains group
-        result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode);
-        Assert.assertNotNull(result);
+        final var result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode, false);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertToscaTemplateWhenComponentIsService() throws Exception {
+    void testConvertToscaTemplateWhenComponentIsService() throws Exception {
         Component component = getNewService();
         ToscaTemplate toscaNode = new ToscaTemplate("");
         Either<ToscaTemplate, ToscaError> result;
@@ -408,24 +495,27 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         String[] array = {"value1", "value2"};
         substitutionMappingMap.put("key", array);
 
-        Mockito
-            .when(capabiltyRequirementConvertor.convertSubstitutionMappingCapabilities(anyMap(), any(Component.class)))
-            .thenReturn(Either.left(substitutionMappingMap));
+        when(capabilityRequirementConverter.convertSubstitutionMappingCapabilities(anyMap(), any(Component.class)))
+                .thenReturn(Either.left(substitutionMappingMap));
+
+        when(capabilityRequirementConverter
+                .convertSubstitutionMappingRequirements(any(Component.class), anyMap()))
+                .thenReturn(Either.left(Collections.emptyMap()));
 
-        Mockito.when(capabiltyRequirementConvertor
-            .convertSubstitutionMappingRequirements(anyMap(), any(Component.class), any(SubstitutionMapping.class)))
-            .thenReturn(Either.left(new SubstitutionMapping()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
+        when(inputConverter.convertInputs(anyList(), anyMap())).thenReturn(new HashMap<>());
+        final Map<String, ToscaProperty> map = new HashMap<>();
+        map.put("mock", new ToscaProperty());
+        doReturn(map).when(outputConverter).convert(any(), any());
 
-        Mockito.when(inputConverter.convertInputs(anyList(), anyMap())).thenReturn(new HashMap<>());
         // test component contains group
-        result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode);
-        Assert.assertNotNull(result);
+        result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode, false);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertMetadata_1() throws Exception {
+    void testConvertMetadata_1() {
 
         Component component = getNewResource();
         boolean isInstance = true;
@@ -433,15 +523,13 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         componentInstance.setOriginType(OriginTypeEnum.ServiceProxy);
         componentInstance.setSourceModelInvariant("targetModelInvariant");
 
-        ToscaMetadata result;
-
         // default test
-        result = Deencapsulation.invoke(testSubject, "convertMetadata", component, isInstance, componentInstance);
-        Assert.assertNotNull(result);
+        Map<String, String> result = Deencapsulation.invoke(testSubject, "convertMetadata", component, isInstance, componentInstance);
+        assertNotNull(result);
     }
 
     @Test
-    public void testFillImports() throws Exception {
+    void testFillImports() {
 
         Component component = getNewService();
         ToscaTemplate toscaTemplate = new ToscaTemplate("");
@@ -458,16 +546,27 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         toscaArtifacts.put("assettoscatemplate", artifact);
         component.setToscaArtifacts(toscaArtifacts);
 
-        Mockito.when(toscaOperationFacade.getToscaFullElement(any(String.class)))
-            .thenReturn(Either.left(component));
+        when(toscaOperationFacade.getToscaFullElement(any(String.class)))
+                .thenReturn(Either.left(component));
+
+        Resource baseType = getNewResource();
+        Map<String, ArtifactDefinition> baseTypeToscaArtifacts = new HashMap<>();
+        ArtifactDefinition baseTypeArtifact = new ArtifactDefinition();
+        baseTypeArtifact.setArtifactName("typeA");
+        baseTypeToscaArtifacts.put("assettoscatemplate", baseTypeArtifact);
+        baseType.setToscaArtifacts(baseTypeToscaArtifacts);
+
+        component.setDerivedFromGenericType("org.typeA");
+        component.setDerivedFromGenericVersion("1.0");
+        when(toscaOperationFacade.getByToscaResourceNameAndVersion("org.typeA", "1.0", null)).thenReturn(Either.left(baseType));
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "fillImports", component, toscaTemplate);
-        Assert.assertNotNull(result);
+        result = Deencapsulation.invoke(testSubject, "fillImports", component, toscaTemplate, false);
+        assertNotNull(result);
     }
 
     @Test
-    public void testCreateDependency() throws Exception {
+    void testCreateDependency() {
 
         Map<String, Component> componentCache = new HashMap<>();
         List<Map<String, Map<String, String>>> imports = new ArrayList<>();
@@ -484,43 +583,43 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         ci.setOriginType(OriginTypeEnum.ServiceProxy);
         ci.setSourceModelUid("modelName");
 
-        Mockito.when(toscaOperationFacade.getToscaFullElement(eq("name"))).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getToscaFullElement("name")).thenReturn(Either.left(component));
 
-        Mockito.when(toscaOperationFacade.getToscaFullElement(eq("modelName")))
-            .thenReturn(Either.left(new Service()));
+        when(toscaOperationFacade.getToscaFullElement("modelName")).thenReturn(Either.left(new Service()));
 
         // default test
-        Deencapsulation.invoke(testSubject, "createDependency", componentCache, imports, dependecies, ci);
+        Deencapsulation.invoke(testSubject, "createDependency", componentCache, imports, dependecies, ci, false);
+        assertFalse(componentCache.isEmpty());
     }
 
     @Test
-    public void testGetInterfaceFilename() throws Exception {
+    void testGetInterfaceFilename() {
         String artifactName = "artifact.name";
         String result;
 
         // default test
         result = ToscaExportHandler.getInterfaceFilename(artifactName);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertNodeType() throws Exception {
+    void testConvertNodeType() {
         Component component = new Resource();
         ToscaTemplate toscaNode = new ToscaTemplate("");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         Either<ToscaTemplate, ToscaError> result;
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.right(JanusGraphOperationStatus.ALREADY_EXIST));
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.right(JanusGraphOperationStatus.ALREADY_EXIST));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.left(Collections.emptyMap()));
         // default test
         result = Deencapsulation
-            .invoke(testSubject, "convertNodeType", new HashMap<>(), component, toscaNode, nodeTypes);
-        Assert.assertNotNull(result);
+                .invoke(testSubject, "convertNodeType", new HashMap<>(), component, toscaNode, nodeTypes);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertInterfaceNodeType() throws Exception {
+    void testConvertInterfaceNodeType() {
         Component component = getNewResource();
         ToscaTemplate toscaNode = new ToscaTemplate("");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
@@ -529,181 +628,414 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         inputs.add(new InputDefinition());
         component.setInputs(inputs);
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.left(Collections.emptyMap()));
 
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Resource.class),
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
                 any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         // default test
         result = Deencapsulation.invoke(testSubject, "convertInterfaceNodeType", new HashMap<>(), component, toscaNode
-            , nodeTypes, false);
-        Assert.assertNotNull(result);
+                , nodeTypes, false);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertReqCapAndTypeName() throws Exception {
+    void testConvertReqCapAndTypeName() {
         Component component = new Resource();
         ToscaTemplate toscaNode = new ToscaTemplate("");
-        Map<String, ToscaNodeType> nodeTypes = new HashMap();
+        Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         ToscaNodeType toscaNodeType = new ToscaNodeType();
         Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
         Either<ToscaTemplate, ToscaError> result;
 
-        Mockito.when(
-            capabiltyRequirementConvertor
-                .convertCapabilities(any(Map.class), any(Resource.class), any(Map.class)))
-            .thenReturn(new HashMap<>());
+        when(
+                capabilityRequirementConverter
+                        .convertCapabilities(anyMap(), any(Resource.class), anyMap()))
+                .thenReturn(new HashMap<>());
 
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Resource.class),
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
                 any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         // default test
         result = Deencapsulation
-            .invoke(testSubject, "convertReqCapAndTypeName", new HashMap<>(), component, toscaNode, nodeTypes,
-                toscaNodeType, dataTypes);
-        Assert.assertNotNull(result);
+                .invoke(testSubject, "convertReqCapAndTypeName", new HashMap<>(), component, toscaNode, nodeTypes,
+                        toscaNodeType, dataTypes);
+        assertNotNull(result);
 
         component = new Service();
 
-        Mockito
-            .when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Service.class),
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Service.class),
                 any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         // test when component is service
         result = Deencapsulation
-            .invoke(testSubject, "convertReqCapAndTypeName", new HashMap<>(), component, toscaNode, nodeTypes,
-                toscaNodeType, dataTypes);
-        Assert.assertNotNull(result);
+                .invoke(testSubject, "convertReqCapAndTypeName", new HashMap<>(), component, toscaNode, nodeTypes,
+                        toscaNodeType, dataTypes);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertNodeTemplates() throws Exception {
-        Component component = getNewResource();
-        List<ComponentInstance> componentInstances = new ArrayList<>();
-        Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
-        Map<String, Component> componentCache = new HashMap<>();
-        Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
-        ToscaTopolgyTemplate topologyTemplate = new ToscaTopolgyTemplate();
-        Either<Map<String, ToscaNodeTemplate>, ToscaError> result;
-        Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
-        List<ComponentInstanceInput> inputs = new ArrayList<>();
-        inputs.add(new ComponentInstanceInput());
-        componentInstancesInputs.put("key", inputs);
-        List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
-        RequirementCapabilityRelDef reldef = new RequirementCapabilityRelDef();
+    void testConvertNodeTemplatesWhenComponentIsService() {
+        final Component component = getNewService();
+        final List<ComponentInstance> componentInstances = new ArrayList<>();
+        final Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
+        final Map<String, Component> componentCache = new HashMap<>();
+        final Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
+        final ToscaTopolgyTemplate topologyTemplate = new ToscaTopolgyTemplate();
+        final Either<Map<String, ToscaNodeTemplate>, ToscaError> result;
+        final Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
+        final List<ComponentInstanceInput> inputs = new ArrayList<>();
+        final ComponentInstanceInput componentInstanceInput = new ComponentInstanceInput();
+        componentInstanceInput.setUniqueId("uuid");
+        inputs.add(componentInstanceInput);
+        componentInstancesInputs.put("uuid", inputs);
+        final List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
+        final RequirementCapabilityRelDef reldef = new RequirementCapabilityRelDef();
         reldef.setFromNode("node");
         resourceInstancesRelations.add(reldef);
         component.setComponentInstancesRelations(resourceInstancesRelations);
 
-        ComponentInstance instance = new ComponentInstance();
+        final ComponentInstance instance = new ComponentInstance();
         instance.setUniqueId("id");
         instance.setComponentUid("uid");
         instance.setOriginType(OriginTypeEnum.ServiceProxy);
-        List<GroupInstance> groupInstances = new ArrayList<>();
-        GroupInstance groupInst = new GroupInstance();
-        List<String> artifacts = new ArrayList<>();
+        final List<GroupInstance> groupInstances = new ArrayList<>();
+        final GroupInstance groupInst = new GroupInstance();
+        final List<String> artifacts = new ArrayList<>();
         artifacts.add("artifact");
         groupInst.setArtifacts(artifacts);
         groupInst.setType("type");
         groupInstances.add(groupInst);
         instance.setGroupInstances(groupInstances);
+
+        final List<PropertyDefinition> properties = new ArrayList<>();
+        properties.add(new PropertyDefinition());
+        instance.setProperties(properties);
+
+        instance.setUniqueId("uuid");
+        instance.setDescription("desc");
+        instance.setSourceModelUid("sourceModelUid");
+
         componentInstances.add(instance);
 
+        component.setComponentInstances(componentInstances);
+
         component.setComponentInstancesInputs(componentInstancesInputs);
         component.setInvariantUUID("uuid");
         component.setUUID("uuid");
         component.setDescription("desc");
+        component.setUniqueId("uid");
 
         componentCache.put("uid", component);
 
-        componentInstancesProperties.put("id", new ArrayList<>());
-        componentInstancesInputs.put("id", new ArrayList<>());
+        final List<ComponentInstanceProperty> componentInstanceProperties = new ArrayList<>();
+        componentInstanceProperties.add(new ComponentInstanceProperty());
 
-        Mockito.when(capabiltyRequirementConvertor.getOriginComponent(any(Map.class),
-            any(ComponentInstance.class))).thenReturn(Either.left(component));
+        componentInstancesProperties.put("uuid", componentInstanceProperties);
+        component.setComponentInstancesProperties(componentInstancesProperties);
 
-        Mockito.when(capabiltyRequirementConvertor.convertComponentInstanceCapabilities(
-            any(ComponentInstance.class), any(Map.class), any(ToscaNodeTemplate.class)))
-            .thenReturn(Either.left(new ToscaNodeTemplate()));
+        final Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes = new HashMap<>();
+        final List<ComponentInstanceAttribute> componentInstanceAttributes = new ArrayList<>();
+        final ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
+        componentInstanceAttribute.setDefaultValue("def value");
+        componentInstanceAttributes.add(componentInstanceAttribute);
+
+        componentInstancesAttributes.put("uuid", componentInstanceAttributes);
+        component.setComponentInstancesAttributes(componentInstancesAttributes);
+
+        ComponentInstanceProperty cip = new ComponentInstanceProperty();
+        cip.setInstanceUniqueId("id");
+
+        List<ComponentInstanceProperty> list = new ArrayList<>();
+        list.add(cip);
+
+        componentInstancesProperties.put("id", list);
+        component.setComponentInstancesProperties(componentInstancesProperties);
+
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.left(component));
+        when(capabilityRequirementConverter
+                .convertComponentInstanceCapabilities(any(ComponentInstance.class), anyMap(), any(ToscaNodeTemplate.class)))
+                .thenReturn(Either.left(new ToscaNodeTemplate()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class), any(ToscaNodeType.class)))
+                .thenReturn(Either.left(new ToscaNodeType()));
+        when(toscaOperationFacade.getToscaFullElement("uid")).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getToscaFullElement("sourceModelUid")).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getLatestByName("serviceProxy", null)).thenReturn(Either.left(new Resource()));
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class))).thenReturn(Either.left(getNewResource()));
+
+        final Map<String, String[]> substitutionMappingMap = new HashMap<>();
+        final String[] array = {"value1", "value2"};
+        substitutionMappingMap.put("key", array);
+        when(capabilityRequirementConverter.convertSubstitutionMappingCapabilities(anyMap(), any(Component.class)))
+                .thenReturn(Either.left(substitutionMappingMap));
+
+        when(capabilityRequirementConverter
+                .convertSubstitutionMappingRequirements(any(Component.class), anyMap()))
+                .thenReturn(Either.left(Collections.emptyMap()));
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "convertNodeTemplates", component, componentInstances,
-            componentInstancesProperties, new HashMap<>(), componentCache, dataTypes, topologyTemplate);
-        Assert.assertNotNull(result);
+        final Either<ToscaRepresentation, ToscaError> toscaRepresentationToscaErrorEither = testSubject.exportComponent(component);
+        assertNotNull(toscaRepresentationToscaErrorEither);
+
     }
 
     @Test
-    public void testConvertNodeTemplatesWhenComponentIsService() throws Exception {
-        Component component = getNewService();
-        List<ComponentInstance> componentInstances = new ArrayList<>();
-        Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
-        Map<String, List<ComponentInstanceProperty>> componentInstancesInterfaces = new HashMap<>();
-        Map<String, Component> componentCache = new HashMap<>();
-        Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
-        ToscaTopolgyTemplate topologyTemplate = new ToscaTopolgyTemplate();
-        Either<Map<String, ToscaNodeTemplate>, ToscaError> result;
-        Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
-        List<ComponentInstanceInput> inputs = new ArrayList<>();
-        inputs.add(new ComponentInstanceInput());
-        componentInstancesInputs.put("key", inputs);
-        List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
-        RequirementCapabilityRelDef reldef = new RequirementCapabilityRelDef();
+    void testConvertWithBooleanNodeFilterWhenComponentIsService() {
+        final Component component = getNewService();
+        final List<ComponentInstance> componentInstances = new ArrayList<>();
+        final Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
+        final Map<String, Component> componentCache = new HashMap<>();
+        final Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
+        final Map<String, CINodeFilterDataDefinition> componentInstanceNodeFilters = new HashMap<>();
+        CINodeFilterDataDefinition nodeFilter = new CINodeFilterDataDefinition();
+        PropertyFilterDataDefinition prop = new PropertyFilterDataDefinition();
+        prop.setName("nodeFilterPropBoolean");
+        prop.setType("boolean");
+        PropertyFilterConstraintDataDefinition constr = new PropertyFilterConstraintDataDefinition();
+        constr.setPropertyName(prop.getName());
+        constr.setOperator(ConstraintType.EQUAL);
+        constr.setValue("true");
+        constr.setOriginalType("boolean");
+        prop.setConstraints(List.of(constr));
+        ListDataDefinition<PropertyFilterDataDefinition> lstDataDef = new ListDataDefinition<>();
+        lstDataDef.add(prop);
+        nodeFilter.setProperties(lstDataDef);
+        final List<ComponentInstanceInput> inputs = new ArrayList<>();
+        final ComponentInstanceInput componentInstanceInput = new ComponentInstanceInput();
+        componentInstanceInput.setUniqueId("uuid");
+        inputs.add(componentInstanceInput);
+        componentInstancesInputs.put("uuid", inputs);
+        componentInstanceNodeFilters.put("uuid", nodeFilter);
+        final List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
+        final RequirementCapabilityRelDef reldef = new RequirementCapabilityRelDef();
         reldef.setFromNode("node");
         resourceInstancesRelations.add(reldef);
         component.setComponentInstancesRelations(resourceInstancesRelations);
 
-        ComponentInstance instance = new ComponentInstance();
+        final ComponentInstance instance = new ComponentInstance();
+        instance.setNodeFilter(nodeFilter);
         instance.setUniqueId("id");
         instance.setComponentUid("uid");
         instance.setOriginType(OriginTypeEnum.ServiceProxy);
-        List<GroupInstance> groupInstances = new ArrayList<>();
-        GroupInstance groupInst = new GroupInstance();
-        List<String> artifacts = new ArrayList<>();
+        final List<GroupInstance> groupInstances = new ArrayList<>();
+        final GroupInstance groupInst = new GroupInstance();
+        final List<String> artifacts = new ArrayList<>();
         artifacts.add("artifact");
         groupInst.setArtifacts(artifacts);
         groupInst.setType("type");
         groupInstances.add(groupInst);
         instance.setGroupInstances(groupInstances);
+
+        final List<PropertyDefinition> properties = new ArrayList<>();
+        properties.add(new PropertyDefinition());
+        instance.setProperties(properties);
+
+        instance.setUniqueId("uuid");
+        instance.setDescription("desc");
+        instance.setSourceModelUid("sourceModelUid");
+
         componentInstances.add(instance);
 
+        component.setComponentInstances(componentInstances);
+        component.setNodeFilterComponents(componentInstanceNodeFilters);
         component.setComponentInstancesInputs(componentInstancesInputs);
+
         component.setInvariantUUID("uuid");
         component.setUUID("uuid");
         component.setDescription("desc");
+        component.setUniqueId("uid");
 
-        Map<String, ForwardingPathDataDefinition> forwardingPaths = new HashMap<>();
-        ForwardingPathDataDefinition path = new ForwardingPathDataDefinition();
-        ListDataDefinition<ForwardingPathElementDataDefinition> list = new ListDataDefinition<>();
-        path.setPathElements(list);
-        forwardingPaths.put("key", path);
+        componentCache.put("uid", component);
 
-        ((Service) component).setForwardingPaths(forwardingPaths);
+        final List<ComponentInstanceProperty> componentInstanceProperties = new ArrayList<>();
+        componentInstanceProperties.add(new ComponentInstanceProperty());
 
-        componentCache.put("uid", component);
+        componentInstancesProperties.put("uuid", componentInstanceProperties);
+        component.setComponentInstancesProperties(componentInstancesProperties);
 
-        componentInstancesProperties.put("id", new ArrayList<>());
-        componentInstancesInterfaces.put("id", new ArrayList<>());
-        componentInstancesInputs.put("id", new ArrayList<>());
+        final Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes = new HashMap<>();
+        final List<ComponentInstanceAttribute> componentInstanceAttributes = new ArrayList<>();
+        final ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
+        componentInstanceAttribute.setDefaultValue("def value");
+        componentInstanceAttributes.add(componentInstanceAttribute);
+
+        componentInstancesAttributes.put("uuid", componentInstanceAttributes);
+        component.setComponentInstancesAttributes(componentInstancesAttributes);
+
+        ComponentInstanceProperty cip = new ComponentInstanceProperty();
+        cip.setInstanceUniqueId("id");
+
+        List<ComponentInstanceProperty> list = new ArrayList<>();
+        list.add(cip);
 
-        Mockito.when(capabiltyRequirementConvertor.getOriginComponent(any(Map.class),
-            any(ComponentInstance.class))).thenReturn(Either.left(component));
+        componentInstancesProperties.put("id", list);
+        component.setComponentInstancesProperties(componentInstancesProperties);
 
-        Mockito.when(capabiltyRequirementConvertor.convertComponentInstanceCapabilities(
-            any(ComponentInstance.class), any(Map.class), any(ToscaNodeTemplate.class)))
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.left(component));
+        when(capabilityRequirementConverter
+            .convertComponentInstanceCapabilities(any(ComponentInstance.class), anyMap(), any(ToscaNodeTemplate.class)))
             .thenReturn(Either.left(new ToscaNodeTemplate()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class), any(ToscaNodeType.class)))
+            .thenReturn(Either.left(new ToscaNodeType()));
+        when(toscaOperationFacade.getToscaFullElement("uid")).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getToscaFullElement("sourceModelUid")).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getLatestByName("serviceProxy", null)).thenReturn(Either.left(new Resource()));
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class))).thenReturn(Either.left(getNewResource()));
+
+        final Map<String, String[]> substitutionMappingMap = new HashMap<>();
+        final String[] array = {"value1", "value2"};
+        substitutionMappingMap.put("key", array);
+        when(capabilityRequirementConverter.convertSubstitutionMappingCapabilities(anyMap(), any(Component.class)))
+            .thenReturn(Either.left(substitutionMappingMap));
+
+        when(capabilityRequirementConverter
+            .convertSubstitutionMappingRequirements(any(Component.class), anyMap()))
+            .thenReturn(Either.left(Collections.emptyMap()));
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "convertNodeTemplates", component, componentInstances,
-            componentInstancesProperties, componentInstancesInterfaces, componentCache, dataTypes, topologyTemplate);
-        Assert.assertNotNull(result);
+        final Either<ToscaRepresentation, ToscaError> toscaRepresentationToscaErrorEither = testSubject.exportComponent(component);
+        assertNotNull(toscaRepresentationToscaErrorEither);
     }
 
     @Test
-    public void testConvertNodeTemplatesWhenConvertComponentInstanceCapabilitiesIsRight() throws Exception {
+    void testConvertNodeTemplatesWhenComponentIsResource() {
+        final Resource component = getNewResource();
+        component.setResourceType(VF);
+        final List<ComponentInstance> componentInstances = new ArrayList<>();
+        final Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
+        final Map<String, Component> componentCache = new HashMap<>();
+        final Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
+        final ToscaTopolgyTemplate topologyTemplate = new ToscaTopolgyTemplate();
+        final Either<Map<String, ToscaNodeTemplate>, ToscaError> result;
+        final Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
+        final List<ComponentInstanceInput> inputs = new ArrayList<>();
+        final ComponentInstanceInput componentInstanceInput = new ComponentInstanceInput();
+        componentInstanceInput.setUniqueId("uuid");
+        inputs.add(componentInstanceInput);
+        componentInstancesInputs.put("uuid", inputs);
+        final List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
+        final RequirementCapabilityRelDef reldef = new RequirementCapabilityRelDef();
+        reldef.setFromNode("node");
+        resourceInstancesRelations.add(reldef);
+        component.setComponentInstancesRelations(resourceInstancesRelations);
+
+        final ComponentInstance instance = new ComponentInstance();
+        instance.setUniqueId("id");
+        instance.setComponentUid("uid");
+        instance.setOriginType(OriginTypeEnum.VFC);
+        final List<GroupInstance> groupInstances = new ArrayList<>();
+        final GroupInstance groupInst = new GroupInstance();
+        final List<String> artifacts = new ArrayList<>();
+        artifacts.add("artifact");
+        groupInst.setArtifacts(artifacts);
+        groupInst.setType("type");
+        groupInstances.add(groupInst);
+        instance.setGroupInstances(groupInstances);
+
+        final List<PropertyDefinition> properties = new ArrayList<>();
+        properties.add(new PropertyDefinition());
+        instance.setProperties(properties);
+        component.setProperties(properties);
+
+        instance.setUniqueId("uuid");
+        instance.setDescription("desc");
+        instance.setSourceModelUid("sourceModelUid");
+        final Map<String, ArtifactDefinition> artifactList = new HashMap<>();
+        final ArtifactDefinition artifact = new ArtifactDefinition();
+        artifact.setArtifactName("name.name2");
+        artifactList.put("assettoscatemplate", artifact);
+        instance.setArtifacts(artifactList);
+
+        Map<String, ToscaArtifactDataDefinition> toscaArtifactDataDefinitionMap = new HashMap<>();
+        toscaArtifactDataDefinitionMap.put("assettoscatemplate", new ToscaArtifactDataDefinition());
+        instance.setToscaArtifacts(toscaArtifactDataDefinitionMap);
+
+        componentInstances.add(instance);
+
+        component.setComponentInstances(componentInstances);
+
+        component.setComponentInstancesInputs(componentInstancesInputs);
+        component.setInvariantUUID("uuid");
+        component.setUUID("uuid");
+        component.setDescription("desc");
+        component.setUniqueId("uid");
+
+        componentCache.put("uid", component);
+
+        final List<ComponentInstanceProperty> componentInstanceProperties = new ArrayList<>();
+        componentInstanceProperties.add(new ComponentInstanceProperty());
+
+        componentInstancesProperties.put("uuid", componentInstanceProperties);
+        component.setComponentInstancesProperties(componentInstancesProperties);
+
+        final Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes = new HashMap<>();
+        final List<ComponentInstanceAttribute> componentInstanceAttributes = new ArrayList<>();
+        final ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
+        componentInstanceAttribute.setDefaultValue("def value");
+        componentInstanceAttributes.add(componentInstanceAttribute);
+
+        componentInstancesAttributes.put("uuid", componentInstanceAttributes);
+        component.setComponentInstancesAttributes(componentInstancesAttributes);
+
+        component.setArtifacts(artifactList);
+        component.setToscaArtifacts(artifactList);
+
+        final List<AttributeDefinition> attributes = new ArrayList<>();
+        final var attribute = new AttributeDefinition();
+        attribute.setName("mock");
+        attributes.add(attribute);
+        component.setAttributes(attributes);
+
+        List<ComponentInstanceInput> componentInstanceInputs = new ArrayList<>();
+        componentInstanceInputs.add(new ComponentInstanceInput());
+
+        componentInstancesInputs.put("id", componentInstanceInputs);
+        component.setComponentInstancesInputs(componentInstancesInputs);
+
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.left(component));
+        when(capabilityRequirementConverter
+                .convertComponentInstanceCapabilities(any(ComponentInstance.class), anyMap(), any(ToscaNodeTemplate.class)))
+                .thenReturn(Either.left(new ToscaNodeTemplate()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class), any(ToscaNodeType.class)))
+                .thenReturn(Either.left(new ToscaNodeType()));
+        when(toscaOperationFacade.getToscaFullElement("uid")).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getToscaFullElement("sourceModelUid")).thenReturn(Either.left(component));
+        when(toscaOperationFacade.getLatestByName("serviceProxy", null)).thenReturn(Either.left(new Resource()));
+
+        Resource newResource = getNewResource();
+        InputDefinition input = new InputDefinition();
+        input.setName(COMPONENT_INPUT_NAME);
+        input.setType(COMPONENT_INPUT_TYPE);
+        newResource.setInputs(Collections.singletonList(input));
+
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
+
+        final Map<String, String[]> substitutionMappingMap = new HashMap<>();
+        final String[] array = {"value1", "value2"};
+        substitutionMappingMap.put("key", array);
+        when(capabilityRequirementConverter.convertSubstitutionMappingCapabilities(anyMap(), any(Component.class)))
+                .thenReturn(Either.left(substitutionMappingMap));
+
+        when(capabilityRequirementConverter
+                .convertSubstitutionMappingRequirements(any(Component.class), anyMap()))
+                .thenReturn(Either.left(Collections.emptyMap()));
+
+        // default test
+        final Either<ToscaRepresentation, ToscaError> toscaRepresentationToscaErrorEither = testSubject.exportComponent(newResource);
+        assertNotNull(toscaRepresentationToscaErrorEither);
+
+    }
+
+    @Test
+    void testConvertNodeTemplatesWhenConvertComponentInstanceCapabilitiesIsRight() {
         Component component = getNewResource();
         List<ComponentInstance> componentInstances = new ArrayList<>();
         Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
@@ -727,6 +1059,7 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         instance.setComponentUid("uid");
         instance.setOriginType(OriginTypeEnum.ServiceProxy);
         componentInstances.add(instance);
+        component.setComponentInstances(componentInstances);
 
         component.setComponentInstancesInputs(componentInstancesInputs);
         component.setInvariantUUID("uuid");
@@ -735,21 +1068,22 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         componentCache.put("uid", component);
 
-        Mockito.when(capabiltyRequirementConvertor.getOriginComponent(any(Map.class),
-            any(ComponentInstance.class))).thenReturn(Either.left(component));
-
-        Mockito.when(capabiltyRequirementConvertor.convertComponentInstanceCapabilities(
-            any(ComponentInstance.class), any(Map.class), any(ToscaNodeTemplate.class)))
-            .thenReturn(Either.right(ToscaError.GENERAL_ERROR));
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.left(component));
+        when(capabilityRequirementConverter
+                .convertComponentInstanceCapabilities(any(ComponentInstance.class), anyMap(), any(ToscaNodeTemplate.class)))
+                .thenReturn(Either.right(ToscaError.GENERAL_ERROR));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
+                any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "convertNodeTemplates", component, componentInstances,
-            componentInstancesProperties, componentInstancesInterfaces, componentCache, dataTypes, topologyTemplate);
-        Assert.assertNotNull(result);
+        final Either<ToscaRepresentation, ToscaError> toscaRepresentationToscaErrorEither = testSubject.exportComponent(component);
+        assertNotNull(toscaRepresentationToscaErrorEither);
     }
 
     @Test
-    public void testConvetNodeTemplateWhenGetOriginComponentIsRight() throws Exception {
+    void testConvetNodeTemplateWhenGetOriginComponentIsRight() {
         Component component = getNewResource();
         List<ComponentInstance> componentInstances = new ArrayList<>();
         Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
@@ -773,33 +1107,42 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         instance.setComponentUid("uid");
         instance.setOriginType(OriginTypeEnum.ServiceProxy);
         componentInstances.add(instance);
+        component.setComponentInstances(componentInstances);
 
         component.setComponentInstancesInputs(componentInstancesInputs);
         component.setInvariantUUID("uuid");
         component.setUUID("uuid");
         component.setDescription("desc");
 
+        final List<AttributeDefinition> attributes = new ArrayList<>();
+        final var attribute = new AttributeDefinition();
+        attribute.setName("mock");
+        attributes.add(attribute);
+        component.setAttributes(attributes);
+
         componentCache.put("uid", component);
 
-        Mockito.when(capabiltyRequirementConvertor.getOriginComponent(any(Map.class),
-            any(ComponentInstance.class))).thenReturn(Either.right(false));
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.right(false));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
+                any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "convertNodeTemplates", component, componentInstances,
-            componentInstancesProperties, componentInstancesInterfaces, componentCache, dataTypes, topologyTemplate);
-        Assert.assertNotNull(result);
+        final Either<ToscaRepresentation, ToscaError> toscaRepresentationToscaErrorEither = testSubject.exportComponent(component);
+        assertNotNull(toscaRepresentationToscaErrorEither);
     }
 
     @Test
-    public void testConvertNodeTemplatesWhenConvertComponentInstanceRequirmentsIsRight() {
-        Component component = new Resource();
+    void testConvertNodeTemplatesWhenConvertComponentInstanceRequirmentsIsRight() {
+        Resource component = getNewResource();
+        component.setResourceType(VF);
         List<ComponentInstance> componentInstances = new ArrayList<>();
         Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
         Map<String, List<ComponentInstanceProperty>> componentInstancesInterfaces = new HashMap<>();
         Map<String, Component> componentCache = new HashMap<>();
         Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
         ToscaTopolgyTemplate topologyTemplate = new ToscaTopolgyTemplate();
-        Either<Map<String, ToscaNodeTemplate>, ToscaError> result;
         Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
         List<ComponentInstanceInput> inputs = new ArrayList<>();
         inputs.add(new ComponentInstanceInput());
@@ -810,87 +1153,48 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         reldef.setToNode("node");
         List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
         CapabilityRequirementRelationship relationship = new CapabilityRequirementRelationship();
-        relationship.setRelation(new RelationshipInfo());
+        relationship.setRelation(new RelationshipInfo("requirement", new RelationshipImpl()));
         relationships.add(relationship);
         reldef.setRelationships(relationships);
         resourceInstancesRelations.add(reldef);
         component.setComponentInstancesRelations(resourceInstancesRelations);
 
+        Map<String, ArtifactDefinition> artifactList = new HashMap<>();
+        ArtifactDefinition artifact = new ArtifactDefinition();
+        artifact.setArtifactName("name.name2");
+        artifactList.put("assettoscatemplate", artifact);
+        component.setArtifacts(artifactList);
+        component.setToscaArtifacts(artifactList);
+        component.setRequirements(Collections.singletonMap("mock", Collections.singletonList(new RequirementDefinition())));
+
         ComponentInstance instance = new ComponentInstance();
         instance.setUniqueId("id");
+        instance.setComponentUid("id");
+        instance.setOriginType(OriginTypeEnum.VF);
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        requirements.put("mock1", Collections.singletonList(new RequirementDefinition()));
+        instance.setRequirements(requirements);
         componentInstances.add(instance);
 
         component.setComponentInstancesInputs(componentInstancesInputs);
         component.setComponentInstances(componentInstances);
 
-        Mockito.when(capabiltyRequirementConvertor.getOriginComponent(any(Map.class),
-            any(ComponentInstance.class))).thenReturn(Either.left(component));
-
-        // default test
-        result = Deencapsulation.invoke(testSubject, "convertNodeTemplates", component, componentInstances,
-            componentInstancesProperties, componentInstancesInterfaces, componentCache, dataTypes, topologyTemplate);
-        Assert.assertNotNull(result);
-    }
-
-    @Test
-    public void testAddComponentInstanceInputs() throws Exception {
-
-        Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
-        Map<String, List<ComponentInstanceInput>> componentInstancesInputs = new HashMap<>();
-        ComponentInstance componentInstance = new ComponentInstance();
-        String instanceUniqueId = "id";
-        Map<String, Object> props = new HashMap<>();
-
-        List<ComponentInstanceInput> componentInstanceInputs = new ArrayList<>();
-        componentInstanceInputs.add(new ComponentInstanceInput());
-
-        componentInstancesInputs.put(instanceUniqueId, componentInstanceInputs);
-
-        // default test
-        Deencapsulation.invoke(testSubject, "addComponentInstanceInputs", dataTypes, componentInstancesInputs,
-            instanceUniqueId, props);
-    }
-
-    @Test
-    public void testAddPropertiesOfComponentInstance() throws Exception {
-        Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = new HashMap<>();
-        Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
-        ComponentInstance componentInstance = new ComponentInstance();
-        String instanceUniqueId = "id";
-        Map<String, Object> props = new HashMap<>();
-
-        ComponentInstanceProperty cip = new ComponentInstanceProperty();
-        cip.setInstanceUniqueId("id");
-
-        List<ComponentInstanceProperty> list = new ArrayList<>();
-        list.add(cip);
-
-        componentInstancesProperties.put("id", list);
-
-        // default test
-        Deencapsulation.invoke(testSubject, "addPropertiesOfComponentInstance", componentInstancesProperties, dataTypes,
-            instanceUniqueId, props);
-    }
-
-    @Test
-    public void testAddPropertiesOfParentComponent() throws Exception {
-        Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
-        ComponentInstance componentInstance = new ComponentInstance();
-        Component componentOfInstance = new Resource();
-        Map<String, Object> props = new HashMap<>();
-
-        List<PropertyDefinition> properties = new ArrayList<>();
-        properties.add(new PropertyDefinition());
-
-        ((Resource) componentOfInstance).setProperties(properties);
+        doReturn(Either.left(component)).when(toscaOperationFacade).getToscaFullElement("id");
+        when(capabilityRequirementConverter.getOriginComponent(anyMap(), any(ComponentInstance.class))).thenReturn(Either.left(component));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Resource.class),
+                any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class)))
+                .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
 
         // default test
-        Deencapsulation.invoke(testSubject, "addPropertiesOfParentComponent", dataTypes,
-            componentOfInstance, props);
+        final Either<ToscaRepresentation, ToscaError> result = testSubject.exportComponent(component);
+        assertNotNull(result);
     }
 
     @Test
-    public void testCreateNodeType() throws Exception {
+    void testCreateNodeType() {
 
         Component component = new Resource();
         List<String> array = new ArrayList<>();
@@ -900,16 +1204,16 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         // test when component is resource
         result = Deencapsulation.invoke(testSubject, "createNodeType", component);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
 
         component = new Service();
         // test when component is service
         result = Deencapsulation.invoke(testSubject, "createNodeType", component);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
     }
 
     @Test
-    public void testCreateProxyInterfaceTypesComponentNotFound() throws Exception {
+    void testCreateProxyInterfaceTypesComponentNotFound() {
         Component container = new Service();
         Either<Map<String, ToscaNodeType>, ToscaError> result;
         List<ComponentInstance> componentInstances = new ArrayList<>();
@@ -920,15 +1224,15 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         componentInstances.add(instance);
         container.setComponentInstances(componentInstances);
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class)))
-            .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
+        when(toscaOperationFacade.getToscaElement(any(String.class),
+                any(ComponentParametersView.class)))
+                .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
         result = Deencapsulation.invoke(testSubject, "createProxyInterfaceTypes", container);
-        Assert.assertTrue(result.isRight());
+        assertTrue(result.isRight());
     }
 
     @Test
-    public void testCreateProxyInterfaceTypesWhenInterfaceLifecycleFetchFailed() {
+    void testCreateProxyInterfaceTypesWhenInterfaceLifecycleFetchFailed() {
         Component container = new Service();
         Either<Map<String, ToscaNodeType>, ToscaError> result;
         List<ComponentInstance> componentInstances = new ArrayList<>();
@@ -939,17 +1243,17 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         componentInstances.add(instance);
         container.setComponentInstances(componentInstances);
 
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class)))
-            .thenReturn(Either.left(new Resource()));
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
+        when(toscaOperationFacade.getToscaElement(any(String.class),
+                any(ComponentParametersView.class)))
+                .thenReturn(Either.left(new Resource()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
         result = Deencapsulation.invoke(testSubject, "createProxyInterfaceTypes", container);
-        Assert.assertTrue(result.isRight());
+        assertTrue(result.isRight());
     }
 
     @Test
-    public void testCreateProxyInterfaceTypesPositive() {
+    void testCreateProxyInterfaceTypesPositive() {
         Component container = new Service();
         Either<Map<String, ToscaNodeType>, ToscaError> result;
         List<ComponentInstance> componentInstances = new ArrayList<>();
@@ -960,25 +1264,24 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         componentInstances.add(instance);
         container.setComponentInstances(componentInstances);
 
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(Collections.emptyMap()));
 
         Component proxyResource = new Resource();
         Map<String, InterfaceDefinition> proxyInterfaces = new HashMap<>();
         proxyInterfaces.put("Local", new InterfaceDefinition("Local", "desc", new HashMap<>()));
         proxyResource.setInterfaces(proxyInterfaces);
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class)))
-            .thenReturn(Either.left(proxyResource));
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class))).thenReturn(Either.left(proxyResource));
+        when(interfacesOperationsConverter.addInterfaceTypeElement(any(Component.class), anyList()))
+                .thenReturn(Collections.singletonMap(LOCAL_INTERFACE_TYPE, new HashMap<>()));
 
         result = Deencapsulation.invoke(testSubject, "createProxyInterfaceTypes", container);
-        Assert.assertNotNull(result);
-        Assert.assertTrue(result.isLeft());
-        Assert.assertEquals(1, result.left().value().size());
+        assertNotNull(result);
+        assertTrue(result.isLeft());
+        assertEquals(1, result.left().value().size());
     }
 
     @Test
-    public void testCreateProxyNodeTypes() throws Exception {
+    void testCreateProxyNodeTypes() {
         Map<String, Component> componentCache = new HashMap<>();
         Component container = new Resource();
         Either<Map<String, ToscaNodeType>, ToscaError> result;
@@ -990,18 +1293,18 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         componentInstances.add(instance);
         container.setComponentInstances(componentInstances);
 
-        Mockito.when(toscaOperationFacade.getLatestByName("serviceProxy"))
-            .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
+        when(toscaOperationFacade.getLatestByName("serviceProxy", null))
+                .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
 
         // test when getLatestByName return is right
         result = Deencapsulation.invoke(testSubject, "createProxyNodeTypes", componentCache, container);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
     }
-    
+
     @Test
-    public void testCreateServiceSubstitutionNodeTypes() throws Exception {
+    void testCreateServiceSubstitutionNodeTypes() {
         Map<String, Component> componentCache = new HashMap<>();
-              
+
         Component referencedService = getNewService();
         referencedService.setInvariantUUID("uuid");
         referencedService.setUUID("uuid");
@@ -1017,21 +1320,21 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         componentInstances.add(instance);
         containerService.setComponentInstances(componentInstances);
-        
-        Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
-            .thenReturn(Either.left(Collections.emptyMap()));
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
-        Mockito.when(capabiltyRequirementConvertor.convertRequirements(any(Map.class), any(Service.class),
-            any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
+
+        when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes(any()))
+                .thenReturn(Either.left(Collections.emptyMap()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
+        when(capabilityRequirementConverter.convertRequirements(anyMap(), any(Service.class),
+                any(ToscaNodeType.class))).thenReturn(Either.left(new ToscaNodeType()));
 
         ToscaTemplate toscaNode = new ToscaTemplate("1_1");
 
         Deencapsulation.invoke(testSubject, "createServiceSubstitutionNodeTypes", componentCache, containerService, toscaNode);
-        Assert.assertNotNull(toscaNode.getNode_types());
+        assertNotNull(toscaNode.getNode_types());
     }
 
     @Test
-    public void testCreateProxyNodeTypesWhenGetLatestByNameReturnValue() {
+    void testCreateProxyNodeTypesWhenGetLatestByNameReturnValue() {
         Map<String, Component> componentCache = new HashMap<>();
         Component container = new Resource();
         Either<Map<String, ToscaNodeType>, ToscaError> result;
@@ -1043,41 +1346,41 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         componentInstances.add(instance);
         container.setComponentInstances(componentInstances);
 
-        Mockito.when(toscaOperationFacade.getLatestByName("serviceProxy")).thenReturn(Either.left(new Resource()));
+        when(toscaOperationFacade.getLatestByName("serviceProxy", null)).thenReturn(Either.left(new Resource()));
 
         ComponentParametersView parameterView = new ComponentParametersView();
         parameterView.disableAll();
         parameterView.setIgnoreCategories(false);
 
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class)))
-            .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
+        when(toscaOperationFacade.getToscaElement(any(String.class),
+                any(ComponentParametersView.class)))
+                .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
 
         // test when getLatestByName is left
         result = Deencapsulation.invoke(testSubject, "createProxyNodeTypes", componentCache, container);
-        Assert.assertNotNull(result);
+        assertNotNull(result);
     }
 
     @Test
-    public void testCreateProxyNodeType() throws Exception {
+    void testCreateProxyNodeType() {
         Map<String, Component> componentCache = new HashMap<>();
         Component origComponent = new Resource();
         Component proxyComponent = new Resource();
         ComponentInstance instance = new ComponentInstance();
         ToscaNodeType result;
 
-        Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
+        when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
 
         // default test
         result = Deencapsulation.invoke(testSubject, "createProxyNodeType", componentCache, origComponent,
-            proxyComponent, instance);
-        Assert.assertNotNull(result);
+                proxyComponent, instance);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertComponentInstanceRequirements() throws Exception {
+    void testConvertComponentInstanceRequirements() {
         Component component = new Resource();
         ComponentInstance componentInstance = new ComponentInstance();
         List<RequirementCapabilityRelDef> relations = new ArrayList<>();
@@ -1088,8 +1391,8 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         // default test
         result = Deencapsulation.invoke(testSubject, "convertComponentInstanceRequirements", component,
-            componentInstance, relations, nodeTypeTemplate, originComponent, componentCache);
-        Assert.assertNotNull(result);
+                componentInstance, relations, nodeTypeTemplate, originComponent, componentCache);
+        assertNotNull(result);
 
         RequirementCapabilityRelDef reldef = new RequirementCapabilityRelDef();
         reldef.setFromNode("name");
@@ -1108,154 +1411,198 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         // test when filteredRElations ins't empty
         result = Deencapsulation.invoke(testSubject, "convertComponentInstanceRequirements", component,
-            componentInstance, relations, nodeTypeTemplate, originComponent, componentCache);
-        Assert.assertNotNull(result);
+                componentInstance, relations, nodeTypeTemplate, originComponent, componentCache);
+        assertNotNull(result);
     }
 
     @Test
-    public void testAddRequirement() throws Exception {
-        ComponentInstance fromInstance = new ComponentInstance();
-        Component fromOriginComponent = new Resource();
-        List<ComponentInstance> instancesList = new ArrayList<>();
-        RequirementCapabilityRelDef rel = new RequirementCapabilityRelDef();
-        List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
-        Map<String, Component> componentCache = new HashMap<>();
-        boolean result;
-
-        List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
-        CapabilityRequirementRelationship cap = new CapabilityRequirementRelationship();
-        cap.setRequirement(new RequirementDataDefinition());
-        RelationshipInfo relation = new RelationshipInfo();
-        relation.setRequirementUid("Uid");
-        relation.setRequirement("requirment");
-        relation.setCapability("cap");
-        relation.setCapabilityOwnerId("id1");
-        cap.setRelation(relation);
-        relationships.add(cap);
-        rel.setRelationships(relationships);
-        rel.setToNode("name");
-        fromInstance.setUniqueId("name");
-        fromInstance.setComponentUid("string");
+    void buildRequirementFailure() {
+        final Component fromOriginComponent = new Resource();
+        final ComponentInstance fromInstance = new ComponentInstance();
+        final String fromInstanceUid = "fromInstanceUid";
+        fromInstance.setUniqueId(fromInstanceUid);
+        fromInstance.setComponentUid("componentUid");
+        final RequirementCapabilityRelDef relationshipDefinition = new RequirementCapabilityRelDef();
+        relationshipDefinition.setToNode("wrongNodeUid");
+        final List<CapabilityRequirementRelationship> relationshipList = new ArrayList<>();
+        final CapabilityRequirementRelationship relationship = new CapabilityRequirementRelationship();
+        relationship.setRequirement(new RequirementDataDefinition());
+        relationshipList.add(relationship);
+        relationshipDefinition.setRelationships(relationshipList);
+        final List<ComponentInstance> instancesList = new ArrayList<>();
         instancesList.add(fromInstance);
-        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
-        fromOriginComponent.setRequirements(requirements);
-
-        // default test
-        result = Deencapsulation.invoke(testSubject, "addRequirement", fromInstance, fromOriginComponent, instancesList,
-            rel, toscaRequirements, componentCache);
-        Assert.assertNotNull(result);
+        String expectedError = String
+                .format("Failed to find a relation from the node %s to the node %s", fromInstance.getName(),
+                        relationshipDefinition.getToNode());
+        assertDoesNotThrow(() ->
+                Deencapsulation.invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent,
+                        instancesList, relationshipDefinition, new HashMap<>()), expectedError);
+
+        try {
+            Deencapsulation.invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent,
+                    instancesList, relationshipDefinition, new HashMap<>());
+        } catch (Exception e) {
+            assertTrue(e instanceof ToscaExportException);
+            assertEquals(expectedError, e.getMessage());
+        }
+
+        final RelationshipInfo relation = new RelationshipInfo();
+        final String requirementUid = "Uid";
+        relation.setRequirementUid(requirementUid);
+        final String requirementName = "requirementName";
+        relation.setRequirement(requirementName);
+        final String capabilityName = "capabilityName";
+        relation.setCapability(capabilityName);
+        final String capabilityOwnerId = "capabilityOwnerId";
+        relation.setCapabilityOwnerId(capabilityOwnerId);
+        relationship.setRelation(relation);
+
+        final Map<String, List<RequirementDefinition>> requirementMap = new HashMap<>();
+        final RequirementDefinition requirementDefinition = new RequirementDefinition();
+        requirementMap.put(requirementUid, Collections.singletonList(requirementDefinition));
+        fromOriginComponent.setRequirements(requirementMap);
+        relationshipDefinition.setToNode(fromInstanceUid);
+
+        expectedError = String
+                .format("Failed to find a requirement with uniqueId %s on a component with uniqueId %s",
+                        relation.getRequirementUid(), fromOriginComponent.getUniqueId());
+
+        assertThrows(ToscaExportException.class, () ->
+                Deencapsulation.invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent,
+                        instancesList, relationshipDefinition, new HashMap<>()), expectedError);
+
+        requirementDefinition.setName(requirementName);
+
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class)))
+                .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+
+        expectedError = String.format(
+                "Failed to build substituted name for the requirement %s. "
+                        + "Failed to get an origin component with uniqueId %s",
+                requirementName, fromInstance.getActualComponentUid());
+        assertThrows(ToscaExportException.class, () -> Deencapsulation
+                .invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent, instancesList,
+                        relationshipDefinition, new HashMap<>()), expectedError);
+
+        final Component toOriginComponent = new Resource();
+        final Map<String, List<CapabilityDefinition>> capabilityMap = new HashMap<>();
+        final CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+
+        capabilityDefinition.setName(capabilityName);
+        capabilityDefinition.setOwnerId(capabilityOwnerId);
+        capabilityDefinition.setType("aType");
+        final String capabilityPreviousName = "capabilityPreviousName";
+        capabilityDefinition.setPreviousName(capabilityPreviousName);
+        capabilityMap.put(capabilityName, Collections.singletonList(capabilityDefinition));
+        toOriginComponent.setCapabilities(capabilityMap);
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class)))
+                .thenReturn(Either.left(toOriginComponent));
+
+        requirementDefinition.setCapability(capabilityName);
+        relation.setCapability("wrong");
+        final String requirementPreviousName = "requirementPreviousName";
+        requirementDefinition.setPreviousName(requirementPreviousName);
+        requirementDefinition.setPath(new ArrayList<>());
+
+        expectedError = String
+                .format("Failed to find a capability with name %s on a component with uniqueId %s",
+                        relation.getCapability(), fromOriginComponent.getUniqueId());
+
+        assertThrows(ToscaExportException.class, () -> Deencapsulation
+                        .invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent, instancesList,
+                                relationshipDefinition, new HashMap<>()),
+                expectedError);
     }
 
     @Test
-    public void testAddRequirmentsWhenFindRequirmentsReturnsValue() {
-
-        ComponentInstance fromInstance = new ComponentInstance();
-        Component fromOriginComponent = new Resource();
-        List<ComponentInstance> instancesList = new ArrayList<>();
-        RequirementCapabilityRelDef rel = new RequirementCapabilityRelDef();
-        List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
-        Map<String, Component> componentCache = new HashMap<>();
-        boolean result;
-
-        List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
-        CapabilityRequirementRelationship cap = new CapabilityRequirementRelationship();
-        cap.setRequirement(new RequirementDataDefinition());
-        RelationshipInfo relation = new RelationshipInfo();
-        relation.setRequirementUid("Uid");
-        relation.setRequirement("requirment");
-        relation.setCapability("cap");
-        relation.setCapabilityOwnerId("id1");
-        cap.setRelation(relation);
-        relationships.add(cap);
-        rel.setRelationships(relationships);
-        rel.setToNode("name");
+    void testBuildRequirement() {
+        final ComponentInstance fromInstance = new ComponentInstance();
         fromInstance.setUniqueId("name");
         fromInstance.setComponentUid("string");
+        final List<ComponentInstance> instancesList = new ArrayList<>();
+
+        final Map<String, Component> componentCache = new HashMap<>();
+        final List<CapabilityRequirementRelationship> relationshipList = new ArrayList<>();
+        final CapabilityRequirementRelationship relationship = new CapabilityRequirementRelationship();
+        relationship.setRequirement(new RequirementDataDefinition());
+        final RelationshipInfo relation = new RelationshipInfo();
+        final String requirementUid = "Uid";
+        relation.setRequirementUid(requirementUid);
+        final String requirementName = "requirementName";
+        relation.setRequirement(requirementName);
+        final String capabilityName = "capabilityName";
+        relation.setCapability(capabilityName);
+        final String capabilityOwnerId = "capabilityOwnerId";
+        relation.setCapabilityOwnerId(capabilityOwnerId);
+        relationship.setRelation(relation);
+        relationshipList.add(relationship);
+        final RequirementCapabilityRelDef relationshipDefinition = new RequirementCapabilityRelDef();
+        relationshipDefinition.setRelationships(relationshipList);
+        relationshipDefinition.setToNode("name");
         instancesList.add(fromInstance);
-        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
-
-        List<RequirementDefinition> defs = new ArrayList<>();
-        RequirementDefinition def = new RequirementDefinition();
-        def.setName("requirment");
-        def.setCapability("cap");
-        defs.add(def);
-        requirements.put("key", defs);
-        fromOriginComponent.setRequirements(requirements);
-
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class)))
-            .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
-
-        // default test
-        result = Deencapsulation.invoke(testSubject, "addRequirement", fromInstance, fromOriginComponent, instancesList,
-            rel, toscaRequirements, componentCache);
-        Assert.assertNotNull(result);
+        final RequirementDefinition requirementDefinition = new RequirementDefinition();
+        requirementDefinition.setName(requirementName);
+        requirementDefinition.setCapability(capabilityName);
+        final String requirementPreviousName = "requirementPreviousName";
+        requirementDefinition.setPreviousName(requirementPreviousName);
+        requirementDefinition.setPath(new ArrayList<>());
+        final Map<String, List<RequirementDefinition>> requirementMap = new HashMap<>();
+        requirementMap.put(requirementUid, Collections.singletonList(requirementDefinition));
+        final Component fromOriginComponent = new Resource();
+        fromOriginComponent.setRequirements(requirementMap);
+
+        final Map<String, List<CapabilityDefinition>> capabilityMap = new HashMap<>();
+        final CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setName(capabilityName);
+        capabilityDefinition.setOwnerId(capabilityOwnerId);
+        final String capabilityPreviousName = "capabilityPreviousName";
+        capabilityDefinition.setPreviousName(capabilityPreviousName);
+        capabilityMap.put(capabilityName, Collections.singletonList(capabilityDefinition));
+        final Component toOriginComponent = new Resource();
+        toOriginComponent.setCapabilities(capabilityMap);
+
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class)))
+                .thenReturn(Either.left(toOriginComponent));
+        final String builtCapabilityName = "builtCapabilityName";
+        when(
+                capabilityRequirementConverter
+                        .buildSubstitutedName(anyMap(), eq(toOriginComponent), anyList(), eq(capabilityName), eq(
+                                capabilityPreviousName), any()))
+                .thenReturn(Either.left(builtCapabilityName));
+
+        final String builtRequirementName = "builtRequirementName";
+        when(
+                capabilityRequirementConverter
+                        .buildSubstitutedName(anyMap(), eq(fromOriginComponent), anyList(), eq(requirementName), eq(
+                                requirementPreviousName), any()))
+                .thenReturn(Either.left(builtRequirementName));
+
+        final Map<String, ToscaTemplateRequirement> actualRequirementMap =
+                Deencapsulation.invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent,
+                        instancesList, relationshipDefinition, componentCache);
+        assertNotNull(actualRequirementMap);
+        assertFalse(actualRequirementMap.isEmpty());
+        assertTrue(actualRequirementMap.containsKey(builtRequirementName));
+        final ToscaTemplateRequirement actualToscaTemplateRequirement = actualRequirementMap.get(builtRequirementName);
+        assertNotNull(actualToscaTemplateRequirement);
+        assertEquals(builtCapabilityName, actualToscaTemplateRequirement.getCapability());
+
+        //to toOriginComponent not found
+        when(toscaOperationFacade.getToscaElement(any(String.class), any(ComponentParametersView.class)))
+                .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+
+        assertThrows(ToscaExportException.class, () -> Deencapsulation.invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent,
+                instancesList, relationshipDefinition, componentCache));
     }
 
     @Test
-    public void testAddRequirmentsWhenCapabilityBelongsToRelation() {
+    void testAddRequirmentsWithBuildAndAddRequirements() {
         ComponentInstance fromInstance = new ComponentInstance();
         Component fromOriginComponent = new Resource();
         List<ComponentInstance> instancesList = new ArrayList<>();
         RequirementCapabilityRelDef rel = new RequirementCapabilityRelDef();
         List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
         Map<String, Component> componentCache = new HashMap<>();
-        boolean result;
-
-        List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
-        CapabilityRequirementRelationship cap = new CapabilityRequirementRelationship();
-        cap.setRequirement(new RequirementDataDefinition());
-        RelationshipInfo relation = new RelationshipInfo();
-        relation.setRequirementUid("Uid");
-        relation.setRequirement("requirment");
-        relation.setCapability("cap");
-        relation.setCapabilityOwnerId("id1");
-        cap.setRelation(relation);
-        relationships.add(cap);
-        rel.setRelationships(relationships);
-        rel.setToNode("name");
-        fromInstance.setUniqueId("name");
-        fromInstance.setComponentUid("string");
-        instancesList.add(fromInstance);
-        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
-
-        List<RequirementDefinition> defs = new ArrayList<>();
-        RequirementDefinition def = new RequirementDefinition();
-        def.setName("requirment");
-        def.setCapability("cap");
-        defs.add(def);
-        requirements.put("key", defs);
-        fromOriginComponent.setRequirements(requirements);
-
-        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
-        List<CapabilityDefinition> caps = new ArrayList<>();
-        CapabilityDefinition capdef = new CapabilityDefinition();
-        capdef.setOwnerId("id");
-        capdef.setName("name");
-        capdef.setType("type");
-        caps.add(capdef);
-        capabilities.put("cap", caps);
-
-        fromOriginComponent.setCapabilities(capabilities);
-
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class))).thenReturn(Either.left(fromOriginComponent));
-
-        // default test
-        result = Deencapsulation.invoke(testSubject, "addRequirement", fromInstance, fromOriginComponent, instancesList,
-            rel, toscaRequirements, componentCache);
-        Assert.assertNotNull(result);
-    }
-
-    @Test
-    public void testAddRequirmentsWithBuildAndAddRequirements() {
-        ComponentInstance fromInstance = new ComponentInstance();
-        Component fromOriginComponent = new Resource();
-        List<ComponentInstance> instancesList = new ArrayList<>();
-        RequirementCapabilityRelDef rel = new RequirementCapabilityRelDef();
-        List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
-        Map<String, Component> componentCache = new HashMap<>();
-        boolean result;
 
         List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
         CapabilityRequirementRelationship cap = new CapabilityRequirementRelationship();
@@ -1293,23 +1640,26 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         capabilities.put("cap", caps);
         fromOriginComponent.setCapabilities(capabilities);
 
-        Mockito.when(toscaOperationFacade.getToscaElement(any(String.class),
-            any(ComponentParametersView.class))).thenReturn(Either.left(fromOriginComponent));
+        when(toscaOperationFacade.getToscaElement(any(String.class),
+                any(ComponentParametersView.class))).thenReturn(Either.left(fromOriginComponent));
 
-        Mockito.when(
-            capabiltyRequirementConvertor
-                .buildSubstitutedName(anyMap(), any(Component.class), anyList(), anyString(), anyString()))
-            .thenReturn(Either.right(false));
+        when(
+                capabilityRequirementConverter
+                        .buildSubstitutedName(anyMap(), any(Component.class), anyList(), anyString(), anyString(), any()))
+                .thenReturn(Either.right(false));
 
-        // default test
-        result = Deencapsulation.invoke(testSubject, "addRequirement", fromInstance, fromOriginComponent, instancesList,
-            rel, toscaRequirements, componentCache);
-        Assert.assertNotNull(result);
+        final String expectedErrorMsg =
+                String.format("Failed to build a substituted capability name for the capability "
+                                + "with name %s on a component with uniqueId %s",
+                        cap.getRequirement(), fromOriginComponent.getUniqueId());
+
+        assertThrows(ToscaExportException.class, () ->
+                Deencapsulation.invoke(testSubject, "buildRequirement", fromInstance, fromOriginComponent, instancesList,
+                        rel, componentCache), expectedErrorMsg);
     }
 
     @Test
-    public void testBuildAndAddRequirement() throws Exception {
-        List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
+    void testBuildAndAddRequirement() {
         Component fromOriginComponent = new Resource();
         Component toOriginComponent = new Resource();
         CapabilityDefinition capability = new CapabilityDefinition();
@@ -1317,7 +1667,8 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
         ComponentInstance toInstance = new ComponentInstance();
         Map<String, Component> componentCache = new HashMap<>();
-        boolean result;
+        final CapabilityRequirementRelationship capabilityRequirementRelationship = new CapabilityRequirementRelationship();
+        capabilityRequirementRelationship.setRelation(reqAndRelationshipPair);
         capability.setPath(new ArrayList<>());
         capability.setPreviousName("before cap");
         reqAndRelationshipPair.setCapability("cap");
@@ -1325,50 +1676,63 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         requirement.setPreviousName("before req");
         reqAndRelationshipPair.setRequirement("req");
 
-        Mockito.when(
-            capabiltyRequirementConvertor
-                .buildSubstitutedName(anyMap(), eq(toOriginComponent), anyList(), eq("cap"), anyString()))
-            .thenReturn(Either.left("buildCapNameRes"));
+        when(
+                capabilityRequirementConverter
+                        .buildSubstitutedName(anyMap(), eq(toOriginComponent), anyList(), eq("cap"), anyString(), any()))
+                .thenReturn(Either.left("buildCapNameRes"));
 
-        Mockito.when(
-            capabiltyRequirementConvertor
-                .buildSubstitutedName(anyMap(), eq(fromOriginComponent), anyList(), eq("req"), anyString()))
-            .thenReturn(Either.right(false));
+        when(
+                capabilityRequirementConverter
+                        .buildSubstitutedName(anyMap(), eq(fromOriginComponent), anyList(), eq("req"), anyString(), any()))
+                .thenReturn(Either.left("buildReqNameRes"));
 
         // default test
-        result = Deencapsulation.invoke(testSubject, "buildAndAddRequirement", toscaRequirements, fromOriginComponent,
-            toOriginComponent, capability, requirement, reqAndRelationshipPair, toInstance, componentCache);
-        Assert.assertNotNull(result);
+        final Map<String, ToscaTemplateRequirement> requirementMap =
+                Deencapsulation.invoke(testSubject, "buildRequirement", fromOriginComponent, toOriginComponent,
+                        capability, requirement, capabilityRequirementRelationship, toInstance, componentCache);
+        assertNotNull(requirementMap);
+        assertFalse(requirementMap.isEmpty());
+        assertTrue(requirementMap.containsKey("buildReqNameRes"));
+        final ToscaTemplateRequirement actualToscaTemplateRequirement = requirementMap.get("buildReqNameRes");
+        assertNotNull(actualToscaTemplateRequirement);
+        assertEquals("buildCapNameRes", actualToscaTemplateRequirement.getCapability());
     }
 
     @Test
-    public void testBuildAndAddRequirementBuildSubtitutedNameReturnsValueTwice() {
-        List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
-        Component fromOriginComponent = new Resource();
-        Component toOriginComponent = new Resource();
-        CapabilityDefinition capability = new CapabilityDefinition();
-        RequirementDefinition requirement = new RequirementDefinition();
-        RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
+    void testBuildRequirementBuildSubstitutedNameReturnsValueTwice() {
+        final Component fromOriginComponent = new Resource();
+        final Component toOriginComponent = new Resource();
+        final CapabilityDefinition capability = new CapabilityDefinition();
+        final RequirementDefinition requirement = new RequirementDefinition();
+        final RelationshipInfo relationship = new RelationshipInfo();
+        final CapabilityRequirementRelationship capabilityRequirementRelationship = new CapabilityRequirementRelationship();
+        capabilityRequirementRelationship.setRelation(relationship);
         ComponentInstance toInstance = new ComponentInstance();
         Map<String, Component> componentCache = new HashMap<>();
-        boolean result;
         capability.setPath(new ArrayList<>());
-        reqAndRelationshipPair.setCapability("cap");
+        relationship.setCapability("cap");
         requirement.setPath(new ArrayList<>());
-        reqAndRelationshipPair.setRequirement("req");
-
-        Mockito.when(capabiltyRequirementConvertor.buildSubstitutedName(any(), any(), any(), any(), any()))
-            .thenReturn(Either.left("buildCapNameRes"));
-
-        // default test
-        result = Deencapsulation.invoke(testSubject, "buildAndAddRequirement", toscaRequirements, fromOriginComponent,
-            toOriginComponent, capability, requirement, reqAndRelationshipPair, toInstance, componentCache);
-        Assert.assertNotNull(result);
-        Assert.assertTrue(result);
+        relationship.setRequirement("req");
+
+        final String builtCapabilityOrRequirementName = "builtCapabilityOrRequirementName";
+        when(capabilityRequirementConverter.buildSubstitutedName(anyMap(), eq(fromOriginComponent), anyList(), eq("cap"), any(), any()))
+                .thenReturn(Either.left(builtCapabilityOrRequirementName));
+        when(capabilityRequirementConverter.buildSubstitutedName(anyMap(), eq(toOriginComponent), anyList(), eq("req"), any(), any()))
+                .thenReturn(Either.left(builtCapabilityOrRequirementName));
+
+        final Map<String, ToscaTemplateRequirement> requirementMap = Deencapsulation
+                .invoke(testSubject, "buildRequirement", fromOriginComponent, toOriginComponent, capability, requirement,
+                        capabilityRequirementRelationship, toInstance, componentCache);
+        assertNotNull(requirementMap);
+        assertFalse(requirementMap.isEmpty());
+        assertTrue(requirementMap.containsKey(builtCapabilityOrRequirementName));
+        final ToscaTemplateRequirement actualToscaTemplateRequirement = requirementMap.get(builtCapabilityOrRequirementName);
+        assertNotNull(actualToscaTemplateRequirement);
+        assertEquals(builtCapabilityOrRequirementName, actualToscaTemplateRequirement.getCapability());
     }
 
     @Test
-    public void testIsRequirementBelongToRelation() throws Exception {
+    void testIsRequirementBelongToRelation() {
 
         Component originComponent = new Resource();
         RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
@@ -1381,27 +1745,29 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         // test return false
         result = Deencapsulation.invoke(testSubject, "isRequirementBelongToRelation", originComponent,
-            reqAndRelationshipPair, requirement, fromInstanceId);
-        Assert.assertNotNull(result);
+                reqAndRelationshipPair, requirement, fromInstanceId);
+        assertFalse(result);
     }
 
     @Test
-    public void testIsRequirementBelongToRelationWithNonAtomicComponent() {
+    void testIsRequirementBelongToRelationWithNonAtomicComponent() {
 
         Component originComponent = new Service();
         RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
         RequirementDefinition requirement = new RequirementDefinition();
+        requirement.setUniqueId(UNIQUE_ID);
+        reqAndRelationshipPair.setRequirementUid(UNIQUE_ID);
         String fromInstanceId = "";
         boolean result;
 
         // default test return true
         result = Deencapsulation.invoke(testSubject, "isRequirementBelongToRelation", originComponent,
-            reqAndRelationshipPair, requirement, fromInstanceId);
-        Assert.assertNotNull(result);
+                reqAndRelationshipPair, requirement, fromInstanceId);
+        assertTrue(result);
     }
 
     @Test
-    public void testIsRequirementBelongToOwner() throws Exception {
+    void testIsRequirementBelongToOwner() {
 
         RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
         RequirementDefinition requirement = new RequirementDefinition();
@@ -1414,40 +1780,38 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         // default test
         result = Deencapsulation.invoke(testSubject, "isRequirementBelongToOwner", reqAndRelationshipPair, requirement,
-            fromInstanceId, originComponent);
-        Assert.assertNotNull(result);
+                fromInstanceId, originComponent);
+        assertFalse(result);
     }
 
     @Test
-    public void testIsCvfc() throws Exception {
+    void testIsCvfc() {
 
-        Component component = new Resource();
+        Component component = new Service();
         boolean result;
 
-        component = new Service();
-
         result = Deencapsulation.invoke(testSubject, "isCvfc", component);
-        Assert.assertNotNull(result);
+        assertFalse(result);
     }
 
     @Test
-    public void testConvertCapabilities() throws Exception {
-        Component component = new Resource();
-        SubstitutionMapping substitutionMappings = new SubstitutionMapping();
-        Map<String, Component> componentCache = new HashMap<>();
-        Either<SubstitutionMapping, ToscaError> result;
+    void testConvertCapabilities() {
+        final Component component = new Resource();
+        final Map<String, Component> componentCache = new HashMap<>();
 
-        Mockito.when(capabiltyRequirementConvertor.convertSubstitutionMappingCapabilities(componentCache, component))
-            .thenReturn(Either.right(ToscaError.NODE_TYPE_CAPABILITY_ERROR));
+        final Either<Map<String, String[]>, ToscaError> expectedResult = Either.right(ToscaError.NODE_TYPE_CAPABILITY_ERROR);
+        when(capabilityRequirementConverter.convertSubstitutionMappingCapabilities(componentCache, component))
+                .thenReturn(expectedResult);
 
         // default test return isRight
-        result = Deencapsulation.invoke(testSubject, "convertCapabilities", component, substitutionMappings,
-            componentCache);
-        Assert.assertNotNull(result);
+        final Either<Map<String, String[]>, ToscaError> actualResult =
+                Deencapsulation.invoke(testSubject, "convertSubstitutionMappingCapabilities", component, componentCache);
+        assertNotNull(actualResult);
+        assertEquals(expectedResult, actualResult);
     }
 
     @Test
-    public void testConvertCapabilities_1() throws Exception {
+    void testConvertCapabilities_1() {
         Component component = new Resource();
         ToscaNodeType nodeType = new ToscaNodeType();
         Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
@@ -1458,12 +1822,12 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
 
         // default test
         result = Deencapsulation
-            .invoke(testSubject, "convertCapabilities", new HashMap<>(), component, nodeType, dataTypes);
-        Assert.assertNotNull(result);
+                .invoke(testSubject, "convertCapabilities", new HashMap<>(), component, nodeType, dataTypes);
+        assertNotNull(result);
     }
 
     @Test
-    public void testConvertToNodeTemplateArtifacts() throws Exception {
+    void testConvertToNodeTemplateArtifacts() {
         Map<String, ToscaArtifactDataDefinition> container = new HashMap<>();
         ToscaArtifactDataDefinition art = new ToscaArtifactDataDefinition();
         art.setFile("test_file");
@@ -1471,133 +1835,15 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         Map<String, ToscaTemplateArtifact> result;
         container.put("test_art", art);
         result = Deencapsulation.invoke(testSubject, "convertToNodeTemplateArtifacts", container);
-        Assert.assertNotNull(result);
-        Assert.assertTrue(MapUtils.isNotEmpty(result));
-        Assert.assertTrue(result.get("test_art").getFile().equals("test_file"));
-        Assert.assertTrue(result.get("test_art").getType().equals("test_type"));
-    }
-
-    @Test
-    public void testGetProxyNodeTypeInterfacesNoInterfaces() {
-        Component service = new Service();
-        Optional<Map<String, Object>> proxyNodeTypeInterfaces =
-                testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
-        Assert.assertFalse(proxyNodeTypeInterfaces.isPresent());
-    }
-
-    @Test
-    public void testGetProxyNodeTypeInterfaces() {
-        Component service = getTestComponent();
-        Optional<Map<String, Object>> proxyNodeTypeInterfaces =
-                testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
-        Assert.assertTrue(proxyNodeTypeInterfaces.isPresent());
-        Map<String, Object> componentInterfaces = proxyNodeTypeInterfaces.get();
-        Assert.assertNotNull(componentInterfaces);
-    }
-
-
-    @Test
-    public void testGetProxyNodeTypePropertiesComponentNull() {
-        Optional<Map<String, ToscaProperty>> proxyNodeTypeProperties =
-                testSubject.getProxyNodeTypeProperties(null, DATA_TYPES);
-        Assert.assertFalse(proxyNodeTypeProperties.isPresent());
-    }
-
-    @Test
-    public void testGetProxyNodeTypePropertiesNoProperties() {
-        Component service = new Service();
-        Optional<Map<String, ToscaProperty>> proxyNodeTypeProperties =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
-        Assert.assertFalse(proxyNodeTypeProperties.isPresent());
-    }
-
-    @Test
-    public void testGetProxyNodeTypeProperties() {
-        Component service = getTestComponent();
-        service.setProperties(Arrays.asList(createMockProperty("componentPropStr", "Default String Prop"),
-                createMockProperty("componentPropInt", null)));
-        Optional<Map<String, ToscaProperty>> proxyNodeTypeProperties =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
-        Assert.assertTrue(proxyNodeTypeProperties.isPresent());
-        Map<String, ToscaProperty> componentProperties = proxyNodeTypeProperties.get();
-        Assert.assertNotNull(componentProperties);
-        Assert.assertEquals(2, componentProperties.size());
-    }
-
-    @Test
-    public void testAddInputsToPropertiesNoInputs() {
-        Component service = getTestComponent();
-        service.setProperties(Arrays.asList(createMockProperty("componentPropStr", "Default String Prop"),
-                createMockProperty("componentPropInt", null)));
-        Optional<Map<String, ToscaProperty>> proxyNodeTypePropertiesResult =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
-
-        Assert.assertTrue(proxyNodeTypePropertiesResult.isPresent());
-        Map<String, ToscaProperty> proxyNodeTypeProperties = proxyNodeTypePropertiesResult.get();
-        testSubject.addInputsToProperties(DATA_TYPES, null, proxyNodeTypeProperties);
-        Assert.assertNotNull(proxyNodeTypeProperties);
-        Assert.assertEquals(2, proxyNodeTypeProperties.size());
-        testSubject.addInputsToProperties(DATA_TYPES, new ArrayList<>(), proxyNodeTypeProperties);
-        Assert.assertEquals(2, proxyNodeTypeProperties.size());
-    }
-
-    @Test
-    public void testAddInputsToPropertiesWithInputs() {
-        Component service = getTestComponent();
-        service.setProperties(Arrays.asList(createMockProperty("componentPropStr", "Default String Prop"),
-                createMockProperty("componentPropInt", null)));
-        service.setInputs(Arrays.asList(createMockInput("componentInputStr1",
-                "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
-        Optional<Map<String, ToscaProperty>> proxyNodeTypePropertiesResult =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
-
-        Assert.assertTrue(proxyNodeTypePropertiesResult.isPresent());
-        Map<String, ToscaProperty> proxyNodeTypeProperties = proxyNodeTypePropertiesResult.get();
-        testSubject.addInputsToProperties(DATA_TYPES, service.getInputs(), proxyNodeTypeProperties);
-        Assert.assertNotNull(proxyNodeTypeProperties);
-        Assert.assertEquals(4, proxyNodeTypeProperties.size());
-    }
-
-    @Test
-    public void testAddInputsToPropertiesOnlyInputs() {
-        Component service = getTestComponent();
-        service.setInputs(Arrays.asList(createMockInput("componentInputStr1",
-                "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
-        Optional<Map<String, ToscaProperty>> proxyNodeTypePropertiesResult =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
-
-        Assert.assertTrue(proxyNodeTypePropertiesResult.isPresent());
-        Map<String, ToscaProperty> proxyNodeTypeProperties = proxyNodeTypePropertiesResult.get();
-        testSubject.addInputsToProperties(DATA_TYPES, service.getInputs(), proxyNodeTypeProperties);
-        Assert.assertNotNull(proxyNodeTypeProperties);
-        Assert.assertEquals(2, proxyNodeTypeProperties.size());
-    }
-
-    @Test
-    public void testOperationImplementationInProxyNodeTypeNotPresent() {
-        Component service = getTestComponent();
-        InterfaceDefinition interfaceDefinition =
-                service.getInterfaces().get("normalizedServiceComponentName-interface");
-        interfaceDefinition.setOperations(new HashMap<>());
-        final OperationDataDefinition operation = new OperationDataDefinition();
-        operation.setName("start");
-        operation.setDescription("op description");
-        final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
-        implementation.setArtifactName("createBPMN.bpmn");
-        operation.setImplementation(implementation);
-        interfaceDefinition.getOperations().put(operation.getName(), operation);
-        service.getInterfaces().put("normalizedServiceComponentName-interface", interfaceDefinition);
-        service.setInputs(Arrays.asList(createMockInput("componentInputStr1",
-                "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
-        Optional<Map<String, Object>> proxyNodeTypeInterfaces =
-                testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
-        Assert.assertTrue(proxyNodeTypeInterfaces.isPresent());
-        Map<String, Object> componentInterfaces = proxyNodeTypeInterfaces.get();
-        Assert.assertNotNull(componentInterfaces);
+        assertNotNull(result);
+        assertTrue(MapUtils.isNotEmpty(result));
+        assertEquals("test_file", result.get("test_art").getFile());
+        assertEquals("test_type", result.get("test_art").getType());
     }
 
     private Component getTestComponent() {
         Component component = new Service();
+        component.setUniqueId("serviceUniqueId");
         component.setNormalizedName("normalizedServiceComponentName");
         InterfaceDefinition addedInterface = new InterfaceDefinition();
         addedInterface.setType("com.some.service.or.other.serviceName");
@@ -1607,7 +1853,7 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         return component;
     }
 
-    private PropertyDefinition createMockProperty(String propertyName, String defaultValue){
+    private PropertyDefinition createMockProperty(String propertyName, String defaultValue) {
         PropertyDefinition propertyDefinition = new PropertyDefinition();
         propertyDefinition.setName(propertyName);
         propertyDefinition.setType("string");
@@ -1615,7 +1861,7 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         return propertyDefinition;
     }
 
-    private InputDefinition createMockInput(String inputName, String defaultValue){
+    private InputDefinition createMockInput(String inputName, String defaultValue) {
         InputDefinition inputDefinition = new InputDefinition();
         inputDefinition.setName(inputName);
         inputDefinition.setType("string");