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.timeseriesreference.io.TimeseriesReferenceIO;
11 import de.dlr.shepard.data.timeseries.io.TimeseriesContainerIO;
12 import de.dlr.shepard.data.timeseries.io.TimeseriesWithDataPoints;
13 import de.dlr.shepard.data.timeseries.model.Timeseries;
14 import de.dlr.shepard.data.timeseries.model.TimeseriesDataPoint;
15 import io.quarkus.test.junit.QuarkusIntegrationTest;
16 import java.util.ArrayList;
17 import java.util.List;
18 import org.junit.jupiter.api.BeforeAll;
19 import org.junit.jupiter.api.MethodOrderer;
20 import org.junit.jupiter.api.Order;
21 import org.junit.jupiter.api.Test;
22 import org.junit.jupiter.api.TestMethodOrder;
23
24 @QuarkusIntegrationTest
25 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
26 public class TimeseriesReferenceIT extends BaseTestCaseIT {
27
28 private static CollectionIO collection;
29 private static DataObjectIO dataObject;
30
31 private static String referencesURL;
32 private static String containerURL;
33
34 private static TimeseriesContainerIO container;
35 private static TimeseriesReferenceIO reference;
36 private static TimeseriesWithDataPoints timeseriesWithDataPoints;
37
38 private static int numPoints = 32;
39
40 @BeforeAll
41 public static void setUp() {
42 collection = createCollection("TimeseriesReferenceTestCollection");
43 dataObject = createDataObject("TimeseriesReferenceTestDataObject", collection.getId());
44
45 referencesURL = "/%s/%d/%s/%d/%s".formatted(
46 Constants.COLLECTIONS,
47 collection.getId(),
48 Constants.DATA_OBJECTS,
49 dataObject.getId(),
50 Constants.TIMESERIES_REFERENCES
51 );
52
53 containerURL = "/" + Constants.TIMESERIES_CONTAINERS;
54
55 var toCreate = new TimeseriesContainerIO();
56 toCreate.setName("TimeseriesContainer");
57 container = given()
58 .spec(requestSpecOfDefaultUser)
59 .body(toCreate)
60 .when()
61 .post(containerURL)
62 .then()
63 .statusCode(201)
64 .extract()
65 .as(TimeseriesContainerIO.class);
66
67 var currentTime = System.currentTimeMillis() * 1000000;
68 var slice = (2f * Math.PI) / (numPoints - 1);
69
70 List<TimeseriesDataPoint> dataPoints = new ArrayList<>();
71 for (int i = 0; i < numPoints; i++) {
72 var offset = i * 1000000000L;
73 var point = new TimeseriesDataPoint(currentTime + offset, Math.sin(slice * i));
74 dataPoints.add(point);
75 }
76
77 timeseriesWithDataPoints = new TimeseriesWithDataPoints(
78 new Timeseries("meas", "dev", "loc", "symName", "field"),
79 dataPoints
80 );
81
82 given()
83 .spec(requestSpecOfDefaultUser)
84 .body(timeseriesWithDataPoints)
85 .when()
86 .post("%s/%d/%s".formatted(containerURL, container.getId(), Constants.PAYLOAD))
87 .then()
88 .statusCode(201);
89 }
90
91 @Test
92 @Order(1)
93 public void createTimeseriesReference() {
94 var nanos = timeseriesWithDataPoints.getPoints().getFirst().getTimestamp();
95 var toCreate = new TimeseriesReferenceIO();
96 toCreate.setName("TimeseriesReferenceDummy");
97 toCreate.setStart(nanos - 1000000000L);
98 toCreate.setEnd(nanos + 1000000000L * numPoints);
99 toCreate.setTimeseries(List.of(timeseriesWithDataPoints.getTimeseries()));
100 toCreate.setTimeseriesContainerId(container.getId());
101
102 var actual = given()
103 .spec(requestSpecOfDefaultUser)
104 .body(toCreate)
105 .when()
106 .post(referencesURL)
107 .then()
108 .statusCode(201)
109 .extract()
110 .as(TimeseriesReferenceIO.class);
111 reference = actual;
112
113 assertThat(actual.getId()).isNotNull();
114 assertThat(actual.getCreatedAt()).isNotNull();
115 assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
116 assertThat(actual.getDataObjectId()).isEqualTo(dataObject.getId());
117 assertThat(actual.getStart()).isEqualTo(nanos - 1000000000L);
118 assertThat(actual.getEnd()).isEqualTo(nanos + 1000000000L * numPoints);
119 assertThat(actual.getName()).isEqualTo("TimeseriesReferenceDummy");
120 assertThat(actual.getTimeseries()).isEqualTo(List.of(timeseriesWithDataPoints.getTimeseries()));
121 assertThat(actual.getType()).isEqualTo("TimeseriesReference");
122 assertThat(actual.getUpdatedAt()).isNull();
123 assertThat(actual.getUpdatedBy()).isNull();
124 }
125
126 @Test
127 @Order(2)
128 public void getTimeseriesReferences() {
129 var actual = given()
130 .spec(requestSpecOfDefaultUser)
131 .when()
132 .get(referencesURL)
133 .then()
134 .statusCode(200)
135 .extract()
136 .as(TimeseriesReferenceIO[].class);
137
138 assertThat(actual).containsExactly(reference);
139 }
140
141 @Test
142 @Order(3)
143 public void getTimeseriesReference() {
144 var actual = given()
145 .spec(requestSpecOfDefaultUser)
146 .when()
147 .get(referencesURL + "/" + reference.getId())
148 .then()
149 .statusCode(200)
150 .extract()
151 .as(TimeseriesReferenceIO.class);
152
153 assertThat(actual).isEqualTo(reference);
154 }
155
156 @Test
157 @Order(4)
158 public void getTimeseriesReference_doesNotExist_notFound() {
159 var actual = given()
160 .spec(requestSpecOfDefaultUser)
161 .when()
162 .get(referencesURL + "/99999")
163 .then()
164 .statusCode(404)
165 .extract()
166 .as(ErrorResponse.class);
167
168 assertThat(actual.getMessage()).isEqualTo("ID ERROR - Timeseries Reference with id 99999 is null or deleted");
169 }
170
171 @Test
172 @Order(5)
173 public void getTimeseriesReference_referenceBelongsToDifferentCollection_notFound() {
174 CollectionIO otherCollection = createCollection("otherCollection");
175 DataObjectIO otherDataObject = createDataObject("otherDataObject", otherCollection.getId());
176 var nanos = timeseriesWithDataPoints.getPoints().getFirst().getTimestamp();
177 var otherReferenceToCreate = new TimeseriesReferenceIO();
178 otherReferenceToCreate.setName("TimeseriesReferenceDummy");
179 otherReferenceToCreate.setStart(nanos - 1000000000L);
180 otherReferenceToCreate.setEnd(nanos + 1000000000L * numPoints);
181 otherReferenceToCreate.setTimeseries(List.of(timeseriesWithDataPoints.getTimeseries()));
182 otherReferenceToCreate.setTimeseriesContainerId(container.getId());
183
184 TimeseriesReferenceIO otherReference = given()
185 .spec(requestSpecOfDefaultUser)
186 .body(otherReferenceToCreate)
187 .when()
188 .post(
189 "/%s/%d/%s/%d/%s".formatted(
190 Constants.COLLECTIONS,
191 otherCollection.getId(),
192 Constants.DATA_OBJECTS,
193 otherDataObject.getId(),
194 Constants.TIMESERIES_REFERENCES
195 )
196 )
197 .then()
198 .statusCode(201)
199 .extract()
200 .as(TimeseriesReferenceIO.class);
201
202 var actual = given()
203 .spec(requestSpecOfDefaultUser)
204 .when()
205 .get(referencesURL + "/" + otherReference.getId())
206 .then()
207 .statusCode(404)
208 .extract()
209 .as(ErrorResponse.class);
210
211 assertThat(actual.getMessage()).isEqualTo("ID ERROR - There is no association between dataObject and reference");
212 }
213
214 @Test
215 @Order(6)
216 public void getTimeseriesReferencePayload() {
217 var actual = given()
218 .spec(requestSpecOfDefaultUser)
219 .when()
220 .get("%s/%d/%s".formatted(referencesURL, reference.getId(), Constants.PAYLOAD))
221 .then()
222 .statusCode(200)
223 .extract()
224 .as(TimeseriesWithDataPoints[].class);
225
226 assertThat(actual).containsExactly(timeseriesWithDataPoints);
227 }
228
229 @Test
230 @Order(7)
231 public void deleteReferences() {
232 given()
233 .spec(requestSpecOfDefaultUser)
234 .when()
235 .delete(referencesURL + "/" + reference.getId())
236 .then()
237 .statusCode(204);
238 given()
239 .spec(requestSpecOfDefaultUser)
240 .when()
241 .delete(referencesURL + "/" + reference.getId())
242 .then()
243 .statusCode(404);
244 given().spec(requestSpecOfDefaultUser).when().get(referencesURL + "/" + reference.getId()).then().statusCode(404);
245 }
246 }