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