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