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.assertThrows;
5 import static org.mockito.ArgumentMatchers.any;
6 import static org.mockito.ArgumentMatchers.eq;
7 import static org.mockito.Mockito.times;
8 import static org.mockito.Mockito.verify;
9 import static org.mockito.Mockito.when;
10
11 import de.dlr.shepard.data.spatialdata.io.SpatialDataPointIO;
12 import de.dlr.shepard.data.spatialdata.io.SpatialDataQueryParams;
13 import de.dlr.shepard.data.spatialdata.model.SpatialDataPoint;
14 import de.dlr.shepard.data.spatialdata.model.geometryFilter.AbstractGeometryFilter;
15 import de.dlr.shepard.data.spatialdata.model.geometryFilter.AxisAlignedBoundingBox;
16 import de.dlr.shepard.data.spatialdata.model.geometryFilter.BoundingSphere;
17 import de.dlr.shepard.data.spatialdata.model.geometryFilter.GeometryFilterType;
18 import de.dlr.shepard.data.spatialdata.model.geometryFilter.KNearestNeighbor;
19 import de.dlr.shepard.data.spatialdata.repositories.SpatialDataPointRepository;
20 import io.quarkus.test.InjectMock;
21 import io.quarkus.test.component.QuarkusComponentTest;
22 import jakarta.inject.Inject;
23 import jakarta.ws.rs.NotFoundException;
24 import java.util.Arrays;
25 import java.util.Map;
26 import org.junit.jupiter.api.Test;
27 import org.locationtech.jts.geom.Coordinate;
28 import org.mockito.Mockito;
29
30 @QuarkusComponentTest
31 public class SpatialDataPointServiceTest {
32
33 @Inject
34 SpatialDataPointService spatialDataPointService;
35
36 @InjectMock
37 SpatialDataPointRepository spatialGeometryRepository;
38
39 @InjectMock
40 SpatialDataContainerService spatialDataContainerService;
41
42 @Test
43 public void createSpatialDataPoints_callRepository() {
44 Long containerId = 1L;
45 var dataPoints = Arrays.asList(new SpatialDataPointIO(1L, 1.0, 2.0, 3.0, null, null));
46
47 spatialDataPointService.createSpatialDataPoints(containerId, dataPoints);
48
49 Mockito.verify(spatialGeometryRepository, Mockito.times(1)).insert(
50 Mockito.eq(containerId),
51 Mockito.any(SpatialDataPoint[].class)
52 );
53 }
54
55 @Test
56 public void createSpatialDataPoints_containerDoesNotExist_throwsException() {
57 Long containerId = 1L;
58 var dataPoints = Arrays.asList(new SpatialDataPointIO(1L, 1.0, 2.0, 3.0, null, null));
59 when(spatialDataContainerService.getContainer(1)).thenThrow(new NotFoundException());
60
61 try {
62 spatialDataPointService.createSpatialDataPoints(containerId, dataPoints);
63 } catch (NotFoundException e) {
64 assert true;
65 }
66 }
67
68 @Test
69 public void deleteByContainerId_callRepository() {
70 long containerId = 1L;
71
72 spatialDataPointService.deleteByContainerId(containerId);
73
74 Mockito.verify(spatialGeometryRepository, Mockito.times(1)).deleteByContainerId(containerId);
75 }
76
77 @Test
78 public void getSpatialDataPointIOs_boundingBoxFilter_callRepository() {
79 Long containerId = 1L;
80 Long startTime = 2L, endTime = 3L;
81 Integer limit = 4;
82 Map<String, Object> metadataFilter = Map.of("data", "some data");
83
84 AxisAlignedBoundingBox axisAlignedBoundingBox = new AxisAlignedBoundingBox(0.1, 0.2, 0.3, 1.1, 1.2, 1.3);
85 SpatialDataQueryParams spatialDataParamsIO = new SpatialDataQueryParams(
86 axisAlignedBoundingBox,
87 metadataFilter,
88 null,
89 startTime,
90 endTime,
91 limit,
92 null
93 );
94 spatialDataPointService.getSpatialDataPointIOs(containerId, spatialDataParamsIO);
95 verify(spatialGeometryRepository, times(1)).getByBoundingBox(
96 eq(containerId),
97 eq(
98 new Coordinate(
99 axisAlignedBoundingBox.getMinX(),
100 axisAlignedBoundingBox.getMinY(),
101 axisAlignedBoundingBox.getMinZ()
102 )
103 ),
104 eq(
105 new Coordinate(
106 axisAlignedBoundingBox.getMaxX(),
107 axisAlignedBoundingBox.getMaxY(),
108 axisAlignedBoundingBox.getMaxZ()
109 )
110 ),
111 eq(startTime),
112 eq(endTime),
113 eq(metadataFilter),
114 any(),
115 eq(limit),
116 eq(null)
117 );
118 }
119
120 @Test
121 public void getSpatialDataPointIOs_boundingSphereFilter_callRepository() {
122 Long containerId = 1L;
123 Long startTime = 2L, endTime = 3L;
124 Integer limit = 4;
125 Map<String, Object> metadataFilter = Map.of("data", "some data");
126 double radius = 10;
127
128 BoundingSphere boundingSphere = new BoundingSphere(radius, 1.1, 1.2, 1.3);
129
130 SpatialDataQueryParams spatialDataParamsIO = new SpatialDataQueryParams(
131 boundingSphere,
132 metadataFilter,
133 null,
134 startTime,
135 endTime,
136 limit,
137 null
138 );
139 spatialDataPointService.getSpatialDataPointIOs(containerId, spatialDataParamsIO);
140 verify(spatialGeometryRepository, times(1)).getByBoundingSphere(
141 eq(containerId),
142 eq(new Coordinate(boundingSphere.getCenterX(), boundingSphere.getCenterY(), boundingSphere.getCenterZ())),
143 eq(radius),
144 eq(startTime),
145 eq(endTime),
146 eq(metadataFilter),
147 any(),
148 eq(limit),
149 eq(null)
150 );
151 }
152
153 @Test
154 public void getSpatialDataPointIOs_knnFilter_callRepository() {
155 Long containerId = 1L;
156 Long startTime = 2L, endTime = 3L;
157 Map<String, Object> metadataFilter = Map.of("data", "some data");
158 int k = 10;
159
160 KNearestNeighbor kNearestNeighbor = new KNearestNeighbor(k, 1.1, 1.2, 1.3);
161
162 SpatialDataQueryParams spatialDataParamsIO = new SpatialDataQueryParams(
163 kNearestNeighbor,
164 metadataFilter,
165 null,
166 startTime,
167 endTime,
168 null,
169 null
170 );
171 spatialDataPointService.getSpatialDataPointIOs(containerId, spatialDataParamsIO);
172 verify(spatialGeometryRepository, times(1)).getByKNN(
173 eq(containerId),
174 eq(new Coordinate(kNearestNeighbor.getX(), kNearestNeighbor.getY(), kNearestNeighbor.getZ())),
175 eq(k),
176 eq(startTime),
177 eq(endTime),
178 eq(metadataFilter),
179 any()
180 );
181 }
182
183 @Test
184 public void getSpatialDataPointIOs_orientedBoundingBox_throwsNotImplemented() {
185 Long containerId = 1L;
186 Long startTime = 2L, endTime = 3L;
187 Integer limit = 4;
188 Map<String, Object> metadataFilter = Map.of("data", "some data");
189 AbstractGeometryFilter geometryFilter = new AbstractGeometryFilter() {
190 public boolean isValid() {
191 return true;
192 }
193 };
194 geometryFilter.setType(GeometryFilterType.ORIENTED_BOUNDING_BOX);
195
196 SpatialDataQueryParams spatialDataParamsIO = new SpatialDataQueryParams(
197 geometryFilter,
198 metadataFilter,
199 null,
200 startTime,
201 endTime,
202 limit,
203 null
204 );
205
206 Exception error = assertThrows(UnsupportedOperationException.class, () ->
207 spatialDataPointService.getSpatialDataPointIOs(containerId, spatialDataParamsIO)
208 );
209 assertEquals("not implemented", error.getMessage());
210 }
211 }