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 = String.format(
45 "/%s/%d/%s/%d/%s",
46 Constants.COLLECTIONS,
47 collection.getId(),
48 Constants.DATA_OBJECTS,
49 dataObject.getId(),
50 Constants.SPATIAL_DATA_REFERENCES
51 );
52
53 containerURL = "/" + Constants.SPATIAL_DATA_CONTAINERS;
54
55 var toCreate = new SpatialDataContainerIO();
56 toCreate.setName("SpatialDataContainer");
57
58 spatialDataPoints = new ArrayList<>();
59
60 Map<String, Object> measurement = Map.of("temperature", 20);
61 for (int i = 0; i < 10; i++) {
62 spatialDataPoints.add(
63 new SpatialDataPointIO((long) i, (double) i, (double) i, (double) i, Collections.emptyMap(), measurement)
64 );
65 }
66
67 container = given()
68 .spec(requestSpecOfDefaultUser)
69 .body(toCreate)
70 .when()
71 .post(containerURL)
72 .then()
73 .statusCode(201)
74 .extract()
75 .as(SpatialDataContainerIO.class);
76
77 given()
78 .spec(requestSpecOfDefaultUser)
79 .body(spatialDataPoints)
80 .when()
81 .post(String.format("%s/%d/%s", containerURL, container.getId(), Constants.PAYLOAD))
82 .then()
83 .statusCode(204);
84 }
85
86 @Test
87 @Order(1)
88 public void createSpatialDataReference() {
89 var toCreate = new SpatialDataReferenceIO();
90 toCreate.setName("SpatialDataReferenceDummy");
91 toCreate.setSpatialDataContainerId(container.getId());
92
93 var actual = given()
94 .spec(requestSpecOfDefaultUser)
95 .body(toCreate)
96 .when()
97 .post(referencesURL)
98 .then()
99 .statusCode(201)
100 .extract()
101 .as(SpatialDataReferenceIO.class);
102 reference = actual;
103
104 assertThat(actual.getId()).isNotNull();
105 assertThat(actual.getCreatedAt()).isNotNull();
106 assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
107 assertThat(actual.getDataObjectId()).isEqualTo(dataObject.getId());
108 assertThat(actual.getName()).isEqualTo("SpatialDataReferenceDummy");
109 assertThat(actual.getSpatialDataContainerId()).isEqualTo(container.getId());
110 assertThat(actual.getType()).isEqualTo("SpatialDataReference");
111 assertThat(actual.getUpdatedAt()).isNull();
112 assertThat(actual.getUpdatedBy()).isNull();
113 assertThat(actual.getGeometryFilter()).isNull();
114 assertThat(actual.getMeasurementsFilter()).isEqualTo(Collections.emptyList());
115 assertThat(actual.getMetadataFilter()).isEqualTo(Collections.emptyMap());
116 assertThat(actual.getStartTime()).isNull();
117 assertThat(actual.getEndTime()).isNull();
118 assertThat(actual.getLimit()).isNull();
119 assertThat(actual.getSkip()).isNull();
120 }
121
122 @Test
123 @Order(2)
124 public void getSpatialDataReferences() {
125 var actual = given()
126 .spec(requestSpecOfDefaultUser)
127 .when()
128 .get(referencesURL)
129 .then()
130 .statusCode(200)
131 .extract()
132 .as(SpatialDataReferenceIO[].class);
133 assertThat(actual).containsExactly(reference);
134 }
135
136 @Test
137 @Order(3)
138 public void getSpatialDataReference() {
139 var actual = given()
140 .spec(requestSpecOfDefaultUser)
141 .when()
142 .get(referencesURL + "/" + reference.getId())
143 .then()
144 .statusCode(200)
145 .extract()
146 .as(SpatialDataReferenceIO.class);
147
148 assertThat(actual).isEqualTo(reference);
149 }
150
151 @Test
152 @Order(4)
153 public void getSpatialDataReference_doesNotExist_notFound() {
154 var actual = given()
155 .spec(requestSpecOfDefaultUser)
156 .when()
157 .get(referencesURL + "/99999")
158 .then()
159 .statusCode(404)
160 .extract()
161 .as(ErrorResponse.class);
162
163 assertThat(actual.getMessage()).isEqualTo("ID ERROR - SpatialData Reference with id 99999 is null or deleted");
164 }
165
166 @Test
167 @Order(5)
168 public void getSpatialDataReference_referenceBelongsToDifferentCollection_notFound() {
169 CollectionIO otherCollection = createCollection("otherCollection");
170 DataObjectIO otherDataObject = createDataObject("otherDataObject", otherCollection.getId());
171 var otherReferenceToCreate = new SpatialDataReferenceIO();
172 otherReferenceToCreate.setName("SpatialDataReferenceDummy");
173 otherReferenceToCreate.setSpatialDataContainerId(container.getId());
174
175 SpatialDataReferenceIO otherReference = given()
176 .spec(requestSpecOfDefaultUser)
177 .body(otherReferenceToCreate)
178 .when()
179 .post(
180 String.format(
181 "/%s/%d/%s/%d/%s",
182 Constants.COLLECTIONS,
183 otherCollection.getId(),
184 Constants.DATA_OBJECTS,
185 otherDataObject.getId(),
186 Constants.SPATIAL_DATA_REFERENCES
187 )
188 )
189 .then()
190 .statusCode(201)
191 .extract()
192 .as(SpatialDataReferenceIO.class);
193
194 var actual = given()
195 .spec(requestSpecOfDefaultUser)
196 .when()
197 .get(referencesURL + "/" + otherReference.getId())
198 .then()
199 .statusCode(404)
200 .extract()
201 .as(ErrorResponse.class);
202
203 assertThat(actual.getMessage()).isEqualTo("ID ERROR - There is no association between dataObject and reference");
204 }
205
206 @Test
207 @Order(6)
208 public void getSpatialDataReferencePayload() {
209 var actual = given()
210 .spec(requestSpecOfDefaultUser)
211 .when()
212 .get(String.format("%s/%d/%s", referencesURL, reference.getId(), Constants.PAYLOAD))
213 .then()
214 .statusCode(200)
215 .extract()
216 .as(SpatialDataPointIO[].class);
217
218 SpatialDataPointIO[] expected = spatialDataPoints.toArray(SpatialDataPointIO[]::new);
219 assertThat(actual).containsExactly(expected);
220 }
221
222 @Test
223 @Order(7)
224 public void deleteReferences() {
225 given()
226 .spec(requestSpecOfDefaultUser)
227 .when()
228 .delete(referencesURL + "/" + reference.getId())
229 .then()
230 .statusCode(204);
231 given()
232 .spec(requestSpecOfDefaultUser)
233 .when()
234 .delete(referencesURL + "/" + reference.getId())
235 .then()
236 .statusCode(404);
237 given().spec(requestSpecOfDefaultUser).when().get(referencesURL + "/" + reference.getId()).then().statusCode(404);
238 }
239 }