Fix locally failing TCs in catalog-be
[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 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;
29
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;
36 import java.util.Map;
37 import java.util.Set;
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;
76
77 class GroupTypesEndpointTest extends JerseySpringBaseTest {
78
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");
83
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;
94
95     static ConfigurationSource configurationSource = new FSConfigurationSource(
96         ExternalConfiguration.getChangeListener(), "src/test/resources/config/catalog-be");
97     static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
98
99     @org.springframework.context.annotation.Configuration
100     @Import(BaseTestConfig.class)
101     static class GroupTypesTestConfig {
102
103         @Bean
104         GroupTypesEndpoint groupTypesEndpoint() {
105             UserBusinessLogic userBusinessLogic = mock(UserBusinessLogic.class);
106             ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
107             return new GroupTypesEndpoint(userBusinessLogic, componentsUtils, groupTypeBusinessLogic());
108         }
109
110         @Bean
111         GroupTypeBusinessLogic groupTypeBusinessLogic() {
112             return new GroupTypeBusinessLogic(groupTypeOperation(), janusGraphDao, userValidations, componentsUtils);
113         }
114
115         @Bean
116         GroupTypeOperation groupTypeOperation() {
117             return new GroupTypeOperation(janusGraphGenericDao, propertyOperation, capabilityTypeOperation,
118                 capabilityOperation, derivedFromOperation, operationUtils);
119         }
120     }
121
122     @BeforeAll
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);
132     }
133
134     @BeforeEach
135     public void before() throws Exception {
136         super.setUp();
137         when(userValidations.validateUserExists(eq(USER_ID))).thenReturn(user);
138         when(
139             janusGraphGenericDao.getByCriteriaWithPredicate(eq(NodeTypeEnum.GroupType), any(), eq(GroupTypeData.class)))
140             .thenReturn(Either.left(buildGroupTypeDataList()));
141     }
142
143     @AfterEach
144     void after() throws Exception {
145         super.tearDown();
146     }
147
148     @Override
149     protected void configureClient(ClientConfig config) {
150         final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
151             .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
152         config.register(jacksonJsonProvider);
153     }
154
155     @Override
156     protected ResourceConfig configure() {
157         forceSet(TestProperties.CONTAINER_PORT, "0");
158         return super.configure(GroupTypesTestConfig.class)
159             .register(GroupTypesEndpoint.class);
160     }
161
162     @Test
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()));
168     }
169
170     @Test
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>>() {
175             });
176         verifyGroupTypesList(testConfigGroupTypes, fetchedGroupTypes);
177     }
178
179     @Test
180     void getGroupTypes_whenNoInteranlComponentType_passEmptyAsExcludedTypes() {
181         List<GroupTypeDefinition> testConfigGroupTypes = buildGroupTypesList();
182         List<GroupTypeDefinition> fetchedGroupTypes = buildGetGroupTypesCallNoInternalComponent(USER_ID)
183             .get(new GenericType<List<GroupTypeDefinition>>() {
184             });
185         verifyGroupTypesList(testConfigGroupTypes, fetchedGroupTypes);
186     }
187
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);
195     }
196
197     private void verifyOnlySpecificFieldsInResponse(List<GroupTypeDefinition> fetchedGroupTypes, String... fields) {
198         assertThat(fetchedGroupTypes)
199             .usingElementComparatorIgnoringFields(fields)
200             .containsOnly(EMPTY_GROUP_TYPE);
201     }
202
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);
208     }
209
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);
214     }
215
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)
220             .build();
221     }
222
223
224     private List<GroupTypeDefinition> buildGroupTypesList() {
225         GroupTypeDefinition type1 = GroupTypeBuilder.create()
226             .setDerivedFrom("root")
227             .setType("org.openecomp.groups.VfModule")
228             .setUniqueId("id1")
229             .setVersion("1.0")
230             .setName("vf module")
231             .setIcon("vf module icon")
232             .build();
233         GroupTypeDefinition type2 = GroupTypeBuilder.create()
234             .setDerivedFrom("root")
235             .setType("org.openecomp.groups.NetworkCollection")
236             .setUniqueId("id2")
237             .setVersion("1.0")
238             .setName("network collection")
239             .setIcon("network collection icon")
240             .build();
241         return asList(type1, type2);
242     }
243
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);
262     }
263
264     private GroupTypeDefinition[] listOfEmptyGroupTypes(int size) {
265         return Stream.generate(GroupTypeDefinition::new).limit(size).toArray(GroupTypeDefinition[]::new);
266     }
267
268
269 }