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