View Javadoc
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     // setup
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     // act
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     //assert
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     // setup
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     // act + assert
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 }