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.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 }