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.dataobject.io.CollectionReferenceIO;
11 import io.quarkus.test.junit.QuarkusIntegrationTest;
12 import org.junit.jupiter.api.BeforeAll;
13 import org.junit.jupiter.api.MethodOrderer;
14 import org.junit.jupiter.api.Order;
15 import org.junit.jupiter.api.Test;
16 import org.junit.jupiter.api.TestMethodOrder;
17
18 @QuarkusIntegrationTest
19 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
20 public class CollectionReferenceIT extends BaseTestCaseIT {
21
22 private static CollectionIO collection;
23 private static DataObjectIO dataObject;
24 private static CollectionIO referenced;
25
26 private static String referencesURL;
27
28 private static CollectionReferenceIO reference;
29
30 @BeforeAll
31 public static void setUp() {
32 collection = createCollection("CollectionReferenceTestCollection");
33 dataObject = createDataObject("CollectionReference", collection.getId());
34 referenced = createCollection("ReferencedCollection");
35
36 referencesURL = "/%s/%d/%s/%d/%s".formatted(
37 Constants.COLLECTIONS,
38 collection.getId(),
39 Constants.DATA_OBJECTS,
40 dataObject.getId(),
41 Constants.COLLECTION_REFERENCES
42 );
43 }
44
45 @Test
46 @Order(1)
47 public void createCollectionReferenceTest() {
48 var toCreate = new CollectionReferenceIO();
49 toCreate.setName("CollectionReferenceDummy");
50 toCreate.setRelationship("integrationtests");
51 toCreate.setReferencedCollectionId(referenced.getId());
52
53 var actual = given()
54 .spec(requestSpecOfDefaultUser)
55 .body(toCreate)
56 .when()
57 .post(referencesURL)
58 .then()
59 .statusCode(201)
60 .extract()
61 .as(CollectionReferenceIO.class);
62 reference = actual;
63
64 assertThat(actual.getId()).isNotNull();
65 assertThat(actual.getCreatedAt()).isNotNull();
66 assertThat(actual.getCreatedBy()).isEqualTo(nameOfDefaultUser);
67 assertThat(actual.getDataObjectId()).isEqualTo(dataObject.getId());
68 assertThat(actual.getName()).isEqualTo("CollectionReferenceDummy");
69 assertThat(actual.getRelationship()).isEqualTo("integrationtests");
70 assertThat(actual.getReferencedCollectionId()).isEqualTo(referenced.getId());
71 assertThat(actual.getType()).isEqualTo("CollectionReference");
72 assertThat(actual.getUpdatedAt()).isNull();
73 assertThat(actual.getUpdatedBy()).isNull();
74 }
75
76 @Test
77 @Order(2)
78 public void createCollectionReferenceTest_ReferencedDoesNotExist() {
79 var toCreate = new CollectionReferenceIO();
80 toCreate.setName("CollectionReferenceDummy2");
81 toCreate.setRelationship("integrationtests");
82 toCreate.setReferencedCollectionId(-2);
83
84 given().spec(requestSpecOfDefaultUser).body(toCreate).when().post(referencesURL).then().statusCode(400);
85 }
86
87 @Test
88 @Order(3)
89 public void getCollectionReferenceTest() {
90 var actual = given()
91 .spec(requestSpecOfDefaultUser)
92 .when()
93 .get(referencesURL + "/" + reference.getId())
94 .then()
95 .statusCode(200)
96 .extract()
97 .as(CollectionReferenceIO.class);
98 assertThat(actual).isEqualTo(reference);
99 }
100
101 @Test
102 @Order(4)
103 public void getCollectionReferencesTest() {
104 var actual = given()
105 .spec(requestSpecOfDefaultUser)
106 .when()
107 .get(referencesURL)
108 .then()
109 .statusCode(200)
110 .extract()
111 .as(CollectionReferenceIO[].class);
112 assertThat(actual).containsExactly(reference);
113 }
114
115 @Test
116 @Order(5)
117 public void getCollectionReference_referenceDoesNotExist_notFound() {
118 var actual = given()
119 .spec(requestSpecOfDefaultUser)
120 .when()
121 .get(referencesURL + "/99999")
122 .then()
123 .statusCode(404)
124 .extract()
125 .as(ErrorResponse.class);
126
127 assertThat(actual.getMessage()).isEqualTo("ID ERROR - Collection Reference with id 99999 is null or deleted");
128 }
129
130 @Test
131 @Order(6)
132 public void getCollectionReferencedTest() {
133 var referencedURL = "/%s/%d".formatted(Constants.COLLECTIONS, referenced.getId());
134 var actual = given()
135 .spec(requestSpecOfDefaultUser)
136 .when()
137 .get(referencedURL)
138 .then()
139 .statusCode(200)
140 .extract()
141 .as(CollectionIO.class);
142
143 assertThat(actual).usingRecursiveComparison().ignoringFields("incomingIds").isEqualTo(referenced);
144 assertThat(actual.getIncomingIds()).containsExactly(reference.getId());
145 }
146
147 @Test
148 @Order(7)
149 public void getCollectionReferencePayloadTest() {
150 var actual = given()
151 .spec(requestSpecOfDefaultUser)
152 .when()
153 .get("%s/%d/%s".formatted(referencesURL, reference.getId(), Constants.PAYLOAD))
154 .then()
155 .statusCode(200)
156 .extract()
157 .as(CollectionIO.class);
158
159 assertThat(actual).usingRecursiveComparison().ignoringFields("incomingIds").isEqualTo(referenced);
160 assertThat(actual.getIncomingIds()).containsExactly(reference.getId());
161 }
162
163 @Test
164 @Order(8)
165 public void getCollectionReference_idBelongsToWrongDataObject_notFound() {
166 DataObjectIO otherDataObject = createDataObject("OtherStructuredDataReferenceTestDataObject", collection.getId());
167
168 var toCreate = new CollectionReferenceIO();
169 toCreate.setName("CollectionReferenceDummy");
170 toCreate.setRelationship("integrationtests");
171 toCreate.setReferencedCollectionId(referenced.getId());
172
173 CollectionReferenceIO otherRef = given()
174 .spec(requestSpecOfDefaultUser)
175 .body(toCreate)
176 .when()
177 .post(
178 "/%s/%d/%s/%d/%s".formatted(
179 Constants.COLLECTIONS,
180 collection.getId(),
181 Constants.DATA_OBJECTS,
182 otherDataObject.getId(),
183 Constants.COLLECTION_REFERENCES
184 )
185 )
186 .then()
187 .statusCode(201)
188 .extract()
189 .as(CollectionReferenceIO.class);
190
191 var actual = given()
192 .spec(requestSpecOfDefaultUser)
193 .when()
194 .get(referencesURL + "/" + otherRef.getId())
195 .then()
196 .statusCode(404)
197 .extract()
198 .as(ErrorResponse.class);
199
200 assertThat(actual.getMessage()).isEqualTo("ID ERROR - There is no association between dataObject and reference");
201 }
202
203 @Test
204 @Order(9)
205 public void deleteCollectionReferenceTest() {
206 given()
207 .spec(requestSpecOfDefaultUser)
208 .when()
209 .delete(referencesURL + "/" + reference.getId())
210 .then()
211 .statusCode(204);
212 given()
213 .spec(requestSpecOfDefaultUser)
214 .when()
215 .delete(referencesURL + "/" + reference.getId())
216 .then()
217 .statusCode(404);
218 given().spec(requestSpecOfDefaultUser).when().get(referencesURL + "/" + reference.getId()).then().statusCode(404);
219 }
220 }