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