1 package de.dlr.shepard.auth.users.daos;
2
3 import static org.junit.jupiter.api.Assertions.assertEquals;
4 import static org.junit.jupiter.api.Assertions.assertFalse;
5 import static org.junit.jupiter.api.Assertions.assertTrue;
6 import static org.mockito.Mockito.doNothing;
7 import static org.mockito.Mockito.verify;
8 import static org.mockito.Mockito.when;
9
10 import de.dlr.shepard.BaseTestCase;
11 import de.dlr.shepard.auth.users.entities.UserGroup;
12 import de.dlr.shepard.common.util.QueryParamHelper;
13 import de.dlr.shepard.context.collection.endpoints.DataObjectAttributes;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17 import org.junit.jupiter.api.Test;
18 import org.mockito.InjectMocks;
19 import org.mockito.Mock;
20 import org.neo4j.ogm.session.Session;
21
22 public class UserGroupDAOTest extends BaseTestCase {
23
24 @Mock
25 private Session session;
26
27 @InjectMocks
28 private UserGroupDAO dao;
29
30 @Test
31 public void getEntityTypeTest() {
32 var type = dao.getEntityType();
33 assertEquals(UserGroup.class, type);
34 }
35
36 @Test
37 public void deleteTest_Successful() {
38 var userGroup = new UserGroup();
39 userGroup.setName("AKP");
40 userGroup.setId(1L);
41 when(session.load(UserGroup.class, 1L)).thenReturn(userGroup);
42 doNothing().when(session).delete(userGroup);
43 var actual = dao.deleteByNeo4jId(1L);
44 assertTrue(actual);
45 }
46
47 @Test
48 public void deleteTest_NotSuccessful() {
49 var userGroup = new UserGroup();
50 userGroup.setName("AKP");
51 userGroup.setId(1L);
52 when(session.load(UserGroup.class, 2L)).thenReturn(null);
53 doNothing().when(session).delete(userGroup);
54 var actual = dao.deleteByNeo4jId(2L);
55 assertFalse(actual);
56 }
57
58 @Test
59 public void findAllUserGroupsTestFullParams() {
60 QueryParamHelper params = new QueryParamHelper();
61 params = params.withPageAndSize(3, 4);
62 params = params.withOrderByAttribute(DataObjectAttributes.name, false);
63 var userGroup = new UserGroup();
64 userGroup.setName("AKP");
65 userGroup.setId(1L);
66 String username = "user";
67 Map<String, Object> paramsMap = new HashMap<>();
68 paramsMap.put("offset", 12);
69 paramsMap.put("size", 4);
70 String query =
71 """
72 MATCH (ug:UserGroup { deleted: FALSE }) WHERE (NOT exists((ug)-[:has_permissions]->(:Permissions)) \
73 OR exists((ug)-[:has_permissions]->(:Permissions)-[:readable_by|owned_by]->(:User { username: \"user\" })) \
74 OR exists((ug)-[:has_permissions]->(:Permissions {permissionType: \"Public\"})) \
75 OR exists((ug)-[:has_permissions]->(:Permissions {permissionType: \"PublicReadable\"})) \
76 OR exists((ug)-[:has_permissions]->(:Permissions)-[:readable_by_group]->(:UserGroup)<-[:is_in_group]-(:User { username: \"user\"}))) \
77 WITH ug ORDER BY toLower(ug.name) SKIP $offset LIMIT $size \
78 MATCH path=(ug)-[*0..1]-(n) WHERE n.deleted = FALSE OR n.deleted IS NULL RETURN ug, nodes(path), relationships(path)""";
79 when(session.query(UserGroup.class, query, paramsMap)).thenReturn(List.of(userGroup));
80 var actual = dao.findAllUserGroups(params, username);
81 verify(session).query(UserGroup.class, query, paramsMap);
82 assertEquals(List.of(userGroup), actual);
83 }
84
85 @Test
86 public void findAllUserGroupsTestNoPagination() {
87 QueryParamHelper params = new QueryParamHelper();
88 params = params.withOrderByAttribute(DataObjectAttributes.name, false);
89 var userGroup = new UserGroup();
90 userGroup.setName("AKP");
91 userGroup.setId(1L);
92 String username = "user";
93 Map<String, Object> paramsMap = new HashMap<>();
94 String query =
95 """
96 MATCH (ug:UserGroup { deleted: FALSE }) WHERE (NOT exists((ug)-[:has_permissions]->(:Permissions)) \
97 OR exists((ug)-[:has_permissions]->(:Permissions)-[:readable_by|owned_by]->(:User { username: \"user\" })) \
98 OR exists((ug)-[:has_permissions]->(:Permissions {permissionType: \"Public\"})) \
99 OR exists((ug)-[:has_permissions]->(:Permissions {permissionType: \"PublicReadable\"})) \
100 OR exists((ug)-[:has_permissions]->(:Permissions)-[:readable_by_group]->(:UserGroup)<-[:is_in_group]-(:User { username: \"user\"}))) \
101 WITH ug ORDER BY toLower(ug.name) \
102 MATCH path=(ug)-[*0..1]-(n) WHERE n.deleted = FALSE OR n.deleted IS NULL RETURN ug, nodes(path), relationships(path)""";
103 when(session.query(UserGroup.class, query, paramsMap)).thenReturn(List.of(userGroup));
104 var actual = dao.findAllUserGroups(params, username);
105 verify(session).query(UserGroup.class, query, paramsMap);
106 assertEquals(List.of(userGroup), actual);
107 }
108
109 @Test
110 public void findAllUserGroupsTestNoOrderBy() {
111 QueryParamHelper params = new QueryParamHelper();
112 params = params.withPageAndSize(3, 4);
113 var userGroup = new UserGroup();
114 userGroup.setName("AKP");
115 userGroup.setId(1L);
116 String username = "user";
117 Map<String, Object> paramsMap = new HashMap<>();
118 paramsMap.put("offset", 12);
119 paramsMap.put("size", 4);
120 String query =
121 """
122 MATCH (ug:UserGroup { deleted: FALSE }) WHERE (NOT exists((ug)-[:has_permissions]->(:Permissions)) \
123 OR exists((ug)-[:has_permissions]->(:Permissions)-[:readable_by|owned_by]->(:User { username: \"user\" })) \
124 OR exists((ug)-[:has_permissions]->(:Permissions {permissionType: \"Public\"})) \
125 OR exists((ug)-[:has_permissions]->(:Permissions {permissionType: \"PublicReadable\"})) \
126 OR exists((ug)-[:has_permissions]->(:Permissions)-[:readable_by_group]->(:UserGroup)<-[:is_in_group]-(:User { username: \"user\"}))) \
127 WITH ug SKIP $offset LIMIT $size \
128 MATCH path=(ug)-[*0..1]-(n) WHERE n.deleted = FALSE OR n.deleted IS NULL RETURN ug, nodes(path), relationships(path)""";
129 when(session.query(UserGroup.class, query, paramsMap)).thenReturn(List.of(userGroup));
130 var actual = dao.findAllUserGroups(params, username);
131 verify(session).query(UserGroup.class, query, paramsMap);
132 assertEquals(List.of(userGroup), actual);
133 }
134 }