View Javadoc
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     // @formatter:off
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     // @formatter:on
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 }