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