Fix locally failing TCs in catalog-be
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / servlets / UserEndpointTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
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 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;
32
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;
71
72 class UserEndpointTest extends JerseySpringBaseTest {
73
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";
77
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;
83
84     private UserData userData = new UserData();
85     private UserData modifierData = new UserData();
86
87     @org.springframework.context.annotation.Configuration
88     @Import(BaseTestConfig.class)
89     static class UserTestConfig {
90
91         @Bean
92         UserAdminServlet userEndpoint() {
93             ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
94             return new UserAdminServlet(userBusinessLogic(), componentsUtils, userBusinessLogicExt());
95         }
96
97         @Bean
98         UserBusinessLogic userBusinessLogic() {
99             return new UserBusinessLogic(userAdminOperation(), componentUtils, facadeUserOperation);
100         }
101
102         @Bean
103         UserBusinessLogicExt userBusinessLogicExt() {
104             return new UserBusinessLogicExt(userBusinessLogic(), userAdminOperation(), lifecycleBusinessLogic,
105                 componentUtils);
106         }
107
108         @Bean
109         UserAdminOperation userAdminOperation() {
110             return new UserAdminOperation(janusGraphGenericDao, toscaOperationFacade);
111         }
112     }
113
114     @BeforeAll
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);
121     }
122
123     @BeforeEach
124     public void before() throws Exception {
125         super.setUp();
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));
138     }
139
140     @AfterEach
141     void after() throws Exception {
142         super.tearDown();
143     }
144
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());
149     }
150
151     @Override
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);
157     }
158
159     @Override
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");
165     }
166
167     @Test
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)
172             .get(User.class);
173         assertThat(user.getUserId()).isEqualTo(USER_ID);
174     }
175
176     @Test
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)
181             .get(String.class);
182         assertThat(result).isEqualTo("{ \"role\" : \"" + DESIGNER.name() + "\" }");
183     }
184
185     @Test
186     void updateUserRole_success() {
187         UserAdminServlet.UserRole role = new UserAdminServlet.UserRole();
188         role.setRole(ADMIN);
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());
203     }
204
205     @Test
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);
221     }
222
223     @Test
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")
232             .get(User.class);
233         assertThat(user.getUserId()).isEqualTo(USER_ID);
234     }
235
236     @Test
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)
250             .delete(User.class);
251         assertThat(user.getUserId()).isEqualTo(USER_ID);
252     }
253
254 }