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 }