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