1 package de.dlr.shepard.data.spatialdata.services;
2
3 import static org.junit.jupiter.api.Assertions.assertEquals;
4 import static org.junit.jupiter.api.Assertions.assertNotNull;
5 import static org.junit.jupiter.api.Assertions.assertThrows;
6 import static org.mockito.ArgumentMatchers.any;
7 import static org.mockito.ArgumentMatchers.anyLong;
8 import static org.mockito.ArgumentMatchers.anyString;
9 import static org.mockito.Mockito.times;
10 import static org.mockito.Mockito.verify;
11 import static org.mockito.Mockito.when;
12
13 import de.dlr.shepard.auth.permission.io.PermissionsIO;
14 import de.dlr.shepard.auth.permission.services.PermissionsService;
15 import de.dlr.shepard.auth.security.AuthenticationContext;
16 import de.dlr.shepard.auth.users.entities.User;
17 import de.dlr.shepard.auth.users.services.UserService;
18 import de.dlr.shepard.common.exceptions.InvalidAuthException;
19 import de.dlr.shepard.common.exceptions.InvalidPathException;
20 import de.dlr.shepard.common.util.AccessType;
21 import de.dlr.shepard.common.util.QueryParamHelper;
22 import de.dlr.shepard.data.spatialdata.daos.SpatialDataContainerDAO;
23 import de.dlr.shepard.data.spatialdata.io.SpatialDataContainerIO;
24 import de.dlr.shepard.data.spatialdata.model.SpatialDataContainer;
25 import io.quarkus.test.InjectMock;
26 import io.quarkus.test.component.QuarkusComponentTest;
27 import jakarta.inject.Inject;
28 import java.util.List;
29 import org.junit.jupiter.api.Test;
30
31 @QuarkusComponentTest
32 public class SpatialDataContainerServiceTest {
33
34 @InjectMock
35 SpatialDataContainerDAO spatialDataContainerDAO;
36
37 @InjectMock
38 SpatialDataPointService spatialDataPointService;
39
40 @InjectMock
41 PermissionsService permissionsService;
42
43 @InjectMock
44 AuthenticationContext authenticationContext;
45
46 @InjectMock
47 UserService userService;
48
49 @Inject
50 SpatialDataContainerService spatialDataContainerService;
51
52 private final User user = new User("123");
53
54 @Test
55 public void createContainer_containerAndPermissions_created() {
56 when(userService.getCurrentUser()).thenReturn(user);
57 when(spatialDataContainerDAO.createOrUpdate(any())).thenReturn(new SpatialDataContainer());
58
59 SpatialDataContainerIO containerIO = new SpatialDataContainerIO();
60 containerIO.setName("testContainer");
61
62 spatialDataContainerService.createContainer(containerIO);
63
64 verify(spatialDataContainerDAO, times(1)).createOrUpdate(any());
65 verify(permissionsService, times(1)).createPermissions(any(), any(), any());
66 }
67
68 @Test
69 public void getContainer_containerDoesExist_returnContainer() {
70 SpatialDataContainer container = new SpatialDataContainer(1);
71
72 when(userService.getCurrentUser()).thenReturn(user);
73 when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
74 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Read, user.getUsername())).thenReturn(true);
75 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(container);
76
77 SpatialDataContainer result = spatialDataContainerService.getContainer(1);
78
79 assertNotNull(result);
80 }
81
82 @Test
83 public void getContainer_containerDoesNotExist_throwException() {
84 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(null);
85
86 var ex = assertThrows(InvalidPathException.class, () -> spatialDataContainerService.getContainer(1));
87
88 assertEquals("ID ERROR - Spatial data container with id 1 is null or deleted", ex.getMessage());
89 }
90
91 @Test
92 public void getContainers_userQueryParams_callRepository() {
93 when(userService.getCurrentUser()).thenReturn(user);
94 when(spatialDataContainerDAO.findAllSpatialContainers(any(), anyString())).thenReturn(
95 List.of(new SpatialDataContainer(1))
96 );
97
98 spatialDataContainerService.getAllContainers(new QueryParamHelper());
99
100 verify(spatialDataContainerDAO, times(1)).findAllSpatialContainers(any(), anyString());
101 }
102
103 @Test
104 public void deleteContainer_deleteDataPointsAndSetDeletedFlagOffContainer() {
105 SpatialDataContainer container = new SpatialDataContainer();
106 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(container);
107 when(userService.getCurrentUser()).thenReturn(user);
108 when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
109 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Read, user.getUsername())).thenReturn(true);
110 when(permissionsService.isCurrentUserOwner(1)).thenReturn(true);
111
112 spatialDataContainerService.deleteContainer(1);
113
114 verify(spatialDataPointService, times(1)).deleteByContainerId(1);
115 verify(spatialDataContainerDAO, times(1)).createOrUpdate(any());
116 }
117
118 @Test
119 public void getContainer_wrongPermissions_throwException() {
120 SpatialDataContainer container = new SpatialDataContainer(1);
121 when(userService.getCurrentUser()).thenReturn(user);
122 when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
123 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Read, user.getUsername())).thenReturn(false);
124 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(container);
125
126 var ex = assertThrows(InvalidAuthException.class, () -> spatialDataContainerService.getContainer(1));
127 assertEquals(
128 "The requested action is forbidden by the permission policies. User has no READ permissions.",
129 ex.getMessage()
130 );
131 }
132
133 @Test
134 public void deleteContainer_UserIsNotOwner_throwException() {
135 SpatialDataContainer container = new SpatialDataContainer();
136 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(container);
137 when(userService.getCurrentUser()).thenReturn(user);
138 when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
139 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Read, user.getUsername())).thenReturn(true);
140 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Write, user.getUsername())).thenReturn(true);
141
142 var ex = assertThrows(InvalidAuthException.class, () -> spatialDataContainerService.deleteContainer(1));
143 assertEquals("The requested action is forbidden by the permission policies. User is not owner.", ex.getMessage());
144 }
145
146 @Test
147 public void updatePermissions_addNewUser_success() {
148
149 User secondUser = new User("testuser2");
150 SpatialDataContainer container = new SpatialDataContainer(1L);
151 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(container);
152 when(userService.getCurrentUser()).thenReturn(user);
153 when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
154 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Read, user.getUsername())).thenReturn(true);
155 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Write, user.getUsername())).thenReturn(true);
156 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Manage, user.getUsername())).thenReturn(true);
157
158
159 var newUserList = new String[] { secondUser.getUsername(), user.getUsername() };
160 PermissionsIO updatedPermissions = new PermissionsIO();
161 updatedPermissions.setEntityId(container.getId());
162 updatedPermissions.setOwner(user.getUsername());
163 updatedPermissions.setWriter(newUserList);
164 updatedPermissions.setReader(newUserList);
165 spatialDataContainerService.updateContainerPermissions(updatedPermissions, container.getId());
166
167
168 verify(permissionsService, times(1)).isAccessTypeAllowedForUser(1L, AccessType.Manage, user.getUsername());
169 verify(permissionsService, times(1)).updatePermissionsByNeo4jId(updatedPermissions, 1L);
170 }
171
172 @Test
173 public void updatePermissions_wrongPermissions_throwException() {
174
175 User secondUser = new User("testuser2");
176 SpatialDataContainer container = new SpatialDataContainer(1L);
177 when(spatialDataContainerDAO.findByNeo4jId(anyLong())).thenReturn(container);
178 when(userService.getCurrentUser()).thenReturn(user);
179 when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
180 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Read, user.getUsername())).thenReturn(true);
181 when(permissionsService.isAccessTypeAllowedForUser(1, AccessType.Manage, user.getUsername())).thenReturn(false);
182
183 var newUserList = new String[] { secondUser.getUsername(), user.getUsername() };
184 PermissionsIO updatedPermissions = new PermissionsIO();
185 updatedPermissions.setEntityId(container.getId());
186 updatedPermissions.setOwner(user.getUsername());
187 updatedPermissions.setWriter(newUserList);
188 updatedPermissions.setReader(newUserList);
189
190
191 var ex = assertThrows(InvalidAuthException.class, () ->
192 spatialDataContainerService.updateContainerPermissions(updatedPermissions, container.getId())
193 );
194 assertEquals(
195 "The requested action is forbidden by the permission policies. User has no MANAGE permissions.",
196 ex.getMessage()
197 );
198 }
199 }