1 package de.dlr.shepard.integrationtests;
2
3 import static io.restassured.RestAssured.given;
4 import static org.assertj.core.api.Assertions.assertThat;
5 import static org.junit.jupiter.api.Assertions.assertEquals;
6
7 import com.fasterxml.jackson.core.JsonProcessingException;
8 import com.fasterxml.jackson.databind.JsonMappingException;
9 import com.fasterxml.jackson.databind.ObjectMapper;
10 import de.dlr.shepard.ErrorResponse;
11 import de.dlr.shepard.common.util.Constants;
12 import de.dlr.shepard.data.structureddata.entities.StructuredData;
13 import de.dlr.shepard.data.structureddata.entities.StructuredDataPayload;
14 import de.dlr.shepard.data.structureddata.io.StructuredDataContainerIO;
15 import io.quarkus.test.junit.QuarkusIntegrationTest;
16 import java.util.List;
17 import java.util.Map;
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 StructuredDataIT extends BaseTestCaseIT {
27
28 private static String containerURL;
29
30 private static StructuredDataContainerIO container;
31 private static StructuredDataPayload payload;
32
33 private ObjectMapper objectMapper = new ObjectMapper();
34
35 @BeforeAll
36 public static void setUp() {
37 containerURL = "/" + Constants.STRUCTURED_DATA_CONTAINERS;
38 }
39
40 @Test
41 @Order(1)
42 public void createStructuredDataContainer() {
43 var toCreate = new StructuredDataContainerIO();
44 toCreate.setName("StructuredDataContainer");
45
46 var actual = given()
47 .spec(requestSpecOfDefaultUser)
48 .body(toCreate)
49 .when()
50 .post(containerURL)
51 .then()
52 .statusCode(201)
53 .extract()
54 .as(StructuredDataContainerIO.class);
55 container = actual;
56
57 assertThat(actual.getId()).isNotNull();
58 assertThat(actual.getCreatedAt()).isNotNull();
59 assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
60 assertThat(actual.getOid()).isNotBlank();
61 assertThat(actual.getName()).isEqualTo("StructuredDataContainer");
62 assertThat(actual.getUpdatedAt()).isNull();
63 assertThat(actual.getUpdatedBy()).isNull();
64 }
65
66 @Test
67 @Order(2)
68 public void getStructuredDataContainers() {
69 var actual = given()
70 .spec(requestSpecOfDefaultUser)
71 .when()
72 .get(containerURL)
73 .then()
74 .statusCode(200)
75 .extract()
76 .as(StructuredDataContainerIO[].class);
77
78 assertThat(actual).contains(container);
79 }
80
81 @Test
82 @Order(3)
83 public void getStructuredDataContainer() {
84 var actual = given()
85 .spec(requestSpecOfDefaultUser)
86 .when()
87 .get(containerURL + "/" + container.getId())
88 .then()
89 .statusCode(200)
90 .extract()
91 .as(StructuredDataContainerIO.class);
92
93 assertThat(actual).isEqualTo(container);
94 }
95
96 @Test
97 @Order(4)
98 public void createStructuredData() throws JsonProcessingException {
99 var payloadMap = Map.of("Hallo", "Welt", "number", 123, "object", Map.of("a", "b"), "list", List.of("a", "b"));
100 var structuredData = new StructuredData();
101 structuredData.setName("My Structured Data");
102
103 payload = new StructuredDataPayload(structuredData, objectMapper.writeValueAsString(payloadMap));
104
105 var actual = given()
106 .spec(requestSpecOfDefaultUser)
107 .body(payload)
108 .when()
109 .post("%s/%d/%s".formatted(containerURL, container.getId(), Constants.PAYLOAD))
110 .then()
111 .statusCode(201)
112 .extract()
113 .as(StructuredData.class);
114
115 assertThat(actual.getOid()).isNotBlank();
116 assertThat(actual.getCreatedAt()).isNotNull();
117 assertThat(actual.getName()).isEqualTo("My Structured Data");
118 payload.setStructuredData(actual);
119 }
120
121 @Test
122 @Order(5)
123 public void getStructuredDatas() {
124 var actual = given()
125 .spec(requestSpecOfDefaultUser)
126 .when()
127 .get(containerURL + "/" + container.getId() + "/" + Constants.PAYLOAD)
128 .then()
129 .statusCode(200)
130 .extract()
131 .as(StructuredData[].class);
132
133 assertThat(actual).containsExactly(payload.getStructuredData());
134 }
135
136 @Test
137 @Order(6)
138 @SuppressWarnings("unchecked")
139 public void getStructuredDataPayload() throws JsonMappingException, JsonProcessingException {
140 var actual = given()
141 .spec(requestSpecOfDefaultUser)
142 .when()
143 .get(
144 "%s/%d/%s/%s".formatted(
145 containerURL,
146 container.getId(),
147 Constants.PAYLOAD,
148 payload.getStructuredData().getOid()
149 )
150 )
151 .then()
152 .statusCode(200)
153 .extract()
154 .as(StructuredDataPayload.class);
155
156 var payloadMap = objectMapper.readValue(actual.getPayload(), Map.class);
157 var expectedMap = objectMapper.readValue(payload.getPayload(), Map.class);
158
159 assertThat(actual.getStructuredData()).isEqualTo(payload.getStructuredData());
160 assertThat(payloadMap).containsAllEntriesOf(expectedMap);
161 assertThat(actual.getStructuredData()).isEqualTo(payload.getStructuredData());
162 }
163
164 @Test
165 @Order(7)
166 public void getStructuredDataPayload_userHasNoPermissions_NotAllowed() {
167 given()
168 .spec(requestSpecOfOtherUser)
169 .when()
170 .get(
171 "%s/%d/%s/%s".formatted(
172 containerURL,
173 container.getId(),
174 Constants.PAYLOAD,
175 payload.getStructuredData().getOid()
176 )
177 )
178 .then()
179 .statusCode(403)
180 .extract()
181 .as(ErrorResponse.class);
182 }
183
184 @Test
185 @Order(8)
186 public void getStructuredDataPayload_nonExistingOid() throws JsonMappingException, JsonProcessingException {
187 var actual = given()
188 .spec(requestSpecOfDefaultUser)
189 .when()
190 .get("%s/%d/%s/%s".formatted(containerURL, container.getId(), Constants.PAYLOAD, 1234321))
191 .then()
192 .statusCode(404)
193 .extract()
194 .as(ErrorResponse.class);
195 assertEquals("Could not find document with oid: 1234321", actual.getMessage());
196 }
197
198 @Test
199 @Order(9)
200 public void deleteStructuredData() {
201 given()
202 .spec(requestSpecOfDefaultUser)
203 .when()
204 .delete(
205 "%s/%d/%s/%s".formatted(
206 containerURL,
207 container.getId(),
208 Constants.PAYLOAD,
209 payload.getStructuredData().getOid()
210 )
211 )
212 .then()
213 .statusCode(204);
214
215 given()
216 .spec(requestSpecOfDefaultUser)
217 .when()
218 .get(
219 "%s/%d/%s/%s".formatted(
220 containerURL,
221 container.getId(),
222 Constants.PAYLOAD,
223 payload.getStructuredData().getOid()
224 )
225 )
226 .then()
227 .statusCode(404);
228
229 var actual = given()
230 .spec(requestSpecOfDefaultUser)
231 .when()
232 .get(containerURL + "/" + container.getId() + "/" + Constants.PAYLOAD)
233 .then()
234 .statusCode(200)
235 .extract()
236 .as(StructuredData[].class);
237 assertThat(actual).isEmpty();
238 }
239
240 @Test
241 @Order(10)
242 public void deleteContainer() {
243 given().spec(requestSpecOfDefaultUser).when().delete(containerURL + "/" + container.getId()).then().statusCode(204);
244
245 given().spec(requestSpecOfDefaultUser).when().get(containerURL + "/" + container.getId()).then().statusCode(404);
246 }
247
248 @Test
249 public void getStructuredDataContainer_doesNotExist_notFound() {
250 var actual = given()
251 .spec(requestSpecOfDefaultUser)
252 .when()
253 .get(containerURL + "/99999")
254 .then()
255 .statusCode(404)
256 .extract()
257 .as(ErrorResponse.class);
258
259 assertThat(actual.getMessage()).isEqualTo("ID ERROR - Structured Data Container with id 99999 is null or deleted");
260 }
261 }