View Javadoc
1   package de.dlr.shepard.integrationtests;
2   
3   import static io.restassured.RestAssured.given;
4   import static org.assertj.core.api.Assertions.assertThat;
5   
6   import de.dlr.shepard.ErrorResponse;
7   import de.dlr.shepard.common.util.Constants;
8   import de.dlr.shepard.context.collection.io.CollectionIO;
9   import de.dlr.shepard.context.collection.io.DataObjectIO;
10  import de.dlr.shepard.context.references.spatialdata.io.SpatialDataReferenceIO;
11  import de.dlr.shepard.data.spatialdata.io.SpatialDataContainerIO;
12  import de.dlr.shepard.data.spatialdata.io.SpatialDataPointIO;
13  import io.quarkus.test.junit.QuarkusIntegrationTest;
14  import java.net.URISyntaxException;
15  import java.util.ArrayList;
16  import java.util.Collections;
17  import java.util.List;
18  import java.util.Map;
19  import org.junit.jupiter.api.BeforeAll;
20  import org.junit.jupiter.api.MethodOrderer;
21  import org.junit.jupiter.api.Order;
22  import org.junit.jupiter.api.Test;
23  import org.junit.jupiter.api.TestMethodOrder;
24  
25  @QuarkusIntegrationTest
26  @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
27  public class SpatialDataReferenceIT extends BaseTestCaseIT {
28  
29    private static CollectionIO collection;
30    private static DataObjectIO dataObject;
31  
32    private static String referencesURL;
33    private static String containerURL;
34  
35    private static SpatialDataContainerIO container;
36    private static SpatialDataReferenceIO reference;
37    private static List<SpatialDataPointIO> spatialDataPoints;
38  
39    @BeforeAll
40    public static void setUp() throws URISyntaxException {
41      collection = createCollection("SpatialDataReferenceTestCollection");
42      dataObject = createDataObject("SpatialDataReferenceTestDataObject", collection.getId());
43  
44      referencesURL = "/%s/%d/%s/%d/%s".formatted(
45          Constants.COLLECTIONS,
46          collection.getId(),
47          Constants.DATA_OBJECTS,
48          dataObject.getId(),
49          Constants.SPATIAL_DATA_REFERENCES
50        );
51  
52      containerURL = "/" + Constants.SPATIAL_DATA_CONTAINERS;
53  
54      var toCreate = new SpatialDataContainerIO();
55      toCreate.setName("SpatialDataContainer");
56  
57      spatialDataPoints = new ArrayList<>();
58  
59      Map<String, Object> measurement = Map.of("temperature", 20);
60      for (int i = 0; i < 10; i++) {
61        spatialDataPoints.add(
62          new SpatialDataPointIO((long) i, (double) i, (double) i, (double) i, Collections.emptyMap(), measurement)
63        );
64      }
65  
66      container = given()
67        .spec(requestSpecOfDefaultUser)
68        .body(toCreate)
69        .when()
70        .post(containerURL)
71        .then()
72        .statusCode(201)
73        .extract()
74        .as(SpatialDataContainerIO.class);
75  
76      given()
77        .spec(requestSpecOfDefaultUser)
78        .body(spatialDataPoints)
79        .when()
80        .post("%s/%d/%s".formatted(containerURL, container.getId(), Constants.PAYLOAD))
81        .then()
82        .statusCode(204);
83    }
84  
85    @Test
86    @Order(1)
87    public void createSpatialDataReference() {
88      var toCreate = new SpatialDataReferenceIO();
89      toCreate.setName("SpatialDataReferenceDummy");
90      toCreate.setSpatialDataContainerId(container.getId());
91  
92      var actual = given()
93        .spec(requestSpecOfDefaultUser)
94        .body(toCreate)
95        .when()
96        .post(referencesURL)
97        .then()
98        .statusCode(201)
99        .extract()
100       .as(SpatialDataReferenceIO.class);
101     reference = actual;
102 
103     assertThat(actual.getId()).isNotNull();
104     assertThat(actual.getCreatedAt()).isNotNull();
105     assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
106     assertThat(actual.getDataObjectId()).isEqualTo(dataObject.getId());
107     assertThat(actual.getName()).isEqualTo("SpatialDataReferenceDummy");
108     assertThat(actual.getSpatialDataContainerId()).isEqualTo(container.getId());
109     assertThat(actual.getType()).isEqualTo("SpatialDataReference");
110     assertThat(actual.getUpdatedAt()).isNull();
111     assertThat(actual.getUpdatedBy()).isNull();
112     assertThat(actual.getGeometryFilter()).isNull();
113     assertThat(actual.getMeasurementsFilter()).isEqualTo(Collections.emptyList());
114     assertThat(actual.getMetadataFilter()).isEqualTo(Collections.emptyMap());
115     assertThat(actual.getStartTime()).isNull();
116     assertThat(actual.getEndTime()).isNull();
117     assertThat(actual.getLimit()).isNull();
118     assertThat(actual.getSkip()).isNull();
119   }
120 
121   @Test
122   @Order(2)
123   public void getSpatialDataReferences() {
124     var actual = given()
125       .spec(requestSpecOfDefaultUser)
126       .when()
127       .get(referencesURL)
128       .then()
129       .statusCode(200)
130       .extract()
131       .as(SpatialDataReferenceIO[].class);
132     assertThat(actual).containsExactly(reference);
133   }
134 
135   @Test
136   @Order(3)
137   public void getSpatialDataReference() {
138     var actual = given()
139       .spec(requestSpecOfDefaultUser)
140       .when()
141       .get(referencesURL + "/" + reference.getId())
142       .then()
143       .statusCode(200)
144       .extract()
145       .as(SpatialDataReferenceIO.class);
146 
147     assertThat(actual).isEqualTo(reference);
148   }
149 
150   @Test
151   @Order(4)
152   public void getSpatialDataReference_doesNotExist_notFound() {
153     var actual = given()
154       .spec(requestSpecOfDefaultUser)
155       .when()
156       .get(referencesURL + "/99999")
157       .then()
158       .statusCode(404)
159       .extract()
160       .as(ErrorResponse.class);
161 
162     assertThat(actual.getMessage()).isEqualTo("ID ERROR - SpatialData Reference with id 99999 is null or deleted");
163   }
164 
165   @Test
166   @Order(5)
167   public void getSpatialDataReference_referenceBelongsToDifferentCollection_notFound() {
168     CollectionIO otherCollection = createCollection("otherCollection");
169     DataObjectIO otherDataObject = createDataObject("otherDataObject", otherCollection.getId());
170     var otherReferenceToCreate = new SpatialDataReferenceIO();
171     otherReferenceToCreate.setName("SpatialDataReferenceDummy");
172     otherReferenceToCreate.setSpatialDataContainerId(container.getId());
173 
174     SpatialDataReferenceIO otherReference = given()
175       .spec(requestSpecOfDefaultUser)
176       .body(otherReferenceToCreate)
177       .when()
178       .post(
179         "/%s/%d/%s/%d/%s".formatted(
180             Constants.COLLECTIONS,
181             otherCollection.getId(),
182             Constants.DATA_OBJECTS,
183             otherDataObject.getId(),
184             Constants.SPATIAL_DATA_REFERENCES
185           )
186       )
187       .then()
188       .statusCode(201)
189       .extract()
190       .as(SpatialDataReferenceIO.class);
191 
192     var actual = given()
193       .spec(requestSpecOfDefaultUser)
194       .when()
195       .get(referencesURL + "/" + otherReference.getId())
196       .then()
197       .statusCode(404)
198       .extract()
199       .as(ErrorResponse.class);
200 
201     assertThat(actual.getMessage()).isEqualTo("ID ERROR - There is no association between dataObject and reference");
202   }
203 
204   @Test
205   @Order(6)
206   public void getSpatialDataReferencePayload() {
207     var actual = given()
208       .spec(requestSpecOfDefaultUser)
209       .when()
210       .get("%s/%d/%s".formatted(referencesURL, reference.getId(), Constants.PAYLOAD))
211       .then()
212       .statusCode(200)
213       .extract()
214       .as(SpatialDataPointIO[].class);
215 
216     SpatialDataPointIO[] expected = spatialDataPoints.toArray(SpatialDataPointIO[]::new);
217     assertThat(actual).containsExactly(expected);
218   }
219 
220   @Test
221   @Order(7)
222   public void deleteReferences() {
223     given()
224       .spec(requestSpecOfDefaultUser)
225       .when()
226       .delete(referencesURL + "/" + reference.getId())
227       .then()
228       .statusCode(204);
229     given()
230       .spec(requestSpecOfDefaultUser)
231       .when()
232       .delete(referencesURL + "/" + reference.getId())
233       .then()
234       .statusCode(404);
235     given().spec(requestSpecOfDefaultUser).when().get(referencesURL + "/" + reference.getId()).then().statusCode(404);
236   }
237 }