Improve test coverage 36/121336/2
authorvasraz <vasyl.razinkov@est.tech>
Tue, 11 May 2021 17:05:30 +0000 (18:05 +0100)
committerChristophe Closset <christophe.closset@intl.att.com>
Sat, 15 May 2021 06:21:37 +0000 (06:21 +0000)
Change-Id: I2b02d85d9d395d9092d43bd54e21179aff29df91
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Issue-ID: SDC-3584

catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
catalog-be/src/test/java/org/openecomp/sdc/be/tosca/ToscaExportHandlerTest.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/AttributeOperation.java
catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/AttributeOperationTest.java [new file with mode: 0644]

index b8fabc3..90716f9 100644 (file)
@@ -2366,12 +2366,11 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         // Specific Update Logic
         String newValue = attribute.getValue();
 
-        final Either<Object, Boolean> isValid = attributeOperation
-            .validateAndUpdateAttributeValue(attributeType, attribute.getValue(), true, innerType, allDataTypesEither.left().value());
+        final var isValid = attributeOperation.validateAndUpdateAttributeValue(attribute, innerType, allDataTypesEither.left().value());
         if (isValid.isRight()) {
             final Boolean res = isValid.right().value();
             if (!Boolean.TRUE.equals(res)) {
-                log.debug("validate and update attribute value has failed with value: {}", attribute.getValue());
+                log.debug("validate and update attribute value has failed with value: {}", newValue);
                 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(
                     DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
             }
index 4518000..b374e62 100644 (file)
@@ -712,13 +712,7 @@ public class ToscaExportHandler {
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, toscaNodeType, dataTypes, isAssociatedComponent);
         addInputsToProperties(dataTypes, inputDef, mergedProperties);
         final Map<String, ToscaAttribute> toscaAttributeMap;
-        try {
-            toscaAttributeMap = convertToToscaAttributes(component.getAttributes(), dataTypes);
-        } catch (final ToscaConversionException e) {
-            log.error(EcompLoggerErrorCode.SCHEMA_ERROR, ToscaExportHandler.class.getName(),
-                COULD_NOT_PARSE_COMPONENT_ATTRIBUTES_COMPONENT_UNIQUE_ID, component.getName(), component.getUniqueId(), e);
-            return Either.right(ToscaError.GENERAL_ERROR);
-        }
+        toscaAttributeMap = convertToToscaAttributes(component.getAttributes(), dataTypes);
         if (!toscaAttributeMap.isEmpty()) {
             toscaNodeType.setAttributes(toscaAttributeMap);
         }
@@ -763,7 +757,7 @@ public class ToscaExportHandler {
     }
 
     private Map<String, ToscaAttribute> convertToToscaAttributes(final List<AttributeDefinition> attributeList,
-                                                                 final Map<String, DataTypeDefinition> dataTypes) throws ToscaConversionException {
+                                                                 final Map<String, DataTypeDefinition> dataTypes) {
         if (CollectionUtils.isEmpty(attributeList)) {
             return Collections.emptyMap();
         }
@@ -981,9 +975,7 @@ public class ToscaExportHandler {
         List<ComponentInstanceInput> instanceInputsList = componentInstancesInputs.get(instanceUniqueId);
         if (instanceInputsList != null) {
             instanceInputsList.forEach(input -> {
-
-                Supplier<String> supplier = () -> input.getValue() != null && !Objects.isNull(input.getValue())
-                    ? input.getValue() : input.getDefaultValue();
+                Supplier<String> supplier = () -> input.getValue() != null && !Objects.isNull(input.getValue()) ? input.getValue() : input.getDefaultValue();
                 propertyConvertor.convertAndAddValue(dataTypes, props, input, supplier);
             });
         }
@@ -1010,9 +1002,7 @@ public class ToscaExportHandler {
                 // Filters out Attributes with empty default values
                 .filter(attributeDefinition -> StringUtils.isNotEmpty(attributeDefinition.getDefaultValue()))
                 // Converts and adds each value to attribute map
-                .forEach(attributeDefinition -> {
-                    attributeConverter.convertAndAddValue(attribs, attributeDefinition);
-                });
+                .forEach(attributeDefinition -> attributeConverter.convertAndAddValue(attribs, attributeDefinition));
         }
     }
 
@@ -1037,9 +1027,7 @@ public class ToscaExportHandler {
                 // Filters out Attributes with empty default values
                 .filter(attrib -> StringUtils.isNotEmpty(attrib.getDefaultValue()))
                 // Converts and adds each value to attribute map
-                .forEach(attributeDefinition -> {
-                    attributeConverter.convertAndAddValue(attribs, attributeDefinition);
-                });
+                .forEach(attributeDefinition -> attributeConverter.convertAndAddValue(attribs, attributeDefinition));
         }
     }
 
@@ -1237,13 +1225,11 @@ public class ToscaExportHandler {
                                                                                        Component originComponent,
                                                                                        Map<String, Component> componentCache) {
 
-        final List<Map<String, ToscaTemplateRequirement>> toscaRequirements;
         final List<RequirementCapabilityRelDef> requirementDefinitionList = filterRequirements(componentInstance,
             relations);
         if (isNotEmpty(requirementDefinitionList)) {
             try {
-                toscaRequirements = buildRequirements(component, componentInstance,
-                    requirementDefinitionList, originComponent, componentCache);
+                final List<Map<String, ToscaTemplateRequirement>> toscaRequirements = buildRequirements(component, componentInstance, requirementDefinitionList, originComponent, componentCache);
                 if (!toscaRequirements.isEmpty()) {
                     nodeTypeTemplate.setRequirements(toscaRequirements);
                 }
@@ -1267,8 +1253,7 @@ public class ToscaExportHandler {
         final List<Map<String, ToscaTemplateRequirement>> toscaRequirements = new ArrayList<>();
         for (RequirementCapabilityRelDef relationshipDefinition : filteredRelations) {
             final Map<String, ToscaTemplateRequirement> toscaTemplateRequirementMap =
-                buildRequirement(componentInstance, originComponent, component.getComponentInstances(),
-                    relationshipDefinition, componentCache);
+                buildRequirement(componentInstance, originComponent, component.getComponentInstances(), relationshipDefinition, componentCache);
             toscaRequirements.add(toscaTemplateRequirementMap);
         }
 
index 55c2e89..202cf01 100644 (file)
@@ -76,6 +76,7 @@ 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;
@@ -715,6 +716,15 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         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(any(Map.class), any(ComponentInstance.class))).thenReturn(Either.left(component));
         when(capabilityRequirementConverter
             .convertComponentInstanceCapabilities(any(ComponentInstance.class), any(Map.class), any(ToscaNodeTemplate.class)))
@@ -769,7 +779,7 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         final ComponentInstance instance = new ComponentInstance();
         instance.setUniqueId("id");
         instance.setComponentUid("uid");
-        instance.setOriginType(OriginTypeEnum.ServiceProxy);
+        instance.setOriginType(OriginTypeEnum.VFC);
         final List<GroupInstance> groupInstances = new ArrayList<>();
         final GroupInstance groupInst = new GroupInstance();
         final List<String> artifacts = new ArrayList<>();
@@ -782,6 +792,7 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         final List<PropertyDefinition> properties = new ArrayList<>();
         properties.add(new PropertyDefinition());
         instance.setProperties(properties);
+        component.setProperties(properties);
 
         instance.setUniqueId("uuid");
         instance.setDescription("desc");
@@ -826,6 +837,18 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         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(any(Map.class), any(ComponentInstance.class))).thenReturn(Either.left(component));
         when(capabilityRequirementConverter
             .convertComponentInstanceCapabilities(any(ComponentInstance.class), any(Map.class), any(ToscaNodeTemplate.class)))
@@ -935,6 +958,12 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         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);
 
         when(capabilityRequirementConverter.getOriginComponent(any(Map.class), any(ComponentInstance.class))).thenReturn(Either.right(false));
@@ -1005,63 +1034,6 @@ public class ToscaExportHandlerTest extends BeConfDependentTest {
         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);
-
-        // default test
-        Deencapsulation.invoke(testSubject, "addPropertiesOfParentComponent", dataTypes,
-            componentOfInstance, props);
-    }
-
     @Test
     public void testCreateNodeType() throws Exception {
 
index f2e8c83..74dc420 100644 (file)
@@ -54,7 +54,7 @@ public class AttributeOperation extends AbstractOperation {
     private static final String FAILED_TO_FETCH_ATTRIBUTES_OF_DATA_TYPE = "Failed to fetch attributes of data type {}";
     private static final String DATA_TYPE_CANNOT_BE_FOUND_IN_GRAPH_STATUS_IS = "Data type {} cannot be found in graph. status is {}";
     private static final String THE_VALUE_OF_ATTRIBUTE_FROM_TYPE_IS_INVALID = "The value {} of attribute from type {} is invalid";
-    private static Logger log = Logger.getLogger(AttributeOperation.class.getName());
+    private static final Logger log = Logger.getLogger(AttributeOperation.class.getName());
 
     @Autowired
     public AttributeOperation(HealingJanusGraphGenericDao janusGraphGenericDao) {
@@ -77,7 +77,7 @@ public class AttributeOperation extends AbstractOperation {
         return true;
     }
 
-    public Either<Boolean, JanusGraphOperationStatus> isDefinedInDataTypes(final String propertyType) {
+    private Either<Boolean, JanusGraphOperationStatus> isDefinedInDataTypes(final String propertyType) {
         final String dataTypeUid = UniqueIdBuilder.buildDataTypeUid(propertyType);
         final Either<DataTypeDefinition, JanusGraphOperationStatus> dataTypeByUid = getDataTypeByUid(dataTypeUid);
         if (dataTypeByUid.isRight()) {
@@ -93,7 +93,7 @@ public class AttributeOperation extends AbstractOperation {
     /**
      * Build Data type object from graph by unique id
      */
-    public Either<DataTypeDefinition, JanusGraphOperationStatus> getDataTypeByUid(final String uniqueId) {
+    private Either<DataTypeDefinition, JanusGraphOperationStatus> getDataTypeByUid(final String uniqueId) {
         final Either<DataTypeData, JanusGraphOperationStatus> dataTypesRes = janusGraphGenericDao
             .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), uniqueId, DataTypeData.class);
         if (dataTypesRes.isRight()) {
@@ -109,14 +109,12 @@ public class AttributeOperation extends AbstractOperation {
             return Either.right(propertiesStatus);
         }
         final Either<ImmutablePair<DataTypeData, GraphEdge>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
-            .getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), uniqueId, GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.DataType,
-                DataTypeData.class);
+            .getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), uniqueId, GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.DataType, DataTypeData.class);
         log.debug("After retrieving DERIVED_FROM node of {}. status is {}", uniqueId, parentNode);
         if (parentNode.isRight()) {
             final JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
             if (janusGraphOperationStatus != JanusGraphOperationStatus.NOT_FOUND) {
-                log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, "Failed to find the parent data type of data type {}. status is {}", uniqueId,
-                    janusGraphOperationStatus);
+                log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, "Failed to find the parent data type of data type {}. status is {}", uniqueId, janusGraphOperationStatus);
                 return Either.right(janusGraphOperationStatus);
             }
         } else {
@@ -135,8 +133,7 @@ public class AttributeOperation extends AbstractOperation {
     }
 
     private JanusGraphOperationStatus fillProperties(final String uniqueId, final DataTypeDefinition dataTypeDefinition) {
-        final Either<Map<String, PropertyDefinition>, JanusGraphOperationStatus> findPropertiesOfNode = this
-            .findPropertiesOfNode(NodeTypeEnum.DataType, uniqueId);
+        final Either<Map<String, PropertyDefinition>, JanusGraphOperationStatus> findPropertiesOfNode = this.findPropertiesOfNode(NodeTypeEnum.DataType, uniqueId);
         if (findPropertiesOfNode.isRight()) {
             final JanusGraphOperationStatus janusGraphOperationStatus = findPropertiesOfNode.right().value();
             log.debug("After looking for properties of vertex {}. status is {}", uniqueId, janusGraphOperationStatus);
@@ -162,12 +159,11 @@ public class AttributeOperation extends AbstractOperation {
         }
     }
 
-    public Either<Map<String, PropertyDefinition>, JanusGraphOperationStatus> findPropertiesOfNode(final NodeTypeEnum nodeType,
-                                                                                                   final String uniqueId) {
+    private Either<Map<String, PropertyDefinition>, JanusGraphOperationStatus> findPropertiesOfNode(final NodeTypeEnum nodeType,
+                                                                                                    final String uniqueId) {
         final Map<String, PropertyDefinition> resourceProps = new HashMap<>();
         final Either<List<ImmutablePair<PropertyData, GraphEdge>>, JanusGraphOperationStatus> childrenNodes = janusGraphGenericDao
-            .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(nodeType), uniqueId, GraphEdgeLabels.PROPERTY, NodeTypeEnum.Property,
-                PropertyData.class);
+            .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(nodeType), uniqueId, GraphEdgeLabels.PROPERTY, NodeTypeEnum.Property, PropertyData.class);
         if (childrenNodes.isRight()) {
             final JanusGraphOperationStatus operationStatus = childrenNodes.right().value();
             return Either.right(operationStatus);
@@ -187,7 +183,7 @@ public class AttributeOperation extends AbstractOperation {
         return Either.left(resourceProps);
     }
 
-    public PropertyDefinition convertPropertyDataToPropertyDefinition(final PropertyData propertyDataResult, final String propertyName) {
+    private PropertyDefinition convertPropertyDataToPropertyDefinition(final PropertyData propertyDataResult, final String propertyName) {
         log.debug("The object returned after create property is {}", propertyDataResult);
         final PropertyDefinition propertyDefResult = new PropertyDefinition(propertyDataResult.getPropertyDataDefinition());
         propertyDefResult.setConstraints(convertConstraints(propertyDataResult.getConstraints()));
@@ -304,10 +300,7 @@ public class AttributeOperation extends AbstractOperation {
             return StorageOperationStatus.INVALID_VALUE;
         }
         final JsonElement jsonElement = validateResult.left;
-        if (log.isTraceEnabled()) {
-            log.trace("Going to update value in attribute definition {} {}", attributeDefinition.getName(),
-                (jsonElement != null ? jsonElement.toString() : null));
-        }
+        log.trace("Going to update value in attribute definition {} {}", attributeDefinition.getName(), (jsonElement != null ? jsonElement.toString() : null));
         updateAttributeValue(attributeDefinition, jsonElement);
         return StorageOperationStatus.OK;
     }
@@ -316,34 +309,30 @@ public class AttributeOperation extends AbstractOperation {
         attributeDefinition.set_default(jsonElement);
     }
 
-    public Either<Object, Boolean> validateAndUpdateAttributeValue(final String attributeType,
-                                                                   final String value,
-                                                                   final boolean isValidate,
+    public Either<Object, Boolean> validateAndUpdateAttributeValue(final AttributeDataDefinition attribute,
                                                                    final String innerType,
                                                                    final Map<String, DataTypeDefinition> dataTypes) {
+        final var attributeType = attribute.getType();
+        final var value = attribute.getValue();
         log.trace("Going to validate attribute value and its type. type = {}, value = {}", attributeType, value);
-        final ToscaPropertyType type = getType(attributeType);
-        if (isValidate) {
-            if (type == null) {
-                final DataTypeDefinition dataTypeDefinition = dataTypes.get(attributeType);
-                final ImmutablePair<JsonElement, Boolean> validateResult =
-                    dataTypeValidatorConverter.validateAndUpdate(value, dataTypeDefinition, dataTypes);
-                if (Boolean.FALSE.equals(validateResult.right)) {
-                    log.debug(THE_VALUE_OF_ATTRIBUTE_FROM_TYPE_IS_INVALID, value, attributeType);
-                    return Either.right(false);
-                }
-                return Either.left(getValueFromJsonElement(validateResult.left));
-            }
-            log.trace("before validating property type {}", attributeType);
-            if (!isValidValue(type, value, innerType, dataTypes)) {
-                log.debug(THE_VALUE_OF_ATTRIBUTE_FROM_TYPE_IS_INVALID, value, type);
+        final var type = getType(attributeType);
+        if (type == null) {
+            final var dataTypeDefinition = dataTypes.get(attributeType);
+            final var validateResult = dataTypeValidatorConverter.validateAndUpdate(value, dataTypeDefinition, dataTypes);
+            if (Boolean.FALSE.equals(validateResult.right)) {
+                log.debug(THE_VALUE_OF_ATTRIBUTE_FROM_TYPE_IS_INVALID, value, attributeType);
                 return Either.right(false);
             }
+            return Either.left(getValueFromJsonElement(validateResult.left));
+        }
+        log.trace("before validating property type {}", attributeType);
+        if (!isValidValue(type, value, innerType, dataTypes)) {
+            log.debug(THE_VALUE_OF_ATTRIBUTE_FROM_TYPE_IS_INVALID, value, type);
+            return Either.right(false);
         }
         Object convertedValue = value;
-        if (!isEmptyValue(value) && isValidate) {
-            PropertyValueConverter converter = type.getConverter();
-            convertedValue = converter.convert(value, innerType, dataTypes);
+        if (!isEmptyValue(value)) {
+            convertedValue = type.getConverter().convert(value, innerType, dataTypes);
         }
         return Either.left(convertedValue);
     }
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/AttributeOperationTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/AttributeOperationTest.java
new file mode 100644 (file)
index 0000000..daa0e13
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.openecomp.sdc.be.model.operations.impl;
+
+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.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import fj.data.Either;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
+import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
+import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphGenericDao;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
+import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
+import org.openecomp.sdc.be.model.ModelTestBase;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.tosca.validators.DataTypeValidatorConverter;
+import org.openecomp.sdc.be.resources.data.DataTypeData;
+import org.openecomp.sdc.be.resources.data.PropertyData;
+
+@ExtendWith(MockitoExtension.class)
+class AttributeOperationTest extends ModelTestBase {
+
+    @InjectMocks
+    private AttributeOperation attributeOperation;
+
+    @Mock
+    private HealingJanusGraphGenericDao janusGraphGenericDao;
+
+    @Mock
+    private DataTypeValidatorConverter dataTypeValidatorConverter;
+
+    @BeforeAll
+    public static void setupBeforeClass() {
+        ModelTestBase.init();
+    }
+
+    @BeforeEach
+    void setUp() {
+        attributeOperation = new AttributeOperation(janusGraphGenericDao);
+    }
+
+    @Test
+    void isAttributeTypeValid() {
+        final List<ImmutablePair<GraphNode, GraphEdge>> list = new ArrayList<>();
+        final GraphEdge edge = new GraphEdge();
+        final HashMap<String, Object> map = new HashMap<>();
+        map.put("name", "property");
+        edge.setProperties(map);
+        final ImmutablePair<GraphNode, GraphEdge> pairPropertyData = new ImmutablePair<>(new PropertyData(), edge);
+        list.add(pairPropertyData);
+        final ImmutablePair<GraphNode, GraphEdge> pairDataTypeData = new ImmutablePair<>(new DataTypeData(), edge);
+
+        when(janusGraphGenericDao.getNode(any(), any(), any())).thenReturn(Either.left(new DataTypeData()));
+        when(janusGraphGenericDao.getChildrenNodes(eq("uid"), eq("null.datatype"), any(GraphEdgeLabels.class), any(NodeTypeEnum.class), any()))
+            .thenReturn(Either.<List<ImmutablePair<GraphNode, GraphEdge>>, JanusGraphOperationStatus>left(list));
+        when(janusGraphGenericDao.getChild(eq("uid"), eq("null.datatype"), any(GraphEdgeLabels.class), any(NodeTypeEnum.class), any()))
+            .thenReturn(Either.<ImmutablePair<GraphNode, GraphEdge>, JanusGraphOperationStatus>left(pairDataTypeData));
+
+        when(janusGraphGenericDao.getChildrenNodes(eq("uid"), eq(null), any(GraphEdgeLabels.class), any(NodeTypeEnum.class), any()))
+            .thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
+        when(janusGraphGenericDao.getChild(eq("uid"), eq(null), any(GraphEdgeLabels.class), any(NodeTypeEnum.class), any()))
+            .thenReturn(Either.right(JanusGraphOperationStatus.GENERAL_ERROR));
+
+        final var attributeDefinition = new AttributeDataDefinition();
+        assertFalse(attributeOperation.isAttributeTypeValid(attributeDefinition));
+    }
+
+    @Test
+    void isAttributeTypeValid_when_Null() {
+        assertFalse(attributeOperation.isAttributeTypeValid(null));
+    }
+
+    @Test
+    void isAttributeTypeValid_when_type_valid() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("string");
+        assertTrue(attributeOperation.isAttributeTypeValid(attributeDefinition));
+    }
+
+    @Test
+    void isAttributeInnerTypeValid() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("string");
+        final var result = attributeOperation.isAttributeInnerTypeValid(attributeDefinition, new HashMap<>());
+        assertNotNull(result);
+        assertNull(result.getLeft());
+        assertFalse(result.getRight());
+    }
+
+    @Test
+    void isAttributeInnerTypeValid_when_null() {
+        final var result = attributeOperation.isAttributeInnerTypeValid(null, new HashMap<>());
+        assertNotNull(result);
+        assertNull(result.getLeft());
+        assertFalse(result.getRight());
+    }
+
+    @Test
+    void isAttributeDefaultValueValid() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("string");
+        final var result = attributeOperation.isAttributeDefaultValueValid(attributeDefinition, new HashMap<>());
+        assertTrue(result);
+    }
+
+    @Test
+    void isAttributeDefaultValueValid_when_list() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("list");
+        final SchemaDefinition schema = new SchemaDefinition();
+        schema.setProperty(new PropertyDataDefinition());
+        attributeDefinition.setSchema(schema);
+        final var result = attributeOperation.isAttributeDefaultValueValid(attributeDefinition, new HashMap<>());
+        assertTrue(result);
+    }
+
+    @Test
+    void validateAndUpdateAttributeValue() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("string");
+        attributeDefinition.setValue("new string");
+        final var result = attributeOperation.validateAndUpdateAttributeValue(attributeDefinition, "", new HashMap<>());
+        assertNotNull(result);
+    }
+
+    @Test
+    void validateAndUpdateAttributeValue_when_type_null() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setValue("[ 'test' : 123 ]");
+        final var result = attributeOperation.validateAndUpdateAttributeValue(attributeDefinition, "", new HashMap<>());
+        assertNotNull(result);
+        assertTrue(result.isRight());
+        assertFalse(result.right().value());
+    }
+
+    @Test
+    void validateAndUpdateAttribute() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("string");
+        final var result = attributeOperation.validateAndUpdateAttribute(attributeDefinition, new HashMap<>());
+        assertNotNull(result);
+        assertEquals(StorageOperationStatus.OK, result);
+    }
+
+    @Test
+    void validateAndUpdateAttribute_without_type() {
+        final var attributeDefinition = new AttributeDataDefinition();
+        attributeDefinition.setType("double");
+        final HashMap<String, DataTypeDefinition> dataTypes = new HashMap<>();
+        dataTypes.put("double", new DataTypeDefinition());
+        final var result = attributeOperation.validateAndUpdateAttribute(attributeDefinition, dataTypes);
+        assertNotNull(result);
+        assertEquals(StorageOperationStatus.OK, result);
+    }
+
+}