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(String.format("%s/%d/%s", 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 String.format(
145 "%s/%d/%s/%s",
146 containerURL,
147 container.getId(),
148 Constants.PAYLOAD,
149 payload.getStructuredData().getOid()
150 )
151 )
152 .then()
153 .statusCode(200)
154 .extract()
155 .as(StructuredDataPayload.class);
156
157 var payloadMap = objectMapper.readValue(actual.getPayload(), Map.class);
158 var expectedMap = objectMapper.readValue(payload.getPayload(), Map.class);
159
160 assertThat(actual.getStructuredData()).isEqualTo(payload.getStructuredData());
161 assertThat(payloadMap).containsAllEntriesOf(expectedMap);
162 assertThat(actual.getStructuredData()).isEqualTo(payload.getStructuredData());
163 }
164
165 @Test
166 @Order(7)
167 public void getStructuredDataPayload_userHasNoPermissions_NotAllowed() {
168 given()
169 .spec(requestSpecOfOtherUser)
170 .when()
171 .get(
172 String.format(
173 "%s/%d/%s/%s",
174 containerURL,
175 container.getId(),
176 Constants.PAYLOAD,
177 payload.getStructuredData().getOid()
178 )
179 )
180 .then()
181 .statusCode(403)
182 .extract()
183 .as(ErrorResponse.class);
184 }
185
186 @Test
187 @Order(8)
188 public void getStructuredDataPayload_nonExistingOid() throws JsonMappingException, JsonProcessingException {
189 var actual = given()
190 .spec(requestSpecOfDefaultUser)
191 .when()
192 .get(String.format("%s/%d/%s/%s", containerURL, container.getId(), Constants.PAYLOAD, 1234321))
193 .then()
194 .statusCode(404)
195 .extract()
196 .as(ErrorResponse.class);
197 assertEquals("Could not find document with oid: 1234321", actual.getMessage());
198 }
199
200 @Test
201 @Order(9)
202 public void deleteStructuredData() {
203 given()
204 .spec(requestSpecOfDefaultUser)
205 .when()
206 .delete(
207 String.format(
208 "%s/%d/%s/%s",
209 containerURL,
210 container.getId(),
211 Constants.PAYLOAD,
212 payload.getStructuredData().getOid()
213 )
214 )
215 .then()
216 .statusCode(204);
217
218 given()
219 .spec(requestSpecOfDefaultUser)
220 .when()
221 .get(
222 String.format(
223 "%s/%d/%s/%s",
224 containerURL,
225 container.getId(),
226 Constants.PAYLOAD,
227 payload.getStructuredData().getOid()
228 )
229 )
230 .then()
231 .statusCode(404);
232
233 var actual = given()
234 .spec(requestSpecOfDefaultUser)
235 .when()
236 .get(containerURL + "/" + container.getId() + "/" + Constants.PAYLOAD)
237 .then()
238 .statusCode(200)
239 .extract()
240 .as(StructuredData[].class);
241 assertThat(actual).isEmpty();
242 }
243
244 @Test
245 @Order(10)
246 public void deleteContainer() {
247 given().spec(requestSpecOfDefaultUser).when().delete(containerURL + "/" + container.getId()).then().statusCode(204);
248
249 given().spec(requestSpecOfDefaultUser).when().get(containerURL + "/" + container.getId()).then().statusCode(404);
250 }
251
252 @Test
253 public void getStructuredDataContainer_doesNotExist_notFound() {
254 var actual = given()
255 .spec(requestSpecOfDefaultUser)
256 .when()
257 .get(containerURL + "/99999")
258 .then()
259 .statusCode(404)
260 .extract()
261 .as(ErrorResponse.class);
262
263 assertThat(actual.getMessage()).isEqualTo("ID ERROR - Structured Data Container with id 99999 is null or deleted");
264 }
265 }