View Javadoc
1   package de.dlr.shepard.common.search.services;
2   
3   import static org.junit.jupiter.api.Assertions.assertEquals;
4   import static org.junit.jupiter.api.Assertions.assertThrows;
5   import static org.mockito.ArgumentMatchers.any;
6   import static org.mockito.ArgumentMatchers.anyString;
7   import static org.mockito.Mockito.never;
8   import static org.mockito.Mockito.verify;
9   import static org.mockito.Mockito.when;
10  
11  import de.dlr.shepard.auth.users.entities.User;
12  import de.dlr.shepard.auth.users.services.UserService;
13  import de.dlr.shepard.common.exceptions.InvalidBodyException;
14  import de.dlr.shepard.common.neo4j.io.BasicEntityIO;
15  import de.dlr.shepard.common.search.endpoints.BasicCollectionAttributes;
16  import de.dlr.shepard.common.search.io.CollectionSearchParams;
17  import de.dlr.shepard.common.search.io.CollectionSearchResult;
18  import de.dlr.shepard.common.search.io.QueryType;
19  import de.dlr.shepard.common.search.io.ResponseBody;
20  import de.dlr.shepard.common.search.io.ResultTriple;
21  import de.dlr.shepard.common.search.io.SearchBody;
22  import de.dlr.shepard.common.search.io.SearchParams;
23  import de.dlr.shepard.common.search.io.SearchScope;
24  import de.dlr.shepard.context.collection.entities.Collection;
25  import de.dlr.shepard.context.collection.entities.DataObject;
26  import de.dlr.shepard.context.collection.io.CollectionIO;
27  import de.dlr.shepard.context.references.basicreference.entities.BasicReference;
28  import de.dlr.shepard.context.references.structureddata.entities.StructuredDataReference;
29  import io.quarkus.test.InjectMock;
30  import io.quarkus.test.component.QuarkusComponentTest;
31  import jakarta.inject.Inject;
32  import java.util.ArrayList;
33  import java.util.List;
34  import java.util.Optional;
35  import org.junit.jupiter.api.Test;
36  
37  @QuarkusComponentTest
38  public class SearchServiceTest {
39  
40    @InjectMock
41    StructuredDataSearchService structuredDataSearcher;
42  
43    @InjectMock
44    CollectionSearchService collectionSearcher;
45  
46    @InjectMock
47    DataObjectSearchService dataObjectSearcher;
48  
49    @InjectMock
50    ReferenceSearchService referenceSearcher;
51  
52    @Inject
53    SearchService searcher;
54  
55    @InjectMock
56    UserService userService;
57  
58    private final User user = new User("Testuser");
59  
60    @Test
61    public void invalidQueryTest() {
62      SearchScope[] scopes = { new SearchScope() };
63      var params = new SearchParams("match invalid", QueryType.Collection);
64      var searchBody = new SearchBody(scopes, params);
65  
66      when(userService.getCurrentUser()).thenReturn(user);
67  
68      assertThrows(InvalidBodyException.class, () -> searcher.search(searchBody));
69      verify(collectionSearcher, never()).search(
70        searchBody.getSearchParams().getQuery(),
71        Optional.empty(),
72        Optional.empty(),
73        BasicCollectionAttributes.createdAt,
74        false
75      );
76    }
77  
78    @Test
79    public void collectionSearchTest() {
80      SearchScope[] scopes = { new SearchScope() };
81      var params = new SearchParams("{}", QueryType.Collection);
82      var searchBody = new SearchBody(scopes, params);
83      Collection collection = new Collection(1L);
84      collection.setShepardId(collection.getId());
85      List<CollectionIO> results = List.of(new CollectionIO(collection));
86      var collectionSearchResultMock = new CollectionSearchResult(
87        results,
88        new CollectionSearchParams(params.getQuery()),
89        0
90      );
91  
92      List<Collection> mockCollectionList = new ArrayList<Collection>();
93      mockCollectionList.add(collection);
94  
95      PaginatedCollectionList paginatedCollectionListMock = new PaginatedCollectionList(
96        mockCollectionList,
97        1,
98        params.getQuery(),
99        Optional.empty(),
100       Optional.empty(),
101       BasicCollectionAttributes.createdAt,
102       true
103     );
104 
105     when(userService.getCurrentUser()).thenReturn(user);
106     when(collectionSearcher.search(anyString(), any(), any(), any(), any())).thenReturn(paginatedCollectionListMock);
107     ResponseBody actual = searcher.search(searchBody);
108     assertEquals(collectionSearchResultMock.toResponseBody(), actual);
109   }
110 
111   @Test
112   public void dataObjectSearchTest() {
113     SearchScope[] scopes = { new SearchScope() };
114     var params = new SearchParams("{}", QueryType.DataObject);
115     var searchBody = new SearchBody(scopes, params);
116     ResultTriple[] resultTriples = { new ResultTriple(1L) };
117     DataObject dataObject = new DataObject(1L);
118     dataObject.setShepardId(dataObject.getId());
119     BasicEntityIO[] results = { new BasicEntityIO(dataObject) };
120     var expected = new ResponseBody(resultTriples, results, params);
121 
122     when(userService.getCurrentUser()).thenReturn(user);
123     when(dataObjectSearcher.search(searchBody)).thenReturn(expected);
124 
125     ResponseBody actual = searcher.search(searchBody);
126     assertEquals(expected, actual);
127   }
128 
129   @Test
130   public void referenceSearchTest() {
131     SearchScope[] scopes = { new SearchScope() };
132     var params = new SearchParams("{}", QueryType.Reference);
133     var searchBody = new SearchBody(scopes, params);
134     ResultTriple[] resultTriples = { new ResultTriple(1L) };
135     BasicReference reference = new BasicReference(1L);
136     reference.setShepardId(reference.getId());
137     BasicEntityIO[] results = { new BasicEntityIO(reference) };
138     var expected = new ResponseBody(resultTriples, results, params);
139 
140     when(referenceSearcher.search(searchBody)).thenReturn(expected);
141     when(userService.getCurrentUser()).thenReturn(user);
142 
143     ResponseBody actual = searcher.search(searchBody);
144     assertEquals(expected, actual);
145   }
146 
147   @Test
148   public void structuredDataSearchTest() {
149     SearchScope[] scopes = { new SearchScope() };
150     var params = new SearchParams("{}", QueryType.StructuredData);
151     var searchBody = new SearchBody(scopes, params);
152     ResultTriple[] resultTriples = { new ResultTriple(1L) };
153     StructuredDataReference reference = new StructuredDataReference(1L);
154     reference.setShepardId(reference.getId());
155     BasicEntityIO[] results = { new BasicEntityIO(reference) };
156     var expected = new ResponseBody(resultTriples, results, params);
157 
158     when(structuredDataSearcher.search(searchBody)).thenReturn(expected);
159     when(userService.getCurrentUser()).thenReturn(user);
160 
161     ResponseBody actual = searcher.search(searchBody);
162     assertEquals(expected, actual);
163   }
164 }