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.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 }