2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.servlets;
23 import static java.util.Arrays.asList;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.eq;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.when;
30 import com.fasterxml.jackson.databind.DeserializationFeature;
31 import com.google.common.collect.ImmutableMap;
32 import com.google.common.collect.Sets;
33 import fj.data.Either;
34 import java.util.HashSet;
35 import java.util.List;
38 import java.util.stream.Stream;
39 import javax.ws.rs.client.Invocation;
40 import javax.ws.rs.core.GenericType;
41 import javax.ws.rs.core.MediaType;
42 import org.glassfish.jersey.client.ClientConfig;
43 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
44 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
45 import org.glassfish.jersey.server.ResourceConfig;
46 import org.glassfish.jersey.test.TestProperties;
47 import org.junit.jupiter.api.AfterEach;
48 import org.junit.jupiter.api.BeforeAll;
49 import org.junit.jupiter.api.BeforeEach;
50 import org.junit.jupiter.api.Test;
51 import org.openecomp.sdc.be.components.impl.GroupTypeBusinessLogic;
52 import org.openecomp.sdc.be.components.utils.GroupTypeBuilder;
53 import org.openecomp.sdc.be.components.validation.UserValidations;
54 import org.openecomp.sdc.be.config.ConfigurationManager;
55 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
56 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
57 import org.openecomp.sdc.be.datatypes.elements.GroupTypeDataDefinition;
58 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
59 import org.openecomp.sdc.be.impl.ComponentsUtils;
60 import org.openecomp.sdc.be.model.GroupTypeDefinition;
61 import org.openecomp.sdc.be.model.User;
62 import org.openecomp.sdc.be.model.operations.api.DerivedFromOperation;
63 import org.openecomp.sdc.be.model.operations.impl.CapabilityOperation;
64 import org.openecomp.sdc.be.model.operations.impl.CapabilityTypeOperation;
65 import org.openecomp.sdc.be.model.operations.impl.GroupTypeOperation;
66 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
67 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
68 import org.openecomp.sdc.be.resources.data.GroupTypeData;
69 import org.openecomp.sdc.be.user.UserBusinessLogic;
70 import org.openecomp.sdc.common.api.ConfigurationSource;
71 import org.openecomp.sdc.common.api.Constants;
72 import org.openecomp.sdc.common.impl.ExternalConfiguration;
73 import org.openecomp.sdc.common.impl.FSConfigurationSource;
74 import org.springframework.context.annotation.Bean;
75 import org.springframework.context.annotation.Import;
77 class GroupTypesEndpointTest extends JerseySpringBaseTest {
79 private static final String USER_ID = "a001";
80 private static final GroupTypeDefinition EMPTY_GROUP_TYPE = new GroupTypeDefinition();
81 private static final String COMPONENT_TYPE = "VF";
82 private static final HashSet<String> EXCLUDED_TYPES = Sets.newHashSet("Root", "Heat");
84 private static ComponentsUtils componentsUtils;
85 private static JanusGraphGenericDao janusGraphGenericDao;
86 private static CapabilityTypeOperation capabilityTypeOperation;
87 private static DerivedFromOperation derivedFromOperation;
88 private static JanusGraphDao janusGraphDao;
89 private static PropertyOperation propertyOperation;
90 private static CapabilityOperation capabilityOperation;
91 private static UserValidations userValidations;
92 private static OperationUtils operationUtils;
93 private static User user;
95 static ConfigurationSource configurationSource = new FSConfigurationSource(
96 ExternalConfiguration.getChangeListener(), "src/test/resources/config/catalog-be");
97 static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
99 @org.springframework.context.annotation.Configuration
100 @Import(BaseTestConfig.class)
101 static class GroupTypesTestConfig {
104 GroupTypesEndpoint groupTypesEndpoint() {
105 UserBusinessLogic userBusinessLogic = mock(UserBusinessLogic.class);
106 ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
107 return new GroupTypesEndpoint(userBusinessLogic, componentsUtils, groupTypeBusinessLogic());
111 GroupTypeBusinessLogic groupTypeBusinessLogic() {
112 return new GroupTypeBusinessLogic(groupTypeOperation(), janusGraphDao, userValidations, componentsUtils);
116 GroupTypeOperation groupTypeOperation() {
117 return new GroupTypeOperation(janusGraphGenericDao, propertyOperation, capabilityTypeOperation,
118 capabilityOperation, derivedFromOperation, operationUtils);
123 public static void initClass() {
124 componentsUtils = mock(ComponentsUtils.class);
125 propertyOperation = mock(PropertyOperation.class);
126 capabilityTypeOperation = mock(CapabilityTypeOperation.class);
127 janusGraphDao = mock(JanusGraphDao.class);
128 janusGraphGenericDao = mock(JanusGraphGenericDao.class);
129 userValidations = mock(UserValidations.class);
130 operationUtils = mock(OperationUtils.class);
131 user = mock(User.class);
135 public void before() throws Exception {
137 when(userValidations.validateUserExists(eq(USER_ID))).thenReturn(user);
139 janusGraphGenericDao.getByCriteriaWithPredicate(eq(NodeTypeEnum.GroupType), any(), eq(GroupTypeData.class)))
140 .thenReturn(Either.left(buildGroupTypeDataList()));
144 void after() throws Exception {
149 protected void configureClient(ClientConfig config) {
150 final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
151 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
152 config.register(jacksonJsonProvider);
156 protected ResourceConfig configure() {
157 forceSet(TestProperties.CONTAINER_PORT, "0");
158 return super.configure(GroupTypesTestConfig.class)
159 .register(GroupTypesEndpoint.class);
163 void verifyExclusionMapIsCaseInsensitive() {
164 Map<String, Set<String>> excludedGroupTypesMapping = configurationManager.getConfiguration()
165 .getExcludedGroupTypesMapping();
166 assertThat(excludedGroupTypesMapping.get(COMPONENT_TYPE))
167 .hasSameElementsAs(excludedGroupTypesMapping.get(COMPONENT_TYPE.toLowerCase()));
171 void getGroupTypes_validUser_Success() {
172 List<GroupTypeDefinition> testConfigGroupTypes = buildGroupTypesList();
173 List<GroupTypeDefinition> fetchedGroupTypes = buildGetGroupTypesCall(USER_ID, COMPONENT_TYPE)
174 .get(new GenericType<List<GroupTypeDefinition>>() {
176 verifyGroupTypesList(testConfigGroupTypes, fetchedGroupTypes);
180 void getGroupTypes_whenNoInteranlComponentType_passEmptyAsExcludedTypes() {
181 List<GroupTypeDefinition> testConfigGroupTypes = buildGroupTypesList();
182 List<GroupTypeDefinition> fetchedGroupTypes = buildGetGroupTypesCallNoInternalComponent(USER_ID)
183 .get(new GenericType<List<GroupTypeDefinition>>() {
185 verifyGroupTypesList(testConfigGroupTypes, fetchedGroupTypes);
188 private void verifyGroupTypesList(List<GroupTypeDefinition> groupTypes,
189 List<GroupTypeDefinition> fetchedGroupTypes) {
190 String[] expectedReturnFields = {"version", "type", "uniqueId", "name", "icon"};
191 assertThat(fetchedGroupTypes)
192 .usingElementComparatorOnFields(expectedReturnFields)
193 .isEqualTo(groupTypes);
194 verifyOnlySpecificFieldsInResponse(fetchedGroupTypes, expectedReturnFields);
197 private void verifyOnlySpecificFieldsInResponse(List<GroupTypeDefinition> fetchedGroupTypes, String... fields) {
198 assertThat(fetchedGroupTypes)
199 .usingElementComparatorIgnoringFields(fields)
200 .containsOnly(EMPTY_GROUP_TYPE);
203 private Invocation.Builder buildGetGroupTypesCall(String userId, String componentType) {
204 return target("/v1/catalog/groupTypes")
205 .queryParam("internalComponentType", componentType)
206 .request(MediaType.APPLICATION_JSON)
207 .header(Constants.USER_ID_HEADER, userId);
210 private Invocation.Builder buildGetGroupTypesCallNoInternalComponent(String userId) {
211 return target("/v1/catalog/groupTypes")
212 .request(MediaType.APPLICATION_JSON)
213 .header(Constants.USER_ID_HEADER, userId);
216 private Map<String, Set<String>> buildExcludeGroupTypesMap() {
217 return new ImmutableMap.Builder<String, Set<String>>()
218 .put("CR", Sets.newHashSet("VFModule", "Root", "Heat"))
219 .put(COMPONENT_TYPE, EXCLUDED_TYPES)
224 private List<GroupTypeDefinition> buildGroupTypesList() {
225 GroupTypeDefinition type1 = GroupTypeBuilder.create()
226 .setDerivedFrom("root")
227 .setType("org.openecomp.groups.VfModule")
230 .setName("vf module")
231 .setIcon("vf module icon")
233 GroupTypeDefinition type2 = GroupTypeBuilder.create()
234 .setDerivedFrom("root")
235 .setType("org.openecomp.groups.NetworkCollection")
238 .setName("network collection")
239 .setIcon("network collection icon")
241 return asList(type1, type2);
244 private List<GroupTypeData> buildGroupTypeDataList() {
245 GroupTypeDataDefinition d1 = new GroupTypeDataDefinition();
246 d1.setType("org.openecomp.groups.VfModule");
247 d1.setDerivedFrom("root");
248 d1.setUniqueId("id1");
249 d1.setVersion("1.0");
250 d1.setName("vf module");
251 d1.setIcon("vf module icon");
252 GroupTypeData gt1 = new GroupTypeData(d1);
253 GroupTypeDataDefinition d2 = new GroupTypeDataDefinition();
254 d2.setType("org.openecomp.groups.NetworkCollection");
255 d2.setDerivedFrom("root");
256 d2.setUniqueId("id2");
257 d2.setVersion("1.0");
258 d2.setName("network collection");
259 d2.setIcon("network collection icon");
260 GroupTypeData gt2 = new GroupTypeData(d2);
261 return asList(gt1, gt2);
264 private GroupTypeDefinition[] listOfEmptyGroupTypes(int size) {
265 return Stream.generate(GroupTypeDefinition::new).limit(size).toArray(GroupTypeDefinition[]::new);