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 com.fasterxml.jackson.databind.DeserializationFeature;
24 import fj.data.Either;
25 import org.assertj.core.api.AssertionsForClassTypes;
26 import org.glassfish.jersey.client.ClientConfig;
27 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
28 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
29 import org.glassfish.jersey.logging.LoggingFeature;
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.mockito.invocation.InvocationOnMock;
35 import org.mockito.stubbing.Answer;
36 import org.openecomp.sdc.be.components.impl.GroupBusinessLogicNew;
37 import org.openecomp.sdc.be.components.validation.AccessValidations;
38 import org.openecomp.sdc.be.components.validation.ComponentValidations;
39 import org.openecomp.sdc.be.config.ConfigurationManager;
40 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
41 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
42 import org.openecomp.sdc.be.model.ComponentInstance;
43 import org.openecomp.sdc.be.model.GroupDefinition;
44 import org.openecomp.sdc.be.model.GroupProperty;
45 import org.openecomp.sdc.be.model.Resource;
46 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.GroupsOperation;
47 import org.openecomp.sdc.be.model.operations.StorageException;
48 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
49 import org.openecomp.sdc.be.model.operations.impl.GroupOperation;
50 import org.openecomp.sdc.common.api.ConfigurationSource;
51 import org.openecomp.sdc.common.api.Constants;
52 import org.openecomp.sdc.common.impl.ExternalConfiguration;
53 import org.openecomp.sdc.common.impl.FSConfigurationSource;
54 import org.springframework.context.annotation.Bean;
55 import org.springframework.context.annotation.Configuration;
56 import org.springframework.context.annotation.Import;
57 import org.springframework.http.HttpStatus;
59 import javax.ws.rs.client.Entity;
60 import javax.ws.rs.client.Invocation;
61 import javax.ws.rs.core.GenericType;
62 import javax.ws.rs.core.MediaType;
63 import javax.ws.rs.core.Response;
64 import java.util.ArrayList;
65 import java.util.Arrays;
66 import java.util.List;
67 import java.util.Optional;
69 import static org.assertj.core.api.Assertions.assertThat;
70 import static org.mockito.ArgumentMatchers.any;
71 import static org.mockito.ArgumentMatchers.anyString;
72 import static org.mockito.ArgumentMatchers.eq;
73 import static org.mockito.ArgumentMatchers.isA;
74 import static org.mockito.Mockito.anyList;
75 import static org.mockito.Mockito.*;
76 import static org.openecomp.sdc.be.model.operations.api.StorageOperationStatus.NOT_FOUND;
78 public class GroupEndpointTest extends JerseySpringBaseTest {
80 private static final String VALID_USER = "ab001";
81 private static final String INVALID_USER = "ab002";
82 private static final String VALID_COMPONENT_ID = "12345";
83 private static final String INVALID_COMPONENT_ID = "9999";
84 private static final String VALID_GROUP_ID = "1";
85 private static final String INVALID_GROUP_ID = "2";
86 public static final String A = "a";
87 private static final String VL1 = "VL1";
88 private static final String OLD_VALUE = "old value";
89 private static AccessValidations accessValidations;
90 private static ComponentValidations componentValidations;
91 private static GroupsOperation groupsOperation;
92 private static GroupOperation groupOperation;
94 private GroupDefinition g1;
95 private ComponentInstance ci;
96 private GroupProperty gp1;
99 @Import(BaseTestConfig.class)
100 static class GroupEndpointTestConfig {
103 GroupEndpoint groupEndpoint() {
104 return new GroupEndpoint(groupBusinessLogic());
108 GroupBusinessLogicNew groupBusinessLogic() {
109 return new GroupBusinessLogicNew(accessValidations, componentValidations, groupsOperation, groupOperation);
114 public static void initClass() {
115 ExternalConfiguration.setAppName("catalog-be");
116 String appConfigDir = "src/test/resources/config/catalog-be";
117 ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
118 ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
119 //ComponentsUtils needs configuration singleton to be set
120 componentValidations = mock(ComponentValidations.class);
121 accessValidations = mock(AccessValidations.class);
122 groupsOperation = mock(GroupsOperation.class);
123 groupOperation = mock(GroupOperation.class);
128 protected void configureClient(ClientConfig config) {
129 final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
130 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
131 config.register(jacksonJsonProvider);
135 protected ResourceConfig configure() {
136 return super.configure(GroupEndpointTestConfig.class)
137 .register(GroupEndpoint.class)
138 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
144 cr.setSystemName("CR1");
145 g1 = new GroupDefinition();
146 g1.setUniqueId(VALID_GROUP_ID);
147 gp1 = new GroupProperty();
148 gp1.setUniqueId("1");
150 gp1.setValue(OLD_VALUE);
151 g1.setProperties(Arrays.asList(gp1));
152 cr.setGroups(Arrays.asList(g1));
153 ci = new ComponentInstance();
156 happyScenarioSetup();
157 unhappyScenarioSetup();
160 private void unhappyScenarioSetup() {
161 when(accessValidations.validateUserCanWorkOnComponent(eq(INVALID_COMPONENT_ID), eq(ComponentTypeEnum.RESOURCE), eq(VALID_USER), anyString())).thenThrow(new StorageException(NOT_FOUND, INVALID_COMPONENT_ID));
162 when(componentValidations.getComponentInstance(cr, A)).thenReturn(Optional.of(ci));
166 private void happyScenarioSetup() {
167 when(accessValidations.validateUserCanWorkOnComponent(eq(VALID_COMPONENT_ID), any(ComponentTypeEnum.class), eq(VALID_USER), anyString())).thenReturn(cr);
168 when(accessValidations.validateUserCanRetrieveComponentData(eq(VALID_COMPONENT_ID), eq("resources"), eq(VALID_USER), anyString()))
170 when(componentValidations.getComponentInstance(cr, A)).thenReturn(Optional.of(ci));
171 doNothing().when(groupsOperation).updateGroupOnComponent(eq(VALID_COMPONENT_ID), isA(GroupDefinition.class));
172 when(groupOperation.validateAndUpdatePropertyValue(isA(GroupProperty.class))).thenReturn(StorageOperationStatus.OK);
173 when(groupsOperation.updateGroupPropertiesOnComponent(eq(VALID_COMPONENT_ID), isA(GroupDefinition.class), anyList())).thenAnswer(new Answer<Either>() {
175 public Either answer(InvocationOnMock invocationOnMock) throws Throwable {
176 Object[] args = invocationOnMock.getArguments();
177 return Either.left(Arrays.asList(args[2]));
183 public void updateGroupMembers_success() {
184 List<String> ids = Arrays.asList(A);
185 List<String> updatedIds = buildUpdateGroupMembersCall(VALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
186 .post(Entity.entity(ids, MediaType.APPLICATION_JSON), new GenericType<List<String>>() {
188 assertThat(updatedIds.size()).isEqualTo(ids.size());
189 assertThat(updatedIds).containsExactlyInAnyOrder(ids.toArray(new String[ids.size()]));
193 public void updateGroupMembersWith2IdenticalMembers_success() {
194 List<String> ids = Arrays.asList(A, A);
195 List<String> updatedIds = buildUpdateGroupMembersCall(VALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
196 .post(Entity.entity(ids, MediaType.APPLICATION_JSON), new GenericType<List<String>>() {
198 assertThat(updatedIds.size()).isEqualTo(1);
199 assertThat(updatedIds).containsExactlyInAnyOrder(String.valueOf(A));
203 public void updateGroupMembersWithEmptyList_success() {
204 List<String> ids = new ArrayList<>();
205 List<String> updatedIds = buildUpdateGroupMembersCall(VALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
206 .post(Entity.entity(ids, MediaType.APPLICATION_JSON), new GenericType<List<String>>() {
208 assertThat(updatedIds.size()).isEqualTo(0);
212 public void updateGroupMember_InvalidComponentId_failure() {
213 List<String> ids = new ArrayList<>();
214 Response response = buildUpdateGroupMembersCall(INVALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
215 .post(Entity.entity(ids, MediaType.APPLICATION_JSON), Response.class);
216 AssertionsForClassTypes.assertThat(response.getStatus()).isEqualTo(HttpStatus.NOT_FOUND.value());
220 public void updateGroupProperty_success() {
221 GroupProperty property = new GroupProperty();
222 property.setValue("value1");
223 property.setName("prop");
224 String propertyStr = "[{\"uniqueId\":\"1\",\"type\":null,\"required\":false,\"definition\":false,\"defaultValue\":null,\"description\":null,\"schema\":null,\"password\":false,\"name\":\"p1\",\"value\":\"new value\",\"label\":null,\"hidden\":false,\"immutable\":false,\"inputPath\":null,\"status\":null,\"inputId\":null,\"instanceUniqueId\":null,\"propertyId\":null,\"parentUniqueId\":null,\"getInputValues\":null,\"constraints\":null,\"valueUniqueUid\":null,\"ownerId\":null}]";
225 List<GroupProperty> properties = Arrays.asList(property);
226 //TODO define GroupPropertyDTO (after finding other usage in UI code) and improve test coverage
227 // List<GroupProperty> updatedProperties = buildUpdateGroupPropertiesCall(VALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
228 // .put(Entity.entity(propertyStr, MediaType.APPLICATION_JSON), new GenericType<List<GroupProperty>>() {
230 // assertThat(updatedProperties.size()).isEqualTo(1);
231 Response response = buildUpdateGroupPropertiesCall(VALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
232 .put(Entity.entity(propertyStr, MediaType.APPLICATION_JSON));
233 assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
237 public void getGroupProperties_success() {
238 List<PropertyDataDefinition> properties = buildUpdateGroupPropertiesCall(VALID_COMPONENT_ID, VALID_GROUP_ID, VALID_USER)
239 .get(new GenericType<List<PropertyDataDefinition>>(){});
240 assertThat(properties.size()).isEqualTo(1);
241 assertThat(properties.get(0).getValue()).isEqualTo(OLD_VALUE);
244 private Invocation.Builder buildUpdateGroupMembersCall(String componentId, String groupId, String userId) {
245 return target("/v1/catalog/resources/" + componentId + "/groups/" + groupId + "/members")
246 .request(MediaType.APPLICATION_JSON)
247 .accept(MediaType.APPLICATION_JSON)
248 .header(Constants.USER_ID_HEADER, userId);
251 private Invocation.Builder buildUpdateGroupPropertiesCall(String componentId, String groupId, String userId) {
252 return target("/v1/catalog/resources/" + componentId + "/groups/" + groupId + "/properties")
253 .request(MediaType.APPLICATION_JSON)
254 .accept(MediaType.APPLICATION_JSON)
255 .header(Constants.USER_ID_HEADER, userId);