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