1 package de.dlr.shepard.common.search.services;
2
3 import static org.junit.jupiter.api.Assertions.assertEquals;
4 import static org.mockito.Mockito.when;
5
6 import de.dlr.shepard.BaseTestCase;
7 import de.dlr.shepard.auth.users.entities.User;
8 import de.dlr.shepard.auth.users.services.UserService;
9 import de.dlr.shepard.common.neo4j.io.BasicEntityIO;
10 import de.dlr.shepard.common.search.daos.SearchDAO;
11 import de.dlr.shepard.common.search.io.QueryType;
12 import de.dlr.shepard.common.search.io.ResponseBody;
13 import de.dlr.shepard.common.search.io.ResultTriple;
14 import de.dlr.shepard.common.search.io.SearchBody;
15 import de.dlr.shepard.common.search.io.SearchParams;
16 import de.dlr.shepard.common.search.io.SearchScope;
17 import de.dlr.shepard.common.search.query.Neo4jQueryBuilder;
18 import de.dlr.shepard.common.util.Constants;
19 import de.dlr.shepard.common.util.TraversalRules;
20 import de.dlr.shepard.context.collection.entities.Collection;
21 import de.dlr.shepard.context.collection.entities.DataObject;
22 import io.quarkus.test.InjectMock;
23 import io.quarkus.test.component.QuarkusComponentTest;
24 import jakarta.inject.Inject;
25 import java.util.List;
26 import java.util.stream.Stream;
27 import org.junit.jupiter.api.Test;
28 import org.junit.jupiter.params.ParameterizedTest;
29 import org.junit.jupiter.params.provider.Arguments;
30 import org.junit.jupiter.params.provider.MethodSource;
31
32 @QuarkusComponentTest
33 public class DataObjectSearchServiceTest extends BaseTestCase {
34
35 @InjectMock
36 SearchDAO searchDAO;
37
38 @Inject
39 DataObjectSearchService dataObjectSearcher;
40
41 @InjectMock
42 UserService userService;
43
44 private static final User user = new User("Testuser");
45
46 private static String query = String.format(
47 """
48 {
49 "OR": [
50 {
51 "property": "id",
52 "value": %d,
53 "operator": "eq"
54 },
55 {
56 "property": "number",
57 "value": 123,
58 "operator": "le"
59 }
60 ]}""",
61 1L
62 );
63
64 @ParameterizedTest
65 @MethodSource
66 public void test(SearchScope scope, String selectionQuery) {
67 var collection = new Collection(1L);
68 collection.setShepardId(collection.getId());
69 var dataObject = new DataObject(2L);
70 dataObject.setShepardId(dataObject.getId());
71 dataObject.setCollection(collection);
72 SearchScope[] scopes = { scope };
73 SearchParams searchParams = new SearchParams(query, QueryType.DataObject);
74 SearchBody searchBody = new SearchBody(scopes, searchParams);
75
76 when(searchDAO.findDataObjects(selectionQuery, Constants.DATAOBJECT_IN_QUERY)).thenReturn(List.of(dataObject));
77 when(userService.getCurrentUser()).thenReturn(user);
78
79 ResultTriple resultTriple = new ResultTriple(1L, 2L);
80 ResultTriple[] resultTriples = { resultTriple };
81 BasicEntityIO[] results = { new BasicEntityIO(dataObject) };
82 ResponseBody responseBody = new ResponseBody(resultTriples, results, searchParams);
83 var actual = dataObjectSearcher.search(searchBody);
84 assertEquals(responseBody, actual);
85 }
86
87 private static Stream<? extends Arguments> test() {
88 TraversalRules[] traversalRules = { TraversalRules.children };
89
90 var scope1 = new SearchScope(null, null, new TraversalRules[0]);
91 var scope2 = new SearchScope(1L, null, new TraversalRules[0]);
92 var scope3 = new SearchScope(1L, 2L, new TraversalRules[0]);
93 var scope4 = new SearchScope(1L, 2L, traversalRules);
94
95 var query1 = Neo4jQueryBuilder.dataObjectSelectionQueryWithNeo4jId(query, user.getUsername());
96 var query2 = Neo4jQueryBuilder.collectionDataObjectSelectionQueryWithNeo4jId(1L, query, user.getUsername());
97 var query3 = Neo4jQueryBuilder.collectionDataObjectDataObjectSelectionQueryWithNeo4jId(
98 scope3,
99 query,
100 user.getUsername()
101 );
102 var query4 = Neo4jQueryBuilder.collectionDataObjectDataObjectSelectionQueryWithNeo4jId(
103 scope4,
104 traversalRules[0],
105 query,
106 user.getUsername()
107 );
108
109
110 return Stream.of(
111 Arguments.of(scope1, query1),
112 Arguments.of(scope2, query2),
113 Arguments.of(scope3, query3),
114 Arguments.of(scope4, query4)
115 );
116
117 }
118
119 @Test
120 public void test_invalid() {
121 SearchScope[] scopes = { new SearchScope(null, 2L, new TraversalRules[0]) };
122 SearchParams searchParams = new SearchParams(query, QueryType.DataObject);
123 SearchBody searchBody = new SearchBody(scopes, searchParams);
124 ResultTriple[] resultTriples = {};
125 BasicEntityIO[] results = {};
126 ResponseBody responseBody = new ResponseBody(resultTriples, results, searchParams);
127 var actual = dataObjectSearcher.search(searchBody);
128 assertEquals(responseBody, actual);
129 }
130 }