View Javadoc
1   package de.dlr.shepard.context.references.spatialdatareference;
2   
3   import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
4   import static org.junit.jupiter.api.Assertions.assertEquals;
5   import static org.junit.jupiter.api.Assertions.assertThrows;
6   import static org.mockito.Mockito.when;
7   
8   import de.dlr.shepard.auth.permission.services.PermissionsService;
9   import de.dlr.shepard.auth.security.AuthenticationContext;
10  import de.dlr.shepard.auth.users.entities.User;
11  import de.dlr.shepard.auth.users.services.UserService;
12  import de.dlr.shepard.common.exceptions.InvalidBodyException;
13  import de.dlr.shepard.common.exceptions.InvalidPathException;
14  import de.dlr.shepard.common.util.AccessType;
15  import de.dlr.shepard.common.util.DateHelper;
16  import de.dlr.shepard.context.collection.entities.DataObject;
17  import de.dlr.shepard.context.collection.services.DataObjectService;
18  import de.dlr.shepard.context.references.spatialdata.daos.SpatialDataReferenceDAO;
19  import de.dlr.shepard.context.references.spatialdata.entities.SpatialDataReference;
20  import de.dlr.shepard.context.references.spatialdata.io.SpatialDataReferenceIO;
21  import de.dlr.shepard.context.references.spatialdata.services.SpatialDataReferenceService;
22  import de.dlr.shepard.context.version.daos.VersionDAO;
23  import de.dlr.shepard.context.version.entities.Version;
24  import de.dlr.shepard.data.spatialdata.daos.SpatialDataContainerDAO;
25  import de.dlr.shepard.data.spatialdata.io.SpatialDataPointIO;
26  import de.dlr.shepard.data.spatialdata.io.SpatialDataQueryParams;
27  import de.dlr.shepard.data.spatialdata.model.SpatialDataContainer;
28  import de.dlr.shepard.data.spatialdata.model.geometryFilter.KNearestNeighbor;
29  import de.dlr.shepard.data.spatialdata.services.SpatialDataContainerService;
30  import de.dlr.shepard.data.spatialdata.services.SpatialDataPointService;
31  import io.quarkus.test.InjectMock;
32  import io.quarkus.test.component.QuarkusComponentTest;
33  import jakarta.inject.Inject;
34  import jakarta.ws.rs.NotFoundException;
35  import java.util.ArrayList;
36  import java.util.Collections;
37  import java.util.Date;
38  import java.util.List;
39  import java.util.Map;
40  import java.util.UUID;
41  import org.junit.jupiter.api.Test;
42  
43  @QuarkusComponentTest
44  public class SpatialDataReferenceServiceTest {
45  
46    @InjectMock
47    SpatialDataReferenceDAO spatialDataReferenceDAO;
48  
49    @InjectMock
50    VersionDAO versionDAO;
51  
52    @InjectMock
53    UserService userService;
54  
55    @InjectMock
56    DateHelper dateHelper;
57  
58    @InjectMock
59    DataObjectService dataObjectService;
60  
61    @InjectMock
62    SpatialDataContainerDAO containerDAO;
63  
64    @InjectMock
65    SpatialDataContainerDAO spatialDataContainerDAO;
66  
67    @InjectMock
68    SpatialDataPointService dataPointService;
69  
70    @InjectMock
71    AuthenticationContext authenticationContext;
72  
73    @InjectMock
74    PermissionsService permissionsService;
75  
76    @Inject
77    SpatialDataReferenceService referenceService;
78  
79    @Inject
80    SpatialDataContainerService containerService;
81  
82    private final long collectionId = 123456L;
83  
84    @Test
85    public void getSpatialDataReferenceByShepardIdTest_success() {
86      SpatialDataReference ref = new SpatialDataReference(1L);
87      ref.setShepardId(15L);
88  
89      DataObject dataObject = new DataObject(1122L);
90      dataObject.setShepardId(54321L);
91      dataObject.setReferences(List.of(ref));
92      ref.setDataObject(dataObject);
93  
94      when(spatialDataReferenceDAO.findByShepardId(ref.getShepardId(), null)).thenReturn(ref);
95      SpatialDataReference actual = referenceService.getReference(
96        collectionId,
97        dataObject.getShepardId(),
98        ref.getShepardId(),
99        null
100     );
101     assertEquals(ref, actual);
102   }
103 
104   @Test
105   public void getSpatialDataReferenceByShepardIdTest_deleted() {
106     SpatialDataReference ref = new SpatialDataReference(1L);
107     ref.setShepardId(15L);
108     ref.setDeleted(true);
109 
110     DataObject dataObject = new DataObject(1122L);
111     dataObject.setShepardId(54321L);
112     dataObject.setReferences(List.of(ref));
113     ref.setDataObject(dataObject);
114 
115     when(spatialDataReferenceDAO.findByShepardId(ref.getShepardId(), null)).thenReturn(ref);
116     var ex = assertThrows(InvalidPathException.class, () ->
117       referenceService.getReference(collectionId, dataObject.getShepardId(), ref.getShepardId(), null)
118     );
119     assertEquals(ex.getMessage(), "ID ERROR - SpatialData Reference with id 15 is null or deleted");
120   }
121 
122   @Test
123   public void getSpatialDataReferenceByShepardIdTest_notFound() {
124     Long shepardId = 15L;
125 
126     when(spatialDataReferenceDAO.findByShepardId(shepardId, null)).thenReturn(null);
127     var ex = assertThrows(InvalidPathException.class, () ->
128       referenceService.getReference(collectionId, 5441231L, shepardId, null)
129     );
130     assertEquals(ex.getMessage(), "ID ERROR - SpatialData Reference with id 15 is null or deleted");
131   }
132 
133   @Test
134   public void getAllSpatialDataReferencesTest() {
135     DataObject dataObject = new DataObject(200L);
136     dataObject.setShepardId(2005L);
137     SpatialDataReference ref1 = new SpatialDataReference(1L);
138     ref1.setShepardId(15L);
139     SpatialDataReference ref2 = new SpatialDataReference(2L);
140     ref2.setShepardId(25L);
141     dataObject.setReferences(List.of(ref1, ref2));
142 
143     when(spatialDataReferenceDAO.findByDataObjectShepardId(dataObject.getShepardId())).thenReturn(List.of(ref1, ref2));
144 
145     List<SpatialDataReference> actual = referenceService.getAllReferencesByDataObjectId(
146       collectionId,
147       dataObject.getShepardId(),
148       null
149     );
150     assertEquals(List.of(ref1, ref2), actual);
151   }
152 
153   @Test
154   public void createSpatialDataReferenceByShepardIdTest() {
155     User user = new User("Bob");
156     Version version = new Version(new UUID(1L, 2L));
157     DataObject dataObject = new DataObject(200L);
158     dataObject.setShepardId(2005L);
159     SpatialDataContainer container = new SpatialDataContainer(300L);
160     Date date = new Date(30L);
161     SpatialDataReferenceIO input = new SpatialDataReferenceIO() {
162       {
163         setName("MyName");
164         setSpatialDataContainerId(container.getId());
165       }
166     };
167 
168     SpatialDataReference toCreate = new SpatialDataReference() {
169       {
170         setCreatedAt(date);
171         setCreatedBy(user);
172         setDataObject(dataObject);
173         setName(input.getName());
174         setSpatialDataContainer(container);
175       }
176     };
177     SpatialDataReference created = new SpatialDataReference() {
178       {
179         setId(1L);
180         setCreatedAt(toCreate.getCreatedAt());
181         setCreatedBy(toCreate.getCreatedBy());
182         setDataObject(toCreate.getDataObject());
183         setName(toCreate.getName());
184         setSpatialDataContainer(toCreate.getSpatialDataContainer());
185       }
186     };
187 
188     SpatialDataReference createdWithShepardId = new SpatialDataReference() {
189       {
190         setId(created.getId());
191         setShepardId(created.getId());
192         setCreatedAt(created.getCreatedAt());
193         setCreatedBy(created.getCreatedBy());
194         setDataObject(created.getDataObject());
195         setName(created.getName());
196         setSpatialDataContainer(created.getSpatialDataContainer());
197       }
198     };
199 
200     when(userService.getCurrentUser()).thenReturn(user);
201     when(dataObjectService.getDataObject(collectionId, dataObject.getShepardId())).thenReturn(dataObject);
202     when(containerDAO.findByNeo4jId(container.getId())).thenReturn(container);
203     when(spatialDataReferenceDAO.createOrUpdate(toCreate)).thenReturn(created);
204     when(spatialDataReferenceDAO.createOrUpdate(createdWithShepardId)).thenReturn(createdWithShepardId);
205     when(dateHelper.getDate()).thenReturn(date);
206     when(versionDAO.findVersionLightByNeo4jId(dataObject.getId())).thenReturn(version);
207     when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
208     when(
209       permissionsService.isAccessTypeAllowedForUser(container.getId(), AccessType.Read, user.getUsername())
210     ).thenReturn(true);
211     when(
212       permissionsService.isAccessTypeAllowedForUser(container.getId(), AccessType.Write, user.getUsername())
213     ).thenReturn(true);
214 
215     SpatialDataReference actual = referenceService.createReference(collectionId, dataObject.getShepardId(), input);
216     assertEquals(createdWithShepardId, actual);
217   }
218 
219   @Test
220   public void createSpatialDataReferenceByShepardIdTest_ContainerIsDeleted() {
221     User user = new User("Bob");
222     DataObject dataObject = new DataObject(200L);
223     dataObject.setShepardId(2005L);
224 
225     SpatialDataContainer container = new SpatialDataContainer(300L);
226     container.setDeleted(true);
227 
228     KNearestNeighbor geometryFilter = new KNearestNeighbor(5, 10.0, 20.0, 30.0);
229     SpatialDataReferenceIO input = new SpatialDataReferenceIO() {
230       {
231         setName("MyName");
232         setGeometryFilter(geometryFilter);
233         setSpatialDataContainerId(container.getId());
234       }
235     };
236     when(userService.getCurrentUser()).thenReturn(user);
237     when(dataObjectService.getDataObject(dataObject.getShepardId())).thenReturn(dataObject);
238     when(spatialDataContainerDAO.findLightByNeo4jId(container.getId())).thenReturn(container);
239     when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
240     when(dataObjectService.getDataObject(collectionId, dataObject.getShepardId())).thenReturn(dataObject);
241     when(containerDAO.findByNeo4jId(container.getId())).thenReturn(container);
242 
243     assertThrows(InvalidBodyException.class, () -> referenceService.createReference(collectionId, 2005L, input));
244   }
245 
246   @Test
247   public void createSpatialDataReferenceByShepardIdTest_containerIsNull() {
248     User user = new User("Bob");
249     DataObject dataObject = new DataObject(200L);
250     dataObject.setShepardId(2005L);
251     Long containerShepardId = 12345L;
252     SpatialDataReferenceIO input = new SpatialDataReferenceIO() {
253       {
254         setName("MyName");
255         setSpatialDataContainerId(containerShepardId);
256       }
257     };
258     when(userService.getCurrentUser()).thenReturn(user);
259     when(dataObjectService.getDataObject(dataObject.getShepardId())).thenReturn(dataObject);
260     when(spatialDataContainerDAO.findLightByNeo4jId(containerShepardId)).thenReturn(null);
261     when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
262     assertThrows(InvalidBodyException.class, () -> referenceService.createReference(collectionId, 2005L, input));
263   }
264 
265   @Test
266   public void deleteReferenceByShepardIdTest() {
267     User user = new User("Bob");
268     Date date = new Date(30L);
269     SpatialDataReference ref = new SpatialDataReference(1L);
270     ref.setShepardId(15L);
271     SpatialDataReference expected = new SpatialDataReference(ref.getId());
272     expected.setShepardId(ref.getShepardId());
273     expected.setDeleted(true);
274     expected.setUpdatedBy(user);
275     expected.setUpdatedAt(date);
276 
277     DataObject dataObject = new DataObject(1122L);
278     dataObject.setShepardId(54321L);
279     dataObject.setReferences(List.of(ref));
280     ref.setDataObject(dataObject);
281 
282     when(userService.getCurrentUser()).thenReturn(user);
283     when(spatialDataReferenceDAO.findByShepardId(ref.getShepardId(), null)).thenReturn(ref);
284     when(dateHelper.getDate()).thenReturn(date);
285     when(authenticationContext.getCurrentUserName()).thenReturn(user.getUsername());
286 
287     assertDoesNotThrow(() ->
288       referenceService.deleteReference(collectionId, dataObject.getShepardId(), ref.getShepardId())
289     );
290   }
291 
292   @Test
293   public void getPayloadByShepardIdTest() {
294     SpatialDataContainer container = new SpatialDataContainer(2L);
295     SpatialDataReference ref = new SpatialDataReference() {
296       {
297         setShepardId(15L);
298         setSpatialDataContainer(container);
299       }
300     };
301 
302     DataObject dataObject = new DataObject(1122L);
303     dataObject.setShepardId(54321L);
304     dataObject.setReferences(List.of(ref));
305     ref.setDataObject(dataObject);
306 
307     List<SpatialDataPointIO> points = new ArrayList<>();
308     Map<String, Object> measurements = Map.of("temperature", 5);
309     for (int i = 0; i < 10; i++) {
310       SpatialDataPointIO point = new SpatialDataPointIO(
311         (long) i,
312         (double) i,
313         (double) i,
314         (double) i,
315         Collections.emptyMap(),
316         measurements
317       );
318       points.add(point);
319     }
320 
321     SpatialDataQueryParams params = new SpatialDataQueryParams(
322       null,
323       Collections.emptyMap(),
324       Collections.emptyList(),
325       null,
326       null,
327       null,
328       null
329     );
330 
331     when(spatialDataReferenceDAO.findByShepardId(ref.getShepardId(), null)).thenReturn(ref);
332     when(dataPointService.getSpatialDataPointIOs(container.getId(), params)).thenReturn(points);
333 
334     List<SpatialDataPointIO> actual = referenceService.getReferencePayload(
335       collectionId,
336       dataObject.getShepardId(),
337       ref.getShepardId()
338     );
339     assertEquals(points.size(), actual.size());
340     assertEquals(points, actual);
341   }
342 
343   @Test
344   public void getPayloadByShepardIdTest_ContainerIsDeleted() {
345     SpatialDataContainer container = new SpatialDataContainer(2L);
346     container.setDeleted(true);
347     SpatialDataReference ref = new SpatialDataReference() {
348       {
349         setShepardId(15L);
350         setSpatialDataContainer(container);
351       }
352     };
353 
354     DataObject dataObject = new DataObject(1122L);
355     dataObject.setShepardId(54321L);
356     dataObject.setReferences(List.of(ref));
357     ref.setDataObject(dataObject);
358 
359     List<SpatialDataPointIO> points = new ArrayList<>();
360     Map<String, Object> measurements = Map.of("temperature", 5);
361 
362     for (int i = 0; i < 10; i++) {
363       SpatialDataPointIO point = new SpatialDataPointIO(
364         (long) i,
365         (double) i,
366         (double) i,
367         (double) i,
368         Collections.emptyMap(),
369         measurements
370       );
371       points.add(point);
372     }
373 
374     SpatialDataQueryParams params = new SpatialDataQueryParams(
375       null,
376       Collections.emptyMap(),
377       Collections.emptyList(),
378       null,
379       null,
380       null,
381       null
382     );
383 
384     when(spatialDataReferenceDAO.findByShepardId(ref.getShepardId(), null)).thenReturn(ref);
385     when(dataPointService.getSpatialDataPointIOs(container.getId(), params)).thenReturn(points);
386 
387     assertThrows(NotFoundException.class, () ->
388       referenceService.getReferencePayload(collectionId, dataObject.getShepardId(), ref.getShepardId())
389     );
390   }
391 }