Topology tree: extract AAITreeNodesEnricher out of AAIServiceTree 67/102067/2
authorIttay Stern <ittay.stern@att.com>
Wed, 12 Feb 2020 10:28:59 +0000 (12:28 +0200)
committerIttay Stern <ittay.stern@att.com>
Thu, 20 Feb 2020 13:09:01 +0000 (15:09 +0200)
Issue-ID: VID-771

Change-Id: I138a89b7b2f00e6e603ff26addefc494aeb019b0
Signed-off-by: Ittay Stern <ittay.stern@att.com>
vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java
vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodesEnricher.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/services/AAIServiceIntegrativeTest.java
vid-app-common/src/test/java/org/onap/vid/services/AAIServiceTreeIntegrativeTest.java
vid-app-common/src/test/java/org/onap/vid/services/AAIServiceTreeTest.java
vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodesEnricherTest.java [new file with mode: 0644]

index 7b0e5f5..579fd09 100644 (file)
 package org.onap.vid.services;
 
 import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.toSet;
 import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
-import static org.onap.vid.utils.KotlinUtilsKt.JACKSON_OBJECT_MAPPER;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.ImmutableList;
-import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import javax.inject.Inject;
-import javax.ws.rs.core.Response;
 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
-import org.onap.vid.aai.AaiClientInterface;
 import org.onap.vid.aai.util.AAITreeConverter;
 import org.onap.vid.asdc.AsdcCatalogException;
-import org.onap.vid.asdc.parser.ServiceModelInflator;
 import org.onap.vid.exceptions.GenericUncheckedException;
 import org.onap.vid.model.ServiceModel;
 import org.onap.vid.model.aaiTree.AAITreeNode;
@@ -57,15 +46,9 @@ import org.springframework.stereotype.Component;
 public class AAIServiceTree {
 
     private final AAITreeNodeBuilder aaiTreeNodeBuilder;
-
+    private final AAITreeNodesEnricher aaiTreeNodesEnricher;
     private final AAITreeConverter aaiTreeConverter;
-
-    private final AaiClientInterface aaiClient;
-
     private final VidService sdcService;
-
-    private final ServiceModelInflator serviceModelInflator;
-
     private final ExecutorService executorService;
 
     private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(AAIServiceTree.class);
@@ -89,14 +72,17 @@ public class AAIServiceTree {
     }
 
     @Inject
-    public AAIServiceTree(AaiClientInterface aaiClient, AAITreeNodeBuilder aaiTreeNodeBuilder,
-                          AAITreeConverter aaiTreeConverter, VidService sdcService,
-                          ServiceModelInflator serviceModelInflator, ExecutorService executorService) {
-        this.aaiClient = aaiClient;
+    public AAIServiceTree(
+        AAITreeNodeBuilder aaiTreeNodeBuilder,
+        AAITreeNodesEnricher aaiTreeNodesEnricher,
+        AAITreeConverter aaiTreeConverter,
+        VidService sdcService,
+        ExecutorService executorService
+    ) {
         this.aaiTreeNodeBuilder = aaiTreeNodeBuilder;
+        this.aaiTreeNodesEnricher = aaiTreeNodesEnricher;
         this.aaiTreeConverter = aaiTreeConverter;
         this.sdcService = sdcService;
-        this.serviceModelInflator = serviceModelInflator;
         this.executorService = executorService;
     }
 
@@ -116,7 +102,7 @@ public class AAIServiceTree {
         List<AAITreeNode> aaiTreeNodes = fetchAAITree(url, payload, method, pathsToSearch, nodesAccumulator);
 
         if (enrichWithModelVersion) {
-            enrichNodesWithModelVersionAndModelName(nodesAccumulator);
+            aaiTreeNodesEnricher.enrichNodesWithModelVersionAndModelName(nodesAccumulator);
         }
 
         return aaiTreeNodes;
@@ -134,12 +120,12 @@ public class AAIServiceTree {
         AAITreeNode aaiTree = fetchAAITree(getURL, null, HttpMethod.GET, AAI_TREE_PATHS, nodesAccumulator).get(0);
 
         //Populate nodes with model-name & model-version (from aai)
-        enrichNodesWithModelVersionAndModelName(nodesAccumulator);
+        aaiTreeNodesEnricher.enrichNodesWithModelVersionAndModelName(nodesAccumulator);
 
         final ServiceModel serviceModel = getServiceModel(aaiTree.getModelVersionId());
 
         //Populate nodes with model-customization-name (from sdc model)
-        enrichNodesWithModelCustomizationName(nodesAccumulator, serviceModel);
+        aaiTreeNodesEnricher.enrichNodesWithModelCustomizationName(nodesAccumulator, serviceModel);
 
         return aaiTreeConverter.convertTreeToUIModel(aaiTree, globalCustomerId, serviceType, getInstantiationType(serviceModel), getInstanceRole(serviceModel), getInstanceType(serviceModel));
     }
@@ -187,64 +173,6 @@ public class AAIServiceTree {
         } catch (AsdcCatalogException e) {
             throw new GenericUncheckedException("Exception while loading model version '" + modelVersionId + "'", e);
         }
-
-    }
-
-    void enrichNodesWithModelCustomizationName(Collection<AAITreeNode> nodes, ServiceModel serviceModel) {
-        final Map<String, ServiceModelInflator.Names> customizationNameByVersionId = serviceModelInflator.toNamesByVersionId(serviceModel);
-
-        nodes.forEach(node -> {
-            final ServiceModelInflator.Names names = customizationNameByVersionId.get(node.getModelVersionId());
-            if (names != null) {
-                node.setKeyInModel(names.getModelKey());
-                node.setModelCustomizationName(names.getModelCustomizationName());
-            }
-        });
-    }
-
-
-    private void enrichNodesWithModelVersionAndModelName(Collection<AAITreeNode> nodes) {
-
-        Collection<String> invariantIDs = getModelInvariantIds(nodes);
-
-        Map<String, String> modelVersionByModelVersionId = new HashMap<>();
-        Map<String, String> modelNameByModelVersionId = new HashMap<>();
-
-        JsonNode models = getModels(aaiClient, invariantIDs);
-        if (models!=null) {
-            for (JsonNode model : models) {
-                JsonNode modelVersions = model.get("model-vers").get("model-ver");
-                for (JsonNode modelVersion : modelVersions) {
-                    final String modelVersionId = modelVersion.get("model-version-id").asText();
-                    modelVersionByModelVersionId.put(modelVersionId, modelVersion.get("model-version").asText());
-                    modelNameByModelVersionId.put(modelVersionId, modelVersion.get("model-name").asText());
-                }
-            }
-        }
-
-        nodes.forEach(node -> {
-            node.setModelVersion(modelVersionByModelVersionId.get(node.getModelVersionId()));
-            node.setModelName(modelNameByModelVersionId.get(node.getModelVersionId()));
-        });
-
-    }
-
-    private JsonNode getModels(AaiClientInterface aaiClient, Collection<String> invariantIDs) {
-        Response response = aaiClient.getVersionByInvariantId(ImmutableList.copyOf(invariantIDs));
-        try {
-            JsonNode responseJson = JACKSON_OBJECT_MAPPER.readTree(response.readEntity(String.class));
-            return responseJson.get("model");
-        } catch (Exception e) {
-            LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to getVersionByInvariantId from A&AI", e);
-        }
-        return JACKSON_OBJECT_MAPPER.createObjectNode();
-    }
-
-    private Set<String> getModelInvariantIds(Collection<AAITreeNode> nodes) {
-        return nodes.stream()
-                .map(AAITreeNode::getModelInvariantId)
-                .filter(Objects::nonNull)
-                .collect(toSet());
     }
 
     public static class AaiRelationship {
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodesEnricher.java b/vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodesEnricher.java
new file mode 100644 (file)
index 0000000..e1e35cb
--- /dev/null
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 - 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.services;
+
+import static java.util.stream.Collectors.toSet;
+import static org.onap.vid.utils.KotlinUtilsKt.JACKSON_OBJECT_MAPPER;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import javax.inject.Inject;
+import javax.ws.rs.core.Response;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.asdc.parser.ServiceModelInflator;
+import org.onap.vid.asdc.parser.ServiceModelInflator.Names;
+import org.onap.vid.model.ServiceModel;
+import org.onap.vid.model.aaiTree.AAITreeNode;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AAITreeNodesEnricher {
+
+    private final AaiClientInterface aaiClient;
+
+    private final ServiceModelInflator serviceModelInflator;
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(AAITreeNodesEnricher.class);
+
+    @Inject
+    public AAITreeNodesEnricher(
+        AaiClientInterface aaiClient,
+        ServiceModelInflator serviceModelInflator
+    ) {
+        this.aaiClient = aaiClient;
+        this.serviceModelInflator = serviceModelInflator;
+    }
+
+    void enrichNodesWithModelCustomizationName(Collection<AAITreeNode> nodes, ServiceModel serviceModel) {
+        final Map<String, Names> customizationNameByVersionId = serviceModelInflator.toNamesByVersionId(serviceModel);
+
+        nodes.forEach(node -> {
+            final Names names = customizationNameByVersionId.get(node.getModelVersionId());
+            if (names != null) {
+                node.setKeyInModel(names.getModelKey());
+                node.setModelCustomizationName(names.getModelCustomizationName());
+            }
+        });
+    }
+
+    public void enrichNodesWithModelVersionAndModelName(Collection<AAITreeNode> nodes) {
+
+        Collection<String> invariantIDs = getModelInvariantIds(nodes);
+
+        Map<String, String> modelVersionByModelVersionId = new HashMap<>();
+        Map<String, String> modelNameByModelVersionId = new HashMap<>();
+
+        JsonNode models = getModels(aaiClient, invariantIDs);
+        if (models!=null) {
+            for (JsonNode model : models) {
+                JsonNode modelVersions = model.get("model-vers").get("model-ver");
+                for (JsonNode modelVersion : modelVersions) {
+                    final String modelVersionId = modelVersion.get("model-version-id").asText();
+                    modelVersionByModelVersionId.put(modelVersionId, modelVersion.get("model-version").asText());
+                    modelNameByModelVersionId.put(modelVersionId, modelVersion.get("model-name").asText());
+                }
+            }
+        }
+
+        nodes.forEach(node -> {
+            node.setModelVersion(modelVersionByModelVersionId.get(node.getModelVersionId()));
+            node.setModelName(modelNameByModelVersionId.get(node.getModelVersionId()));
+        });
+
+    }
+
+    private JsonNode getModels(AaiClientInterface aaiClient, Collection<String> invariantIDs) {
+        Response response = aaiClient.getVersionByInvariantId(ImmutableList.copyOf(invariantIDs));
+        try {
+            JsonNode responseJson = JACKSON_OBJECT_MAPPER.readTree(response.readEntity(String.class));
+            return responseJson.get("model");
+        } catch (Exception e) {
+            LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to getVersionByInvariantId from A&AI", e);
+        }
+        return JACKSON_OBJECT_MAPPER.createObjectNode();
+    }
+
+    private Set<String> getModelInvariantIds(Collection<AAITreeNode> nodes) {
+        return nodes.stream()
+                .map(AAITreeNode::getModelInvariantId)
+                .filter(Objects::nonNull)
+                .collect(toSet());
+    }
+
+}
index a73a5a7..e447ac7 100644 (file)
@@ -64,12 +64,10 @@ public class AAIServiceIntegrativeTest extends TestWithAaiClient {
         AaiClient aaiClient = new AaiClient(aaiRestInterface, null, cacheProvider);
         ExecutorService executorService = MoreExecutors.newDirectExecutorService();
         AAIServiceTree aaiServiceTree = new AAIServiceTree(
-                aaiClient,
-                new AAITreeNodeBuilder(aaiClient, logging),
-                new AAITreeConverter(new ModelUtil()),
-                null,
-                null,
-                executorService
+            new AAITreeNodeBuilder(aaiClient, logging),
+            new AAITreeNodesEnricher(aaiClient, null),
+            new AAITreeConverter(new ModelUtil()), null,
+            executorService
         );
         return new AaiServiceImpl(aaiClient, null, aaiServiceTree, executorService, logging);
     }
index 0d2d51c..02f127d 100644 (file)
@@ -61,6 +61,7 @@ import org.onap.vid.utils.Logging;
 import org.springframework.http.HttpMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
 
 public class AAIServiceTreeIntegrativeTest {
 
@@ -79,9 +80,13 @@ public class AAIServiceTreeIntegrativeTest {
     @Mock
     ServiceModelInflator serviceModelInflator;
 
+    @Mock
+    FeatureManager featureManager;
+
     @Mock
     Logging logging;
 
+    private AAITreeNodesEnricher aaiTreeNodesEnricher;
     private AAITreeNodeBuilder aaiTreeNodeBuilder;
 
     private AAITreeConverter aaiTreeConverter = new AAITreeConverter(new ModelUtil());
@@ -133,7 +138,6 @@ public class AAIServiceTreeIntegrativeTest {
             "\"relationship-key\": \"owning-entity.owning-entity-id\"," +
             "\"relationship-value\": \"43b8a85a-0421-4265-9069-117dd6526b8a\"}]}]}}";
 
-    //TODO Amichai: if in the future it is neede, add here the SUFFIX to the URL: "?format=simple"
     private static String genericVnfRequestUri = "/aai/v12/network/generic-vnfs/generic-vnf/59bde732-9b84-46bd-a59a-3c45fee0538b";
 
     private String genericVnfResponseString(boolean isDuplicatedKeysInTenantRelation) {
@@ -300,6 +304,7 @@ public class AAIServiceTreeIntegrativeTest {
         TestUtils.initMockitoMocks(this);
         reboundLoggingWithMdcMock();
         aaiTreeNodeBuilder = new AAITreeNodeBuilder(aaiClient, logging);
+        aaiTreeNodesEnricher = new AAITreeNodesEnricher(aaiClient, serviceModelInflator);
     }
 
     private void reboundLoggingWithMdcMock() {
@@ -320,7 +325,7 @@ public class AAIServiceTreeIntegrativeTest {
                  "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0", new ServiceModelInflator.Names("vnf-model-customization-name", "vnf-key-in-model")
         ));
 
-        ServiceInstance root = new AAIServiceTree(aaiClient, aaiTreeNodeBuilder, aaiTreeConverter, sdcService, serviceModelInflator, executorService)
+        ServiceInstance root = new AAIServiceTree(aaiTreeNodeBuilder, aaiTreeNodesEnricher, aaiTreeConverter, sdcService, executorService)
                 .getServiceInstanceTopology(globalCustomerID, serviceType, serviceInstanceId);
 
         assertServiceNode(root, 1);
@@ -370,7 +375,8 @@ public class AAIServiceTreeIntegrativeTest {
         when(sdcService.getService(any())).thenReturn(
                 TestUtils.readJsonResourceFileAsObject("/getTopology/serviceWithCR/serviceWithCRModel.json", ServiceModel.class));
 
-        ServiceInstance serviceInstance = new AAIServiceTree(aaiClient, aaiTreeNodeBuilder, aaiTreeConverter, sdcService, new ServiceModelInflator(), executorService)
+        ServiceInstance serviceInstance = new AAIServiceTree(aaiTreeNodeBuilder,
+            new AAITreeNodesEnricher(aaiClient, new ServiceModelInflator()), aaiTreeConverter, sdcService, executorService)
                 .getServiceInstanceTopology("a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", "Emanuel", "a565e6ad-75d1-4493-98f1-33234b5c17e2");
 
         String expected = TestUtils.readFileAsString("/getTopology/serviceWithCR/getTopologyWithCR.json");
@@ -437,7 +443,7 @@ public class AAIServiceTreeIntegrativeTest {
         when(sdcService.getService(any())).thenReturn(mock(ServiceModel.class));
         when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of());
 
-        new AAIServiceTree(aaiClient, aaiTreeNodeBuilder, aaiTreeConverter, sdcService, serviceModelInflator, executorService)
+        new AAIServiceTree(aaiTreeNodeBuilder, aaiTreeNodesEnricher, aaiTreeConverter, sdcService, executorService)
                 .getServiceInstanceTopology(globalCustomerID, serviceType, serviceInstanceId);
     }
 
index be195c8..ca3e98e 100644 (file)
 
 package org.onap.vid.services;
 
-import static java.util.Collections.emptyList;
-import static java.util.Collections.emptyMap;
-import static java.util.stream.Collectors.toList;
 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
 import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.onap.vid.services.AAITreeNodeBuilderTest.createExpectedVnfTreeNode;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Streams;
 import com.google.common.util.concurrent.MoreExecutors;
-import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import net.javacrumbs.jsonunit.core.Option;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import org.jetbrains.annotations.NotNull;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.onap.vid.aai.AaiClient;
 import org.onap.vid.aai.util.AAITreeConverter;
 import org.onap.vid.asdc.parser.ServiceModelInflator;
-import org.onap.vid.asdc.parser.ServiceModelInflator.Names;
 import org.onap.vid.model.ModelUtil;
 import org.onap.vid.model.aaiTree.AAITreeNode;
 import org.onap.vid.model.aaiTree.NodeType;
@@ -76,136 +63,16 @@ public class AAIServiceTreeTest {
         MockitoAnnotations.initMocks(this);
     }
 
-    private final static String nullString = "null placeholder";
-
-
-
-    @Test
-    public void enrichNodesWithModelCustomizationName_simple3NodesCase_nodesEnriched() {
-
-        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
-                "version id a", new Names("name a", "key a"),
-                "version id b", new Names("name b", "key b"),
-                "version id c", new Names("name c", "key c")
-        ));
-
-        final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c");
-        final ImmutableList<Names> expectedNames = ImmutableList.of(
-                new Names("name a", "key a"),
-                new Names("name b", "key b"),
-                new Names("name c", "key c"));
-
-
-        final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
-        aaiServiceTree.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
-
-        assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
-    }
-
-    @Test
-    public void enrichNodesWithModelCustomizationName_noNodes_noError() {
-
-        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
-                "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0", new Names("my model cust name", "my key")
-        ));
-
-        aaiServiceTree.enrichNodesWithModelCustomizationName(emptyList(), null);
-    }
-
-    @Test
-    public void enrichNodesWithModelCustomizationName_nothingInModel_nodesUnchanged() {
-
-        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(emptyMap());
-
-        final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c");
-        final Names nullNames = new Names(nullString, nullString);
-        final ImmutableList<Names> expectedNames = ImmutableList.of(nullNames, nullNames, nullNames);
-
-        
-        final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
-
-        aaiServiceTree.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
-
-        assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
-    }
-
-    @Test
-    public void enrichNodesWithModelCustomizationName_staggered4NodesAndNull_3nodesEnriched2isNull() {
-
-        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
-                "version id Z", new Names("name Z", "key Z"),
-                "version id d", new Names(null, "key d"),
-                "version id c", new Names("name c", null),
-                "version id a", new Names("name a", "key a")
-        ));
-
-        final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c", "version id d", nullString);
-        final ImmutableList<Names> expectedNames = ImmutableList.of(
-                new Names("name a", "key a"),
-                new Names(nullString, nullString),
-                new Names("name c", nullString),
-                new Names(nullString, "key d"),
-                new Names(nullString, nullString)
-        );
-
-
-        final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
-
-        aaiServiceTree.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
-
-        assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
-    }
-
-
-
-    @NotNull
-    private String[] toStringsArray(List<AAITreeNode> nodes) {
-        return toStrings(nodes).toArray(new String[] {});
-    }
-
-    @NotNull
-    private List<String> toStrings(List<AAITreeNode> nodes) {
-        return nodes.stream().map(n -> {
-            final ReflectionToStringBuilder reflectionToStringBuilder = new ReflectionToStringBuilder(n, ToStringStyle.SHORT_PREFIX_STYLE);
-            reflectionToStringBuilder.setExcludeNullValues(true);
-            return reflectionToStringBuilder.toString();
-        }).collect(toList());
-    }
-
-    @NotNull
-    private List<AAITreeNode> nodesWithVersionIdsAndCustomizationNames(List<String> versionIds, List<Names> customizationNames) {
-        return Streams
-                .zip(versionIds.stream(), customizationNames.stream(), this::nodeWithVersionIdAndCustomizationName)
-                .collect(toList());
-    }
-
-    @NotNull
-    private List<AAITreeNode> nodesWithVersionIds(List<String> versionIds) {
-        return versionIds.stream()
-                .map(versionId -> nodeWithVersionIdAndCustomizationName(versionId, new Names(nullString, nullString)))
-                .collect(toList());
-    }
-
-    private AAITreeNode nodeWithVersionIdAndCustomizationName(String versionId, Names names) {
-        AAITreeNode newNode = new AAITreeNode();
-        newNode.setModelVersionId(versionId.equals(nullString) ? null : versionId);
-        newNode.setModelCustomizationName(names.getModelCustomizationName().equals(nullString) ? null : names.getModelCustomizationName());
-        newNode.setKeyInModel(names.getModelKey().equals(nullString) ? null : names.getModelKey());
-        return newNode;
-    }
-
     @Test
-    public void whenBuildTreeForOneResource_resultAsExpected() throws IOException {
+    public void whenBuildTreeForOneResource_resultAsExpected() {
 
         AaiClient aaiClientMock = mock(AaiClient.class);
         ExecutorService executorService = MoreExecutors.newDirectExecutorService();
         AAIServiceTree aaiServiceTree = new AAIServiceTree(
-                aaiClientMock,
-                new AAITreeNodeBuilder(aaiClientMock, new Logging()),
-                new AAITreeConverter(new ModelUtil()),
-                null,
-                null,
-                executorService
+            new AAITreeNodeBuilder(aaiClientMock, new Logging()),
+            null,
+            new AAITreeConverter(new ModelUtil()), null,
+            executorService
         );
 
         String url = "anyUrl/vnf";
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodesEnricherTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodesEnricherTest.java
new file mode 100644 (file)
index 0000000..8aba279
--- /dev/null
@@ -0,0 +1,183 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 - 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.services;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+import static java.util.stream.Collectors.toList;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Streams;
+import java.util.List;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.jetbrains.annotations.NotNull;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.asdc.parser.ServiceModelInflator;
+import org.onap.vid.asdc.parser.ServiceModelInflator.Names;
+import org.onap.vid.model.aaiTree.AAITreeNode;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
+
+public class AAITreeNodesEnricherTest {
+
+    @Mock
+    private AaiClientInterface aaiClient;
+    @Mock
+    private VidService sdcService;
+    @Mock
+    private ServiceModelInflator serviceModelInflator;
+    @Mock
+    private FeatureManager featureManager;
+    @InjectMocks
+    private AAITreeNodesEnricher aaiTreeNodesEnricher;
+
+    @BeforeTest
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    private final static String nullString = "null placeholder";
+
+    @Test
+    public void enrichNodesWithModelCustomizationName_simple3NodesCase_nodesEnriched() {
+
+        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
+                "version id a", new Names("name a", "key a"),
+                "version id b", new Names("name b", "key b"),
+                "version id c", new Names("name c", "key c")
+        ));
+
+        final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c");
+        final ImmutableList<Names> expectedNames = ImmutableList.of(
+                new Names("name a", "key a"),
+                new Names("name b", "key b"),
+                new Names("name c", "key c"));
+
+
+        final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
+        aaiTreeNodesEnricher.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
+
+        assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
+    }
+
+    @Test
+    public void enrichNodesWithModelCustomizationName_noNodes_noError() {
+
+        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
+                "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0", new Names("my model cust name", "my key")
+        ));
+
+        aaiTreeNodesEnricher.enrichNodesWithModelCustomizationName(emptyList(), null);
+    }
+
+    @Test
+    public void enrichNodesWithModelCustomizationName_nothingInModel_nodesUnchanged() {
+
+        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(emptyMap());
+
+        final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c");
+        final Names nullNames = new Names(nullString, nullString);
+        final ImmutableList<Names> expectedNames = ImmutableList.of(nullNames, nullNames, nullNames);
+
+        
+        final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
+
+        aaiTreeNodesEnricher.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
+
+        assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
+    }
+
+    @Test
+    public void enrichNodesWithModelCustomizationName_staggered4NodesAndNull_3nodesEnriched2isNull() {
+
+        when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
+                "version id Z", new Names("name Z", "key Z"),
+                "version id d", new Names(null, "key d"),
+                "version id c", new Names("name c", null),
+                "version id a", new Names("name a", "key a")
+        ));
+
+        final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c", "version id d", nullString);
+        final ImmutableList<Names> expectedNames = ImmutableList.of(
+                new Names("name a", "key a"),
+                new Names(nullString, nullString),
+                new Names("name c", nullString),
+                new Names(nullString, "key d"),
+                new Names(nullString, nullString)
+        );
+
+
+        final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
+
+        aaiTreeNodesEnricher.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
+
+        assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
+    }
+
+
+
+    @NotNull
+    private String[] toStringsArray(List<AAITreeNode> nodes) {
+        return toStrings(nodes).toArray(new String[] {});
+    }
+
+    @NotNull
+    private List<String> toStrings(List<AAITreeNode> nodes) {
+        return nodes.stream().map(n -> {
+            final ReflectionToStringBuilder reflectionToStringBuilder = new ReflectionToStringBuilder(n, ToStringStyle.SHORT_PREFIX_STYLE);
+            reflectionToStringBuilder.setExcludeNullValues(true);
+            return reflectionToStringBuilder.toString();
+        }).collect(toList());
+    }
+
+    @NotNull
+    private List<AAITreeNode> nodesWithVersionIdsAndCustomizationNames(List<String> versionIds, List<Names> customizationNames) {
+        return Streams
+                .zip(versionIds.stream(), customizationNames.stream(), this::nodeWithVersionIdAndCustomizationName)
+                .collect(toList());
+    }
+
+    @NotNull
+    private List<AAITreeNode> nodesWithVersionIds(List<String> versionIds) {
+        return versionIds.stream()
+                .map(versionId -> nodeWithVersionIdAndCustomizationName(versionId, new Names(nullString, nullString)))
+                .collect(toList());
+    }
+
+    private AAITreeNode nodeWithVersionIdAndCustomizationName(String versionId, Names names) {
+        AAITreeNode newNode = new AAITreeNode();
+        newNode.setModelVersionId(versionId.equals(nullString) ? null : versionId);
+        newNode.setModelCustomizationName(names.getModelCustomizationName().equals(nullString) ? null : names.getModelCustomizationName());
+        newNode.setKeyInModel(names.getModelKey().equals(nullString) ? null : names.getModelKey());
+        return newNode;
+    }
+
+}
\ No newline at end of file