2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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.model.operations.impl;
23 import org.janusgraph.core.*;
24 import org.janusgraph.graphdb.relations.StandardVertexProperty;
25 import org.janusgraph.graphdb.types.system.EmptyVertex;
26 import org.janusgraph.graphdb.types.system.ImplicitKey;
27 import fj.data.Either;
28 import org.apache.tinkerpop.gremlin.structure.*;
29 import org.junit.Before;
30 import org.junit.BeforeClass;
31 import org.junit.Test;
32 import org.mockito.InjectMocks;
33 import org.mockito.Mockito;
34 import org.mockito.MockitoAnnotations;
35 import org.mockito.stubbing.Answer;
36 import org.openecomp.sdc.be.dao.api.ActionStatus;
37 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
38 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
39 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
40 import org.openecomp.sdc.be.dao.utils.UserStatusEnum;
41 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
42 import org.openecomp.sdc.be.model.ModelTestBase;
43 import org.openecomp.sdc.be.model.User;
44 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
45 import org.openecomp.sdc.be.resources.data.UserData;
46 import org.openecomp.sdc.common.api.UserRoleEnum;
48 import java.time.Instant;
49 import java.util.ArrayList;
50 import java.util.HashMap;
51 import java.util.Iterator;
52 import java.util.List;
54 import static org.assertj.core.api.Assertions.assertThat;
55 import static org.junit.Assert.assertSame;
56 import static org.junit.Assert.assertTrue;
57 import static org.mockito.ArgumentMatchers.any;
58 import static org.mockito.ArgumentMatchers.eq;
59 import static org.mockito.Mockito.*;
61 public class UserAdminOperationTest extends ModelTestBase {
62 private static final JanusGraphGenericDao JANUS_GRAPH_GENERIC_DAO = mock(JanusGraphGenericDao.class);
64 private static final UserAdminOperation userAdminOperation = new UserAdminOperation(
65 JANUS_GRAPH_GENERIC_DAO);
66 private static final String ADMIN = "admin";
69 public static void setup() {
74 public void initMocks() {
75 MockitoAnnotations.initMocks(this);
76 Mockito.reset(JANUS_GRAPH_GENERIC_DAO);
77 mockJanusGraphUpdate();
78 mockJanusGraphDelete();
83 public void testDeActivateUserDataSuccess() {
84 UserData userData = mockJanusGraphGet(ADMIN, UserRoleEnum.ADMIN, true);
86 Either<User, StorageOperationStatus> eitherUser = userAdminOperation.deActivateUser(userAdminOperation.convertToUser(userData));
88 verify(JANUS_GRAPH_GENERIC_DAO, times(1)).updateNode(eq(userData), eq(UserData.class));
89 verify(JANUS_GRAPH_GENERIC_DAO, times(0)).deleteNode(any(UserData.class), eq(UserData.class));
90 assertTrue(eitherUser.isLeft());
91 User user = eitherUser.left().value();
92 assertSame(user.getStatus(), UserStatusEnum.INACTIVE);
96 public void testDeleteUserWithoutResources() {
97 UserData userData = mockJanusGraphGet(ADMIN, UserRoleEnum.ADMIN, true);
99 List<Edge> edgesList = new ArrayList<>();
101 Either<List<Edge>, JanusGraphOperationStatus> eitherResult = Either.left(edgesList);
102 when(JANUS_GRAPH_GENERIC_DAO.getEdgesForNode(userData, Direction.BOTH)).thenReturn(eitherResult);
104 Either<User, ActionStatus> eitherUser = userAdminOperation.deleteUserData(ADMIN);
105 verify(JANUS_GRAPH_GENERIC_DAO, times(0)).updateNode(any(UserData.class), eq(UserData.class));
106 verify(JANUS_GRAPH_GENERIC_DAO, times(1)).deleteNode(userData, UserData.class);
107 assertTrue(eitherUser.isLeft());
112 public void testDeleteUserWithResources() {
113 UserData userData = mockJanusGraphGet(ADMIN, UserRoleEnum.ADMIN, true);
115 List<Edge> edgesList = new ArrayList<>();
116 edgesList.add(getEmptyEdgeImpl());
118 Either<List<Edge>, JanusGraphOperationStatus> eitherResult = Either.left(edgesList);
119 when(JANUS_GRAPH_GENERIC_DAO.getEdgesForNode(userData, Direction.BOTH)).thenReturn(eitherResult);
121 Either<User, ActionStatus> eitherUser = userAdminOperation.deleteUserData(ADMIN);
122 verify(JANUS_GRAPH_GENERIC_DAO, times(0)).updateNode(any(UserData.class), eq(UserData.class));
123 verify(JANUS_GRAPH_GENERIC_DAO, times(0)).deleteNode(any(UserData.class), eq(UserData.class));
124 assertTrue(eitherUser.isRight());
125 assertSame(eitherUser.right().value(), ActionStatus.USER_HAS_ACTIVE_ELEMENTS);
130 public void getUserPendingTasks_shouldReturnNonDeleted() {
131 String userId = "abc123";
132 String userKey = UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User);
133 User user = new User();
134 user.setUserId(userId);
135 JanusGraphVertex userVertex = null;
136 TestVertex component1 = new TestVertex(null);
137 TestVertex component2 = new TestVertex(true);
138 TestVertex component3 = new TestVertex(false);
139 List<Edge> edges = new ArrayList<>();
140 Edge edge1 = new TestEdge(component1, "1");
141 Edge edge2 = new TestEdge(component2, "2");
142 Edge edge3 = new TestEdge(component3, "3");
146 when(JANUS_GRAPH_GENERIC_DAO.getVertexByProperty(userKey, userId)).thenReturn(Either.left(userVertex));
147 when(JANUS_GRAPH_GENERIC_DAO.getOutgoingEdgesByCriteria(any(), any(), any())).thenReturn(Either.left(edges));
148 Either<List<Edge>, StorageOperationStatus> result = userAdminOperation.getUserPendingTasksList(user, new HashMap<>());
149 assertThat(result.isLeft()).isTrue();
150 List<Edge> pendingTasks = result.left().value();
151 assertThat(pendingTasks.size()).isEqualTo(2);
152 assertThat(((TestEdge)pendingTasks.get(0)).getName()).isNotEqualTo("2");
153 assertThat(((TestEdge)pendingTasks.get(1)).getName()).isNotEqualTo("2");
156 private class TestVertex implements JanusGraphVertex {
158 private final Boolean isDeleted;
160 private TestVertex(Boolean isDeleted) {
161 this.isDeleted = isDeleted;
165 public JanusGraphEdge addEdge(String s, Vertex vertex, Object... objects) {
170 public <V> JanusGraphVertexProperty<V> property(String s, V v, Object... objects) {
175 public <V> VertexProperty<V> property(String key) {
176 if (key.equals(GraphPropertiesDictionary.IS_DELETED.getProperty())) {
178 return VertexProperty.empty();
179 return new StandardVertexProperty(1, ImplicitKey.ID, new EmptyVertex(), isDeleted, (byte)1);
181 return VertexProperty.empty();
185 public <V> JanusGraphVertexProperty<V> property(VertexProperty.Cardinality cardinality, String s, V v, Object... objects) {
190 public Iterator<Edge> edges(Direction direction, String... strings) {
195 public Iterator<Vertex> vertices(Direction direction, String... strings) {
205 public long longId() {
210 public boolean hasId() {
215 public String label() {
220 public VertexLabel vertexLabel() {
225 public JanusGraphVertexQuery<? extends JanusGraphVertexQuery> query() {
230 public boolean isModified() {
235 public JanusGraphTransaction graph() {
240 public void remove() {
245 public <V> V valueOrNull(PropertyKey propertyKey) {
250 public boolean isNew() {
255 public boolean isLoaded() {
260 public boolean isRemoved() {
265 public <V> Iterator<VertexProperty<V>> properties(String... strings) {
270 private class TestEdge implements Edge {
272 private final Vertex inVertx;
273 private final String name;
275 TestEdge(Vertex inVertx, String name) {
276 this.inVertx = inVertx;
280 public String getName() {
285 public Iterator<Vertex> vertices(Direction direction) {
290 public Vertex inVertex() {
300 public String label() {
305 public Graph graph() {
310 public <V> Property<V> property(String s, V v) {
315 public void remove() {
320 public <V> Iterator<Property<V>> properties(String... strings) {
325 private Edge getEmptyEdgeImpl() {
330 // TODO Auto-generated method stub
335 public String label() {
336 // TODO Auto-generated method stub
341 public Graph graph() {
342 // TODO Auto-generated method stub
347 public <V> Property<V> property(String key, V value) {
348 // TODO Auto-generated method stub
353 public void remove() {
354 // TODO Auto-generated method stub
359 public Iterator<Vertex> vertices(Direction direction) {
360 // TODO Auto-generated method stub
365 public <V> Iterator<Property<V>> properties(String... propertyKeys) {
366 // TODO Auto-generated method stub
373 private UserData mockJanusGraphGet(String userId, UserRoleEnum role, boolean isActive) {
374 UserData userData = buildUserData(userId, role, isActive);
375 Either<UserData, JanusGraphOperationStatus> eitherUserData = Either.left(userData);
376 when(JANUS_GRAPH_GENERIC_DAO
377 .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), userId, UserData.class)).thenReturn(eitherUserData);
381 private static void mockJanusGraphUpdate() {
382 doAnswer((Answer<Either<UserData, JanusGraphOperationStatus>>) invocation -> {
383 Object[] args = invocation.getArguments();
384 UserData retValue = (UserData) args[0];
385 return Either.left(retValue);
386 }).when(JANUS_GRAPH_GENERIC_DAO).updateNode(any(UserData.class), eq(UserData.class));
389 private static void mockJanusGraphDelete() {
390 doAnswer((Answer<Either<UserData, JanusGraphOperationStatus>>) invocation -> {
391 Object[] args = invocation.getArguments();
392 UserData retValue = (UserData) args[0];
393 return Either.left(retValue);
394 }).when(JANUS_GRAPH_GENERIC_DAO).deleteNode(any(UserData.class), eq(UserData.class));
397 private static UserData buildUserData(String userId, UserRoleEnum role, boolean isActive) {
398 UserData userData = new UserData();
399 userData.setUserId(userId);
400 userData.setRole(role.getName());
401 userData.setEmail("someEmail@somePlace.com");
402 userData.setFirstName("israel");
403 userData.setLastName("israeli");
404 userData.setLastLoginTime(Instant.MIN.getEpochSecond());
405 userData.setStatus(isActive ? UserStatusEnum.ACTIVE.name() : UserStatusEnum.INACTIVE.name());