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.file.io.FileReferenceIO;
11 import de.dlr.shepard.data.file.entities.ShepardFile;
12 import de.dlr.shepard.data.file.io.FileContainerIO;
13 import io.quarkus.test.junit.QuarkusIntegrationTest;
14 import io.restassured.builder.RequestSpecBuilder;
15 import io.restassured.http.ContentType;
16 import io.restassured.specification.RequestSpecification;
17 import java.io.ByteArrayInputStream;
18 import java.io.IOException;
19 import java.io.InputStream;
20 import java.net.URISyntaxException;
21 import org.junit.jupiter.api.BeforeAll;
22 import org.junit.jupiter.api.MethodOrderer;
23 import org.junit.jupiter.api.Order;
24 import org.junit.jupiter.api.Test;
25 import org.junit.jupiter.api.TestMethodOrder;
26
27 @QuarkusIntegrationTest
28 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
29 public class FileReferenceIT extends BaseTestCaseIT {
30
31 private static CollectionIO collection;
32 private static DataObjectIO dataObject;
33 private static ShepardFile file;
34
35 private static String referencesURL;
36 private static String containerURL;
37 private static RequestSpecification fileRequestSpec;
38
39 private static FileContainerIO container;
40 private static FileReferenceIO reference;
41
42 @BeforeAll
43 public static void setUp() throws URISyntaxException {
44 collection = createCollection("FileReferenceTestCollection");
45 dataObject = createDataObject("FileReferenceTestDataObject", collection.getId());
46
47 referencesURL = String.format(
48 "/%s/%d/%s/%d/%s",
49 Constants.COLLECTIONS,
50 collection.getId(),
51 Constants.DATA_OBJECTS,
52 dataObject.getId(),
53 Constants.FILE_REFERENCES
54 );
55
56 containerURL = "/" + Constants.FILE_CONTAINERS;
57 fileRequestSpec = new RequestSpecBuilder()
58 .setContentType(ContentType.MULTIPART)
59 .addHeader("X-API-KEY", defaultUser.getApiKey().getJws())
60 .build();
61
62 var toCreate = new FileContainerIO();
63 toCreate.setName("FileContainer");
64 InputStream targetStream = new ByteArrayInputStream("Hello World!".getBytes());
65 container = given()
66 .spec(requestSpecOfDefaultUser)
67 .body(toCreate)
68 .when()
69 .post(containerURL)
70 .then()
71 .statusCode(201)
72 .extract()
73 .as(FileContainerIO.class);
74 file = given()
75 .spec(fileRequestSpec)
76 .multiPart("file", "test.txt", targetStream)
77 .when()
78 .post(String.format("%s/%d/%s", containerURL, container.getId(), Constants.PAYLOAD))
79 .then()
80 .statusCode(201)
81 .extract()
82 .as(ShepardFile.class);
83 }
84
85 @Test
86 @Order(1)
87 public void createFileReference() {
88 var toCreate = new FileReferenceIO();
89 toCreate.setName("FileReferenceDummy");
90 toCreate.setFileOids(new String[] { file.getOid() });
91 toCreate.setFileContainerId(container.getId());
92
93 var actual = given()
94 .spec(requestSpecOfDefaultUser)
95 .body(toCreate)
96 .when()
97 .post(referencesURL)
98 .then()
99 .statusCode(201)
100 .extract()
101 .as(FileReferenceIO.class);
102 reference = actual;
103
104 assertThat(actual.getId()).isNotNull();
105 assertThat(actual.getCreatedAt()).isNotNull();
106 assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
107 assertThat(actual.getDataObjectId()).isEqualTo(dataObject.getId());
108 assertThat(actual.getName()).isEqualTo("FileReferenceDummy");
109 assertThat(actual.getFileContainerId()).isEqualTo(container.getId());
110 assertThat(actual.getFileOids()).containsExactly(file.getOid());
111 assertThat(actual.getType()).isEqualTo("FileReference");
112 assertThat(actual.getUpdatedAt()).isNull();
113 assertThat(actual.getUpdatedBy()).isNull();
114 }
115
116 @Test
117 @Order(2)
118 public void getFileReferences() {
119 var actual = given()
120 .spec(requestSpecOfDefaultUser)
121 .when()
122 .get(referencesURL)
123 .then()
124 .statusCode(200)
125 .extract()
126 .as(FileReferenceIO[].class);
127 assertThat(actual).containsExactly(reference);
128 }
129
130 @Test
131 @Order(3)
132 public void getFileReference() {
133 var actual = given()
134 .spec(requestSpecOfDefaultUser)
135 .when()
136 .get(referencesURL + "/" + reference.getId())
137 .then()
138 .statusCode(200)
139 .extract()
140 .as(FileReferenceIO.class);
141
142 assertThat(actual).isEqualTo(reference);
143 }
144
145 @Test
146 @Order(4)
147 public void getFileReference_referenceDoesNotExist_notFound() {
148 var actual = given()
149 .spec(requestSpecOfDefaultUser)
150 .when()
151 .get(referencesURL + "/99999")
152 .then()
153 .statusCode(404)
154 .extract()
155 .as(ErrorResponse.class);
156
157 assertThat(actual.getMessage()).isEqualTo("ID ERROR - File Reference with id 99999 is null or deleted");
158 }
159
160 @Test
161 @Order(5)
162 public void getFileReference_idBelongsToWrongDataObject_notFound() {
163 DataObjectIO otherDataObject = createDataObject("OtherStructuredDataReferenceTestDataObject", collection.getId());
164
165 var toCreate = new FileReferenceIO();
166 toCreate.setName("FileReferenceDummy");
167 toCreate.setFileOids(new String[] { file.getOid() });
168 toCreate.setFileContainerId(container.getId());
169
170 FileReferenceIO otherRef = given()
171 .spec(requestSpecOfDefaultUser)
172 .body(toCreate)
173 .when()
174 .post(
175 String.format(
176 "/%s/%d/%s/%d/%s",
177 Constants.COLLECTIONS,
178 collection.getId(),
179 Constants.DATA_OBJECTS,
180 otherDataObject.getId(),
181 Constants.FILE_REFERENCES
182 )
183 )
184 .then()
185 .statusCode(201)
186 .extract()
187 .as(FileReferenceIO.class);
188
189 var actual = given()
190 .spec(requestSpecOfDefaultUser)
191 .when()
192 .get(referencesURL + "/" + otherRef.getId())
193 .then()
194 .statusCode(404)
195 .extract()
196 .as(ErrorResponse.class);
197
198 assertThat(actual.getMessage()).isEqualTo("ID ERROR - There is no association between dataObject and reference");
199 }
200
201 @Test
202 @Order(6)
203 public void getFileReferencePayload() throws URISyntaxException, IOException {
204 var actual = given()
205 .spec(requestSpecOfDefaultUser)
206 .when()
207 .get(String.format("%s/%d/payload/%s", referencesURL, reference.getId(), file.getOid()))
208 .then()
209 .statusCode(200)
210 .extract()
211 .asString();
212
213 assertThat(actual).isEqualTo("Hello World!");
214 }
215
216 @Test
217 @Order(7)
218 public void deleteReferences() {
219 given()
220 .spec(requestSpecOfDefaultUser)
221 .when()
222 .delete(referencesURL + "/" + reference.getId())
223 .then()
224 .statusCode(204);
225 given()
226 .spec(requestSpecOfDefaultUser)
227 .when()
228 .delete(referencesURL + "/" + reference.getId())
229 .then()
230 .statusCode(404);
231 given().spec(requestSpecOfDefaultUser).when().get(referencesURL + "/" + reference.getId()).then().statusCode(404);
232 }
233 }