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 }