View Javadoc
1   package de.dlr.shepard.context.collection.services;
2   
3   import static org.junit.jupiter.api.Assertions.assertEquals;
4   import static org.junit.jupiter.api.Assertions.assertTrue;
5   
6   import de.dlr.shepard.auth.security.AuthenticationContext;
7   import de.dlr.shepard.auth.security.JWTPrincipal;
8   import de.dlr.shepard.auth.users.entities.User;
9   import de.dlr.shepard.auth.users.services.UserService;
10  import de.dlr.shepard.context.collection.entities.Collection;
11  import de.dlr.shepard.context.collection.entities.DataObject;
12  import de.dlr.shepard.context.collection.io.CollectionIO;
13  import de.dlr.shepard.context.collection.io.DataObjectIO;
14  import de.dlr.shepard.context.references.dataobject.entities.DataObjectReference;
15  import de.dlr.shepard.context.references.dataobject.io.DataObjectReferenceIO;
16  import de.dlr.shepard.context.references.dataobject.services.CollectionReferenceService;
17  import de.dlr.shepard.context.references.dataobject.services.DataObjectReferenceService;
18  import de.dlr.shepard.context.references.file.services.FileReferenceService;
19  import de.dlr.shepard.context.references.structureddata.services.StructuredDataReferenceService;
20  import de.dlr.shepard.context.references.timeseriesreference.services.TimeseriesReferenceService;
21  import de.dlr.shepard.context.version.daos.VersionDAO;
22  import de.dlr.shepard.context.version.services.VersionService;
23  import de.dlr.shepard.data.file.services.FileContainerService;
24  import de.dlr.shepard.data.structureddata.services.StructuredDataContainerService;
25  import de.dlr.shepard.data.structureddata.services.StructuredDataService;
26  import de.dlr.shepard.data.timeseries.services.TimeseriesContainerService;
27  import de.dlr.shepard.data.timeseries.services.TimeseriesService;
28  import io.quarkus.test.junit.QuarkusTest;
29  import jakarta.inject.Inject;
30  import jakarta.transaction.Transactional;
31  import java.util.Map;
32  import org.junit.jupiter.api.BeforeEach;
33  import org.junit.jupiter.api.Test;
34  
35  @QuarkusTest
36  public class DataObjectServiceQuarkusTest {
37  
38    @Inject
39    CollectionService collectionService;
40  
41    @Inject
42    UserService userService;
43  
44    @Inject
45    AuthenticationContext authenticationContext;
46  
47    @Inject
48    TimeseriesService timeseriesService;
49  
50    @Inject
51    StructuredDataContainerService structuredDataContainerService;
52  
53    @Inject
54    FileContainerService fileContainerService;
55  
56    @Inject
57    FileReferenceService fileReferenceService;
58  
59    @Inject
60    VersionDAO versionDAO;
61  
62    @Inject
63    TimeseriesReferenceService timeseriesReferenceService;
64  
65    @Inject
66    TimeseriesContainerService timeseriesContainerService;
67  
68    @Inject
69    StructuredDataService structuredDataService;
70  
71    @Inject
72    StructuredDataReferenceService structuredDataReferenceService;
73  
74    @Inject
75    DataObjectService dataObjectService;
76  
77    @Inject
78    DataObjectReferenceService dataObjectReferenceService;
79  
80    @Inject
81    VersionService versionService;
82  
83    @Inject
84    CollectionReferenceService collectionReferenceService;
85  
86    private Collection collection;
87  
88    private final String userName = "user_name";
89    private final String collectionName = "collection_name";
90  
91    private DataObject createDataObject(DataObjectIO dataObjectToCreate) {
92      return dataObjectService.createDataObject(collection.getId(), dataObjectToCreate);
93    }
94  
95    private DataObjectReference createDataObjectReference(
96      long collectionId,
97      String name,
98      DataObject referencingDataObject,
99      DataObject referencedDataObject
100   ) {
101     DataObjectReferenceIO dorIO = new DataObjectReferenceIO();
102     dorIO.setName(name);
103     dorIO.setReferencedDataObjectId(referencedDataObject.getShepardId());
104     return dataObjectReferenceService.createReference(collectionId, referencingDataObject.getShepardId(), dorIO);
105   }
106 
107   @BeforeEach
108   public void setup() {
109     User user = new User(userName);
110     userService.createOrUpdateUser(user);
111     authenticationContext.setPrincipal(new JWTPrincipal(userName, "key"));
112     CollectionIO collectionIO = new CollectionIO();
113     collectionIO.setName(collectionName);
114     collection = collectionService.createCollection(collectionIO);
115     collection.setPermissions(null);
116   }
117 
118   @Test
119   @Transactional
120   public void testCutDeleted() {
121     DataObject parentOfFirstDataObject = createDataObject(
122       new DataObjectIOBuilder().setName("parentCentralDataObject").build()
123     );
124 
125     DataObject survivingPredecessor = createDataObject(new DataObjectIOBuilder().setName("survivor").build());
126     DataObject deletedPredecessor = createDataObject(new DataObjectIOBuilder().setName("toBeDeleted").build());
127     long[] firstDataObjectPredecessorIds = { survivingPredecessor.getShepardId(), deletedPredecessor.getShepardId() };
128 
129     DataObject firstDataObject = createDataObject(
130       new DataObjectIOBuilder()
131         .setName("firstDataObject")
132         .setParentId(parentOfFirstDataObject.getShepardId())
133         .setPredecessorIds(firstDataObjectPredecessorIds)
134         .build()
135     );
136     DataObject referencingDataObject = createDataObject(
137       new DataObjectIOBuilder().setName("referencingDataObject").build()
138     );
139     DataObjectReference referenceToFirstDataObject = createDataObjectReference(
140       collection.getShepardId(),
141       "referenceToFirstDataObject",
142       referencingDataObject,
143       firstDataObject
144     );
145 
146     DataObject firstDataObjectReloaded = dataObjectService.getDataObject(
147       collection.getShepardId(),
148       firstDataObject.getShepardId()
149     );
150     assertEquals(firstDataObjectReloaded.getIncoming().get(0).getId(), referenceToFirstDataObject.getId());
151     assertEquals(referencingDataObject.getReferences().get(0).getId(), referenceToFirstDataObject.getId());
152 
153     dataObjectReferenceService.deleteReference(
154       collection.getShepardId(),
155       referencingDataObject.getShepardId(),
156       referenceToFirstDataObject.getShepardId()
157     );
158 
159     firstDataObjectReloaded = dataObjectService.getDataObject(
160       collection.getShepardId(),
161       firstDataObject.getShepardId()
162     );
163 
164     // this is only needed to notify the neo4j session to flush all existing data and start a new session
165     // else the following checks have stale data
166     dataObjectService.clearSession();
167 
168     DataObject referencingDataObjectReloaded = dataObjectService.getDataObject(
169       collection.getShepardId(),
170       referencingDataObject.getShepardId()
171     );
172     assertEquals(0, firstDataObjectReloaded.getIncoming().size());
173     assertEquals(0, referencingDataObjectReloaded.getReferences().size());
174 
175     dataObjectService.deleteDataObject(collection.getShepardId(), deletedPredecessor.getShepardId());
176     firstDataObjectReloaded = dataObjectService.getDataObject(firstDataObject.getShepardId());
177     assertEquals(1, firstDataObjectReloaded.getPredecessors().size());
178     assertEquals(survivingPredecessor.getId(), firstDataObjectReloaded.getPredecessors().get(0).getId());
179     dataObjectService.deleteDataObject(collection.getShepardId(), firstDataObject.getShepardId());
180     DataObject survivingPredecessorReloaded = dataObjectService.getDataObject(survivingPredecessor.getShepardId());
181     assertEquals(0, survivingPredecessorReloaded.getSuccessors().size());
182     DataObject parentOfFirsDataObjectReloaded = dataObjectService.getDataObject(parentOfFirstDataObject.getShepardId());
183     assertEquals(0, parentOfFirsDataObjectReloaded.getChildren().size());
184   }
185 
186   @Test
187   public void deleteParentOfDataObject_success() {
188     // Arrange
189     DataObject parent = createDataObject(new DataObjectIOBuilder().build());
190     DataObjectIO dataObjectIO = new DataObjectIOBuilder().setParentId(parent.getId()).build();
191     DataObject dataObject = createDataObject(dataObjectIO);
192 
193     // Act
194     dataObjectIO.setParentId(null);
195     dataObjectService.updateDataObject(collection.getShepardId(), dataObject.getShepardId(), dataObjectIO);
196 
197     // Assert
198     DataObject actualDataObject = dataObjectService.getDataObject(dataObject.getShepardId());
199     assertEquals(null, actualDataObject.getParent());
200   }
201 
202   @Test
203   public void deletePredecessorsOfDataObject_success() {
204     // Arrange
205     DataObject predecessor = createDataObject(new DataObjectIOBuilder().build());
206     DataObjectIO dataObjectIO = new DataObjectIOBuilder().setPredecessorIds(new long[] { predecessor.getId() }).build();
207     DataObject dataObject = createDataObject(dataObjectIO);
208 
209     // Act
210     dataObjectIO.setPredecessorIds(null);
211     dataObjectService.updateDataObject(collection.getShepardId(), dataObject.getShepardId(), dataObjectIO);
212 
213     // Assert
214     DataObject actualDataObject = dataObjectService.getDataObject(dataObject.getShepardId());
215     assertTrue(actualDataObject.getPredecessors().isEmpty());
216   }
217 
218   @Test
219   public void deleteParentOfDataObjectWithPredecessors_success() {
220     // Arrange
221     DataObject parent = createDataObject(new DataObjectIOBuilder().build());
222     DataObject predecessor = createDataObject(new DataObjectIOBuilder().build());
223     DataObjectIO dataObjectIO = new DataObjectIOBuilder()
224       .setParentId(parent.getId())
225       .setPredecessorIds(new long[] { predecessor.getId() })
226       .build();
227     DataObject dataObject = createDataObject(dataObjectIO);
228 
229     // Act
230     dataObjectIO.setParentId(null);
231     dataObjectService.updateDataObject(collection.getShepardId(), dataObject.getShepardId(), dataObjectIO);
232 
233     // Assert
234     DataObject actualDataObject = dataObjectService.getDataObject(dataObject.getShepardId());
235     assertEquals(null, actualDataObject.getParent());
236   }
237 
238   @Test
239   public void deletePredecessorOfDataObjectWithParent_success() {
240     // Arrange
241     DataObject parent = createDataObject(new DataObjectIOBuilder().build());
242     DataObject predecessor = createDataObject(new DataObjectIOBuilder().build());
243     DataObjectIO dataObjectIO = new DataObjectIOBuilder()
244       .setParentId(parent.getId())
245       .setPredecessorIds(new long[] { predecessor.getId() })
246       .build();
247     DataObject dataObject = createDataObject(dataObjectIO);
248 
249     // Act
250     dataObjectIO.setPredecessorIds(null);
251     dataObjectService.updateDataObject(collection.getShepardId(), dataObject.getShepardId(), dataObjectIO);
252 
253     // Assert
254     DataObject actualDataObject = dataObjectService.getDataObject(dataObject.getShepardId());
255     assertTrue(actualDataObject.getPredecessors().isEmpty());
256   }
257 
258   @Test
259   public void deleteAllPredecessorsAndParentOfDataObjectWithParent_success() {
260     // Arrange
261     DataObject parent = createDataObject(new DataObjectIOBuilder().build());
262     DataObject predecessor = createDataObject(new DataObjectIOBuilder().build());
263     DataObjectIO dataObjectIO = new DataObjectIOBuilder()
264       .setParentId(parent.getId())
265       .setPredecessorIds(new long[] { predecessor.getId() })
266       .build();
267     DataObject dataObject = createDataObject(dataObjectIO);
268 
269     // Act
270     dataObjectIO.setPredecessorIds(null);
271     dataObjectIO.setParentId(null);
272     dataObjectService.updateDataObject(collection.getShepardId(), dataObject.getShepardId(), dataObjectIO);
273 
274     // Assert
275     DataObject actualDataObject = dataObjectService.getDataObject(dataObject.getShepardId());
276     assertEquals(null, actualDataObject.getParent());
277     assertTrue(actualDataObject.getPredecessors().isEmpty());
278   }
279 
280   @Test
281   public void deleteAttributesOfDataObject_success() {
282     // Arrange
283     DataObjectIO dataObjectIO = new DataObjectIOBuilder().setAttributes(Map.of("name", "my data object")).build();
284     DataObject dataObject = createDataObject(dataObjectIO);
285 
286     // Act
287     dataObjectIO.setAttributes(Map.of());
288     dataObjectService.updateDataObject(collection.getShepardId(), dataObject.getShepardId(), dataObjectIO);
289 
290     // Assert
291     DataObject actualDataObject = dataObjectService.getDataObject(dataObject.getShepardId());
292     assertEquals(Map.of(), actualDataObject.getAttributes());
293   }
294 }