Catalog alignment
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / servlets / GroupTypesEndpointTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.servlets;
22
23 import com.fasterxml.jackson.databind.DeserializationFeature;
24 import com.google.common.collect.ImmutableMap;
25 import com.google.common.collect.Sets;
26 import fj.data.Either;
27 import org.glassfish.jersey.client.ClientConfig;
28 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
29 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
30 import org.glassfish.jersey.server.ResourceConfig;
31 import org.junit.Before;
32 import org.junit.BeforeClass;
33 import org.junit.Test;
34 import org.openecomp.sdc.be.components.impl.GroupTypeBusinessLogic;
35 import org.openecomp.sdc.be.components.utils.GroupTypeBuilder;
36 import org.openecomp.sdc.be.components.validation.UserValidations;
37 import org.openecomp.sdc.be.config.ConfigurationManager;
38 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
39 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
40 import org.openecomp.sdc.be.datatypes.elements.GroupTypeDataDefinition;
41 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
42 import org.openecomp.sdc.be.impl.ComponentsUtils;
43 import org.openecomp.sdc.be.model.GroupTypeDefinition;
44 import org.openecomp.sdc.be.model.User;
45 import org.openecomp.sdc.be.model.operations.api.DerivedFromOperation;
46 import org.openecomp.sdc.be.model.operations.impl.CapabilityOperation;
47 import org.openecomp.sdc.be.model.operations.impl.CapabilityTypeOperation;
48 import org.openecomp.sdc.be.model.operations.impl.GroupTypeOperation;
49 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
50 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
51 import org.openecomp.sdc.be.resources.data.GroupTypeData;
52 import org.openecomp.sdc.be.user.UserBusinessLogic;
53 import org.openecomp.sdc.common.api.ConfigurationSource;
54 import org.openecomp.sdc.common.api.Constants;
55 import org.openecomp.sdc.common.impl.ExternalConfiguration;
56 import org.openecomp.sdc.common.impl.FSConfigurationSource;
57 import org.springframework.context.annotation.Bean;
58 import org.springframework.context.annotation.Import;
59
60 import javax.ws.rs.client.Invocation;
61 import javax.ws.rs.core.GenericType;
62 import javax.ws.rs.core.MediaType;
63 import java.util.HashSet;
64 import java.util.List;
65 import java.util.Map;
66 import java.util.Set;
67 import java.util.stream.Stream;
68
69 import static java.util.Arrays.asList;
70 import static org.assertj.core.api.Assertions.assertThat;
71 import static org.mockito.ArgumentMatchers.any;
72 import static org.mockito.ArgumentMatchers.eq;
73 import static org.mockito.Mockito.mock;
74 import static org.mockito.Mockito.when;
75
76 public class GroupTypesEndpointTest extends JerseySpringBaseTest {
77
78     private static final String USER_ID = "a001";
79     private static final GroupTypeDefinition EMPTY_GROUP_TYPE = new GroupTypeDefinition();
80     private static final String COMPONENT_TYPE = "VF";
81     private static final HashSet<String> EXCLUDED_TYPES = Sets.newHashSet("Root", "Heat");
82
83     private static ComponentsUtils componentsUtils;
84     private static JanusGraphGenericDao janusGraphGenericDao;
85     private static CapabilityTypeOperation capabilityTypeOperation;
86     private static DerivedFromOperation derivedFromOperation;
87     private static JanusGraphDao janusGraphDao;
88     private static PropertyOperation propertyOperation;
89     private static CapabilityOperation capabilityOperation;
90     private static UserValidations userValidations;
91     private static OperationUtils operationUtils;
92     private static User user;
93
94     static ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), "src/test/resources/config/catalog-be");
95     static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
96
97     @org.springframework.context.annotation.Configuration
98     @Import(BaseTestConfig.class)
99     static class GroupTypesTestConfig {
100
101         @Bean
102         GroupTypesEndpoint groupTypesEndpoint() {
103             UserBusinessLogic userBusinessLogic = mock(UserBusinessLogic.class);
104             ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
105             return new GroupTypesEndpoint(userBusinessLogic, componentsUtils, groupTypeBusinessLogic());
106         }
107
108         @Bean
109         GroupTypeBusinessLogic groupTypeBusinessLogic() {
110             return new GroupTypeBusinessLogic(groupTypeOperation(), janusGraphDao, userValidations, componentsUtils);
111         }
112
113         @Bean
114         GroupTypeOperation groupTypeOperation() {
115             return new GroupTypeOperation(janusGraphGenericDao, propertyOperation, capabilityTypeOperation, capabilityOperation, derivedFromOperation, operationUtils);
116         }
117     }
118
119     @BeforeClass
120     public static void initClass() {
121         componentsUtils = mock(ComponentsUtils.class);
122         propertyOperation = mock(PropertyOperation.class);
123         capabilityTypeOperation = mock(CapabilityTypeOperation.class);
124         janusGraphDao = mock(JanusGraphDao.class);
125         janusGraphGenericDao = mock(JanusGraphGenericDao.class);
126         userValidations = mock(UserValidations.class);
127         operationUtils = mock(OperationUtils.class);
128         user = mock(User.class);
129     }
130
131     @Before
132     public void init() {
133         when(userValidations.validateUserExists(eq(USER_ID))).thenReturn(user);
134         when(janusGraphGenericDao.getByCriteriaWithPredicate(eq(NodeTypeEnum.GroupType), any(), eq(GroupTypeData.class))).thenReturn(Either.left(buildGroupTypeDataList()));
135     }
136
137     @Override
138     protected void configureClient(ClientConfig config) {
139         final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
140         config.register(jacksonJsonProvider);
141     }
142
143     @Override
144     protected ResourceConfig configure() {
145         return super.configure(GroupTypesTestConfig.class)
146                 .register(GroupTypesEndpoint.class);
147     }
148
149     @Test
150     public void verifyExclusionMapIsCaseInsensitive() {
151         Map<String, Set<String>> excludedGroupTypesMapping = configurationManager.getConfiguration().getExcludedGroupTypesMapping();
152         assertThat(excludedGroupTypesMapping.get(COMPONENT_TYPE)).hasSameElementsAs(excludedGroupTypesMapping.get(COMPONENT_TYPE.toLowerCase()));
153     }
154
155     @Test
156     public void getGroupTypes_validUser_Success() {
157         List<GroupTypeDefinition> testConfigGroupTypes = buildGroupTypesList();
158         List<GroupTypeDefinition> fetchedGroupTypes = buildGetGroupTypesCall(USER_ID, COMPONENT_TYPE).get(new GenericType<List<GroupTypeDefinition>>(){});
159         verifyGroupTypesList(testConfigGroupTypes, fetchedGroupTypes);
160     }
161
162     @Test
163     public void getGroupTypes_whenNoInteranlComponentType_passEmptyAsExcludedTypes() {
164         List<GroupTypeDefinition> testConfigGroupTypes = buildGroupTypesList();
165         List<GroupTypeDefinition> fetchedGroupTypes = buildGetGroupTypesCallNoInternalComponent(USER_ID).get(new GenericType<List<GroupTypeDefinition>>(){});
166         verifyGroupTypesList(testConfigGroupTypes, fetchedGroupTypes);
167     }
168
169     private void verifyGroupTypesList(List<GroupTypeDefinition> groupTypes, List<GroupTypeDefinition> fetchedGroupTypes) {
170         String[] expectedReturnFields = {"version", "type", "uniqueId", "name", "icon"};
171         assertThat(fetchedGroupTypes)
172                 .usingElementComparatorOnFields(expectedReturnFields)
173                 .isEqualTo(groupTypes);
174         verifyOnlySpecificFieldsInResponse(fetchedGroupTypes, expectedReturnFields);
175     }
176
177     private void verifyOnlySpecificFieldsInResponse(List<GroupTypeDefinition> fetchedGroupTypes, String ... fields) {
178         assertThat(fetchedGroupTypes)
179                 .usingElementComparatorIgnoringFields(fields)
180                 .containsOnly(EMPTY_GROUP_TYPE);
181     }
182
183     private Invocation.Builder buildGetGroupTypesCall(String userId, String componentType) {
184         return target("/v1/catalog/groupTypes")
185                 .queryParam("internalComponentType", componentType)
186                 .request(MediaType.APPLICATION_JSON)
187                 .header(Constants.USER_ID_HEADER, userId);
188     }
189
190     private Invocation.Builder buildGetGroupTypesCallNoInternalComponent(String userId) {
191         return target("/v1/catalog/groupTypes")
192                 .request(MediaType.APPLICATION_JSON)
193                 .header(Constants.USER_ID_HEADER, userId);
194     }
195
196     private Map<String, Set<String>> buildExcludeGroupTypesMap() {
197         return new ImmutableMap.Builder<String, Set<String>>()
198                 .put("CR", Sets.newHashSet("VFModule", "Root", "Heat"))
199                 .put(COMPONENT_TYPE, EXCLUDED_TYPES)
200                 .build();
201     }
202
203
204     private List<GroupTypeDefinition> buildGroupTypesList() {
205         GroupTypeDefinition type1 = GroupTypeBuilder.create()
206                                                     .setDerivedFrom("root")
207                                                     .setType("org.openecomp.groups.VfModule")
208                                                     .setUniqueId("id1")
209                                                     .setVersion("1.0")
210                                                     .setName("vf module")
211                                                     .setIcon("vf module icon")
212                                                     .build();
213         GroupTypeDefinition type2 = GroupTypeBuilder.create()
214                                                     .setDerivedFrom("root")
215                                                     .setType("org.openecomp.groups.NetworkCollection")
216                                                     .setUniqueId("id2")
217                                                     .setVersion("1.0")
218                                                     .setName("network collection")
219                                                     .setIcon("network collection icon")
220                                                     .build();
221         return asList(type1, type2);
222     }
223
224     private List<GroupTypeData> buildGroupTypeDataList() {
225         GroupTypeDataDefinition d1 = new GroupTypeDataDefinition();
226         d1.setType("org.openecomp.groups.VfModule");
227         d1.setDerivedFrom("root");
228         d1.setUniqueId("id1");
229         d1.setVersion("1.0");
230         d1.setName("vf module");
231         d1.setIcon("vf module icon");
232         GroupTypeData gt1 = new GroupTypeData(d1);
233         GroupTypeDataDefinition d2 = new GroupTypeDataDefinition();
234         d2.setType("org.openecomp.groups.NetworkCollection");
235         d2.setDerivedFrom("root");
236         d2.setUniqueId("id2");
237         d2.setVersion("1.0");
238         d2.setName("network collection");
239         d2.setIcon("network collection icon");
240         GroupTypeData gt2 = new GroupTypeData(d2);
241         return asList(gt1, gt2);
242     }
243
244     private GroupTypeDefinition[] listOfEmptyGroupTypes(int size) {
245         return Stream.generate(GroupTypeDefinition::new).limit(size).toArray(GroupTypeDefinition[]::new);
246     }
247
248
249 }