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 }