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.data.file.entities.ShepardFile;
9 import de.dlr.shepard.data.file.io.FileContainerIO;
10 import io.quarkus.test.junit.QuarkusIntegrationTest;
11 import io.restassured.builder.RequestSpecBuilder;
12 import io.restassured.http.ContentType;
13 import io.restassured.specification.RequestSpecification;
14 import jakarta.xml.bind.DatatypeConverter;
15 import java.io.File;
16 import java.io.FileInputStream;
17 import java.io.FileNotFoundException;
18 import java.io.IOException;
19 import java.net.URISyntaxException;
20 import java.nio.file.Files;
21 import java.security.MessageDigest;
22 import java.security.NoSuchAlgorithmException;
23 import org.junit.jupiter.api.BeforeAll;
24 import org.junit.jupiter.api.MethodOrderer;
25 import org.junit.jupiter.api.Order;
26 import org.junit.jupiter.api.Test;
27 import org.junit.jupiter.api.TestMethodOrder;
28
29 @QuarkusIntegrationTest
30 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
31 public class FileIT extends BaseTestCaseIT {
32
33 private static ShepardFile file;
34 private static String containerURL;
35 private static RequestSpecification fileRequestSpec;
36 private static FileContainerIO container;
37
38 @BeforeAll
39 public static void setUp() {
40 containerURL = "/" + Constants.FILE_CONTAINERS;
41 fileRequestSpec = new RequestSpecBuilder()
42 .setContentType(ContentType.MULTIPART)
43 .addHeader("X-API-KEY", defaultUser.getApiKey().getJws())
44 .build();
45 }
46
47 @Test
48 @Order(1)
49 public void createFileContainer() {
50 var toCreate = new FileContainerIO();
51 toCreate.setName("FileContainer");
52
53 var actual = given()
54 .spec(requestSpecOfDefaultUser)
55 .body(toCreate)
56 .when()
57 .post(containerURL)
58 .then()
59 .statusCode(201)
60 .extract()
61 .as(FileContainerIO.class);
62 container = actual;
63
64 assertThat(actual.getId()).isNotNull();
65 assertThat(actual.getCreatedAt()).isNotNull();
66 assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
67 assertThat(actual.getOid()).isNotBlank();
68 assertThat(actual.getName()).isEqualTo("FileContainer");
69 assertThat(actual.getUpdatedAt()).isNull();
70 assertThat(actual.getUpdatedBy()).isNull();
71 }
72
73 @Test
74 @Order(2)
75 public void getFileContainers() {
76 var actual = given()
77 .spec(requestSpecOfDefaultUser)
78 .when()
79 .get(containerURL)
80 .then()
81 .statusCode(200)
82 .extract()
83 .as(FileContainerIO[].class);
84
85 assertThat(actual).contains(container);
86 }
87
88 @Test
89 @Order(3)
90 public void getFileContainer() {
91 var actual = given()
92 .spec(requestSpecOfDefaultUser)
93 .when()
94 .get(containerURL + "/" + container.getId())
95 .then()
96 .statusCode(200)
97 .extract()
98 .as(FileContainerIO.class);
99
100 assertThat(actual).isEqualTo(container);
101 }
102
103 @Test
104 public void getFileContainer_doesNotExist_notFound() {
105 var actual = given()
106 .spec(requestSpecOfDefaultUser)
107 .when()
108 .get(containerURL + "/99999")
109 .then()
110 .statusCode(404)
111 .extract()
112 .as(ErrorResponse.class);
113
114 assertThat(actual.getMessage()).isEqualTo("ID ERROR - File Container with id 99999 is null or deleted");
115 }
116
117 @Test
118 public void getFileContainer_doesNotExistNegativeId_badRequest() {
119 var actual = given()
120 .spec(requestSpecOfDefaultUser)
121 .when()
122 .get(containerURL + "/-1")
123 .then()
124 .statusCode(400)
125 .extract();
126 assertThat(actual.body().asString()).isEqualTo(
127 "{\"title\":\"Constraint Violation\",\"status\":400,\"violations\":[{\"field\":\"getFileContainer.fileContainerId\",\"message\":\"must be greater than or equal to 0\"}]}"
128 );
129 }
130
131 @Test
132 @Order(4)
133 public void uploadFile() throws URISyntaxException, NoSuchAlgorithmException, FileNotFoundException, IOException {
134 var newFile = new File(getClass().getClassLoader().getResource("test.txt").toURI());
135 MessageDigest md = MessageDigest.getInstance("MD5");
136 try (var stream = new FileInputStream(newFile)) {
137 md.update(stream.readAllBytes());
138 }
139 var md5 = DatatypeConverter.printHexBinary(md.digest());
140 var actual = given()
141 .spec(fileRequestSpec)
142 .multiPart(newFile)
143 .when()
144 .post(String.format("%s/%d/%s", containerURL, container.getId(), Constants.PAYLOAD))
145 .then()
146 .statusCode(201)
147 .extract()
148 .as(ShepardFile.class);
149 file = actual;
150
151 assertThat(actual.getOid()).isNotBlank();
152 assertThat(actual.getCreatedAt()).isNotNull();
153 assertThat(actual.getFilename()).isEqualTo("test.txt");
154 assertThat(actual.getMd5()).isEqualToIgnoringCase(md5);
155 }
156
157 @Test
158 @Order(5)
159 public void getFiles() {
160 var actual = given()
161 .spec(requestSpecOfDefaultUser)
162 .when()
163 .get(containerURL + "/" + container.getId() + "/" + Constants.PAYLOAD)
164 .then()
165 .statusCode(200)
166 .extract()
167 .as(ShepardFile[].class);
168
169 assertThat(actual).containsExactly(file);
170 }
171
172 @Test
173 @Order(6)
174 public void getFilePayload() throws URISyntaxException, IOException {
175 var oldFile = new File(getClass().getClassLoader().getResource("test.txt").toURI());
176 var expected = Files.readString(oldFile.toPath());
177 var actual = given()
178 .spec(requestSpecOfDefaultUser)
179 .when()
180 .get(String.format("%s/%d/%s/%s", containerURL, container.getId(), Constants.PAYLOAD, file.getOid()))
181 .then()
182 .statusCode(200)
183 .extract()
184 .asString();
185
186 assertThat(actual).isEqualTo(expected);
187 }
188
189 @Test
190 @Order(7)
191 public void deleteFile() {
192 given()
193 .spec(requestSpecOfDefaultUser)
194 .when()
195 .delete(String.format("%s/%d/%s/%s", containerURL, container.getId(), Constants.PAYLOAD, file.getOid()))
196 .then()
197 .statusCode(204);
198
199 given()
200 .spec(requestSpecOfDefaultUser)
201 .when()
202 .get(String.format("%s/%d/%s/%s", containerURL, container.getId(), Constants.PAYLOAD, file.getOid()))
203 .then()
204 .statusCode(404);
205
206 var actual = given()
207 .spec(requestSpecOfDefaultUser)
208 .when()
209 .get(containerURL + "/" + container.getId() + "/" + Constants.PAYLOAD)
210 .then()
211 .statusCode(200)
212 .extract()
213 .as(ShepardFile[].class);
214 assertThat(actual).isEmpty();
215 }
216
217 @Test
218 @Order(8)
219 public void deleteContainer() {
220 given().spec(requestSpecOfDefaultUser).when().delete(containerURL + "/" + container.getId()).then().statusCode(204);
221
222 given().spec(requestSpecOfDefaultUser).when().get(containerURL + "/" + container.getId()).then().statusCode(404);
223 }
224 }