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