2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2020 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 org.assertj.core.api.Assertions.assertThat;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.eq;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.when;
28 import static org.openecomp.sdc.be.dao.utils.UserStatusEnum.ACTIVE;
29 import static org.openecomp.sdc.be.dao.utils.UserStatusEnum.INACTIVE;
30 import static org.openecomp.sdc.be.user.Role.ADMIN;
31 import static org.openecomp.sdc.be.user.Role.DESIGNER;
33 import com.fasterxml.jackson.databind.DeserializationFeature;
34 import fj.data.Either;
35 import java.util.ArrayList;
36 import javax.ws.rs.client.Entity;
37 import javax.ws.rs.core.MediaType;
38 import javax.ws.rs.core.Response;
39 import org.eclipse.jetty.http.HttpStatus;
40 import org.glassfish.jersey.client.ClientConfig;
41 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
42 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
43 import org.glassfish.jersey.logging.LoggingFeature;
44 import org.glassfish.jersey.media.multipart.MultiPartFeature;
45 import org.glassfish.jersey.server.ResourceConfig;
46 import org.glassfish.jersey.test.TestProperties;
47 import org.janusgraph.graphdb.types.system.EmptyVertex;
48 import org.junit.jupiter.api.AfterEach;
49 import org.junit.jupiter.api.BeforeAll;
50 import org.junit.jupiter.api.BeforeEach;
51 import org.junit.jupiter.api.Test;
52 import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
53 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
54 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
55 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
56 import org.openecomp.sdc.be.dao.utils.UserStatusEnum;
57 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
58 import org.openecomp.sdc.be.facade.operations.UserOperation;
59 import org.openecomp.sdc.be.impl.ComponentsUtils;
60 import org.openecomp.sdc.be.model.User;
61 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
62 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
63 import org.openecomp.sdc.be.model.operations.impl.UserAdminOperation;
64 import org.openecomp.sdc.be.resources.data.UserData;
65 import org.openecomp.sdc.be.user.Role;
66 import org.openecomp.sdc.be.user.UserBusinessLogic;
67 import org.openecomp.sdc.be.user.UserBusinessLogicExt;
68 import org.openecomp.sdc.common.api.Constants;
69 import org.springframework.context.annotation.Bean;
70 import org.springframework.context.annotation.Import;
72 class UserEndpointTest extends JerseySpringBaseTest {
74 private static final String USER_ID = "jh0003";
75 private static final String NEW_USER_ID = "ab0001";
76 private static final String MODIFIER_ID = "admin1";
78 private static ComponentsUtils componentUtils;
79 private static JanusGraphGenericDao janusGraphGenericDao;
80 private static ToscaOperationFacade toscaOperationFacade;
81 private static LifecycleBusinessLogic lifecycleBusinessLogic;
82 private static UserOperation facadeUserOperation;
84 private UserData userData = new UserData();
85 private UserData modifierData = new UserData();
87 @org.springframework.context.annotation.Configuration
88 @Import(BaseTestConfig.class)
89 static class UserTestConfig {
92 UserAdminServlet userEndpoint() {
93 ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
94 return new UserAdminServlet(userBusinessLogic(), componentsUtils, userBusinessLogicExt());
98 UserBusinessLogic userBusinessLogic() {
99 return new UserBusinessLogic(userAdminOperation(), componentUtils, facadeUserOperation);
103 UserBusinessLogicExt userBusinessLogicExt() {
104 return new UserBusinessLogicExt(userBusinessLogic(), userAdminOperation(), lifecycleBusinessLogic,
109 UserAdminOperation userAdminOperation() {
110 return new UserAdminOperation(janusGraphGenericDao, toscaOperationFacade);
115 public static void initClass() {
116 janusGraphGenericDao = mock(JanusGraphGenericDao.class);
117 componentUtils = mock(ComponentsUtils.class);
118 toscaOperationFacade = mock(ToscaOperationFacade.class);
119 lifecycleBusinessLogic = mock(LifecycleBusinessLogic.class);
120 facadeUserOperation = mock(UserOperation.class);
124 public void before() throws Exception {
126 setUserProperties(userData, USER_ID, DESIGNER, ACTIVE);
127 setUserProperties(modifierData, MODIFIER_ID, ADMIN, ACTIVE);
128 Either<UserData, JanusGraphOperationStatus> janusGraphValidUser = Either.left(userData);
129 Either<UserData, JanusGraphOperationStatus> janusGraphValidModifier = Either.left(modifierData);
130 when(janusGraphGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), USER_ID, UserData.class))
131 .thenReturn(janusGraphValidUser);
132 when(janusGraphGenericDao
133 .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), MODIFIER_ID, UserData.class))
134 .thenReturn(janusGraphValidModifier);
135 when(janusGraphGenericDao
136 .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), NEW_USER_ID, UserData.class))
137 .thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
141 void after() throws Exception {
145 private void setUserProperties(UserData user, String userId, Role role, UserStatusEnum statusEnum) {
146 user.setUserId(userId);
147 user.setRole(role.name());
148 user.setStatus(statusEnum.name());
152 protected void configureClient(ClientConfig config) {
153 final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
154 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
155 config.register(jacksonJsonProvider);
156 config.register(MultiPartFeature.class);
160 protected ResourceConfig configure() {
161 forceSet(TestProperties.CONTAINER_PORT, "0");
162 return super.configure(UserEndpointTest.UserTestConfig.class)
163 .register(UserAdminServlet.class)
164 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
168 void getUser_success() {
169 User user = target().path("/v1/user/" + USER_ID)
170 .request(MediaType.APPLICATION_JSON)
171 .header(Constants.USER_ID_HEADER, USER_ID)
173 assertThat(user.getUserId()).isEqualTo(USER_ID);
177 void getUserRole_success() {
178 String result = target().path("/v1/user/" + USER_ID + "/role")
179 .request(MediaType.APPLICATION_JSON)
180 .header(Constants.USER_ID_HEADER, MODIFIER_ID)
182 assertThat(result).isEqualTo("{ \"role\" : \"" + DESIGNER.name() + "\" }");
186 void updateUserRole_success() {
187 UserAdminServlet.UserRole role = new UserAdminServlet.UserRole();
189 EmptyVertex emptyVertex = new EmptyVertex();
190 UserData updatedUser = new UserData();
191 setUserProperties(updatedUser, USER_ID, ADMIN, ACTIVE);
192 when(janusGraphGenericDao.getVertexByProperty(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), USER_ID))
193 .thenReturn(Either.left(emptyVertex));
194 when(janusGraphGenericDao.getOutgoingEdgesByCriteria(eq(emptyVertex), eq(GraphEdgeLabels.STATE), any()))
195 .thenReturn(Either.left(new ArrayList<>()));
196 when(janusGraphGenericDao.updateNode(eq(updatedUser), eq(UserData.class))).thenReturn(Either.left(updatedUser));
197 User user = target().path("/v1/user/" + USER_ID + "/role")
198 .request(MediaType.APPLICATION_JSON)
199 .accept(MediaType.APPLICATION_JSON)
200 .header(Constants.USER_ID_HEADER, MODIFIER_ID)
201 .post(Entity.entity(role, MediaType.APPLICATION_JSON), User.class);
202 assertThat(user.getRole()).isEqualTo(ADMIN.name());
206 void createUser_success() {
207 User newUser = new User();
208 newUser.setUserId(NEW_USER_ID);
209 UserData updatedUser = new UserData();
210 setUserProperties(updatedUser, NEW_USER_ID, DESIGNER, ACTIVE);
211 //when(janusGraphGenericDao.updateNode(any(), eq(UserData.class))).thenReturn(Either.left(updatedUser));
212 when(janusGraphGenericDao.createNode(any(), eq(UserData.class))).thenReturn(Either.left(updatedUser));
213 Response response = target().path("/v1/user")
214 .request(MediaType.APPLICATION_JSON)
215 .header(Constants.USER_ID_HEADER, MODIFIER_ID)
216 .post(Entity.entity(newUser, MediaType.APPLICATION_JSON), Response.class);
217 assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201);
218 User createdUser = response.readEntity(User.class);
219 assertThat(createdUser.getUserId()).isEqualTo(NEW_USER_ID);
220 assertThat(createdUser.getStatus()).isEqualTo(ACTIVE);
224 void authorizeUser_success() {
225 when(janusGraphGenericDao.updateNode(any(), eq(UserData.class))).thenReturn(Either.left(userData));
226 User user = target().path("/v1/user/authorize")
227 .request(MediaType.APPLICATION_JSON)
228 .header(Constants.USER_ID_HEADER, USER_ID)
229 .header("HTTP_CSP_FIRSTNAME", "Jimmy")
230 .header("HTTP_CSP_LASTNAME", "Hendrix")
231 .header("HTTP_CSP_EMAIL", "admin@sdc.com")
233 assertThat(user.getUserId()).isEqualTo(USER_ID);
237 void deactivateUser_success() {
238 EmptyVertex emptyVertex = new EmptyVertex();
239 UserData updatedUser = new UserData();
240 setUserProperties(updatedUser, USER_ID, DESIGNER, INACTIVE);
241 when(janusGraphGenericDao.getVertexByProperty(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), USER_ID))
242 .thenReturn(Either.left(emptyVertex));
243 when(janusGraphGenericDao.getOutgoingEdgesByCriteria(eq(emptyVertex), eq(GraphEdgeLabels.STATE), any()))
244 .thenReturn(Either.left(new ArrayList<>()));
245 when(janusGraphGenericDao.updateNode(eq(updatedUser), eq(UserData.class))).thenReturn(Either.left(updatedUser));
246 User user = target().path("/v1/user/" + USER_ID)
247 .request(MediaType.APPLICATION_JSON)
248 .accept(MediaType.APPLICATION_JSON)
249 .header(Constants.USER_ID_HEADER, MODIFIER_ID)
251 assertThat(user.getUserId()).isEqualTo(USER_ID);