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