View Javadoc
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 }