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