12
12
import org .opensearch .ResourceNotFoundException ;
13
13
import org .opensearch .action .DocWriteResponse ;
14
14
import org .opensearch .action .delete .DeleteRequest ;
15
+ import org .opensearch .action .index .IndexRequest ;
16
+ import org .opensearch .action .index .IndexResponse ;
15
17
import org .opensearch .action .search .SearchRequestBuilder ;
16
18
import org .opensearch .action .search .SearchResponse ;
17
19
import org .opensearch .action .support .clustermanager .AcknowledgedResponse ;
25
27
import org .opensearch .core .index .shard .ShardId ;
26
28
import org .opensearch .index .engine .DocumentMissingException ;
27
29
import org .opensearch .index .query .QueryBuilder ;
30
+ import org .opensearch .rule .CreateRuleRequest ;
31
+ import org .opensearch .rule .CreateRuleResponse ;
28
32
import org .opensearch .rule .DeleteRuleRequest ;
29
33
import org .opensearch .rule .GetRuleRequest ;
30
34
import org .opensearch .rule .GetRuleResponse ;
39
43
import org .opensearch .threadpool .ThreadPool ;
40
44
import org .opensearch .transport .client .Client ;
41
45
46
+ import java .io .IOException ;
42
47
import java .util .HashMap ;
48
+ import java .util .Map ;
49
+ import java .util .Set ;
43
50
44
51
import org .mockito .ArgumentCaptor ;
45
52
46
53
import static org .opensearch .rule .XContentRuleParserTests .VALID_JSON ;
54
+ import static org .opensearch .rule .utils .RuleTestUtils .ATTRIBUTE_VALUE_ONE ;
55
+ import static org .opensearch .rule .utils .RuleTestUtils .MockRuleAttributes .MOCK_RULE_ATTRIBUTE_ONE ;
47
56
import static org .opensearch .rule .utils .RuleTestUtils .TEST_INDEX_NAME ;
48
57
import static org .opensearch .rule .utils .RuleTestUtils ._ID_ONE ;
49
58
import static org .mockito .ArgumentMatchers .any ;
@@ -61,6 +70,111 @@ public class IndexStoredRulePersistenceServiceTests extends OpenSearchTestCase {
61
70
62
71
public static final int MAX_VALUES_PER_PAGE = 50 ;
63
72
73
+ public void testCreateRuleOnExistingIndex () throws IOException {
74
+ CreateRuleRequest createRuleRequest = mock (CreateRuleRequest .class );
75
+ Rule mockRule = mock (Rule .class );
76
+ when (createRuleRequest .getRule ()).thenReturn (mockRule );
77
+ RuleQueryMapper <QueryBuilder > mockRuleQueryMapper = mock (RuleQueryMapper .class );
78
+ RuleEntityParser mockRuleEntityParser = mock (RuleEntityParser .class );
79
+ ClusterService clusterService = mock (ClusterService .class );
80
+ ClusterState clusterState = mock (ClusterState .class );
81
+ Metadata metadata = mock (Metadata .class );
82
+ QueryBuilder queryBuilder = mock (QueryBuilder .class );
83
+
84
+ when (clusterService .state ()).thenReturn (clusterState );
85
+ when (clusterState .metadata ()).thenReturn (metadata );
86
+ when (metadata .hasIndex (TEST_INDEX_NAME )).thenReturn (true );
87
+ when (mockRuleQueryMapper .from (any (GetRuleRequest .class ))).thenReturn (queryBuilder );
88
+ when (queryBuilder .filter (any ())).thenReturn (queryBuilder );
89
+
90
+ SearchRequestBuilder searchRequestBuilder = mock (SearchRequestBuilder .class );
91
+ Client client = setUpMockClient (searchRequestBuilder );
92
+ RulePersistenceService rulePersistenceService = new IndexStoredRulePersistenceService (
93
+ TEST_INDEX_NAME ,
94
+ client ,
95
+ clusterService ,
96
+ MAX_VALUES_PER_PAGE ,
97
+ mockRuleEntityParser ,
98
+ mockRuleQueryMapper
99
+ );
100
+ ActionListener <CreateRuleResponse > listener = mock (ActionListener .class );
101
+ when (mockRule .toXContent (any (), any ())).thenAnswer (invocation -> invocation .getArgument (0 ));
102
+
103
+ SearchResponse searchResponse = mock (SearchResponse .class );
104
+ when (searchResponse .getHits ()).thenReturn (new SearchHits (new SearchHit [] {}, new TotalHits (0 , TotalHits .Relation .EQUAL_TO ), 1.0f ));
105
+ doAnswer ((invocation ) -> {
106
+ ActionListener <SearchResponse > actionListener = invocation .getArgument (0 );
107
+ actionListener .onResponse (searchResponse );
108
+ return null ;
109
+ }).when (searchRequestBuilder ).execute (any (ActionListener .class ));
110
+
111
+ IndexResponse indexResponse = mock (IndexResponse .class );
112
+ when (indexResponse .getId ()).thenReturn (_ID_ONE );
113
+ doAnswer (invocation -> {
114
+ ActionListener <IndexResponse > actionListener = invocation .getArgument (1 );
115
+ actionListener .onResponse (indexResponse );
116
+ return null ;
117
+ }).when (client ).index (any (IndexRequest .class ), any (ActionListener .class ));
118
+
119
+ rulePersistenceService .createRule (createRuleRequest , listener );
120
+ ArgumentCaptor <CreateRuleResponse > responseCaptor = ArgumentCaptor .forClass (CreateRuleResponse .class );
121
+ verify (listener ).onResponse (responseCaptor .capture ());
122
+ CreateRuleResponse response = responseCaptor .getValue ();
123
+ assertNotNull (response .getRule ());
124
+ }
125
+
126
+ public void testCreateDuplicateRule () {
127
+ CreateRuleRequest createRuleRequest = mock (CreateRuleRequest .class );
128
+ Rule mockRule = mock (Rule .class );
129
+ when (createRuleRequest .getRule ()).thenReturn (mockRule );
130
+
131
+ RuleQueryMapper <QueryBuilder > mockRuleQueryMapper = mock (RuleQueryMapper .class );
132
+ RuleEntityParser mockRuleEntityParser = mock (RuleEntityParser .class );
133
+ ClusterService clusterService = mock (ClusterService .class );
134
+ ClusterState clusterState = mock (ClusterState .class );
135
+ Metadata metadata = mock (Metadata .class );
136
+ QueryBuilder queryBuilder = mock (QueryBuilder .class );
137
+
138
+ when (clusterService .state ()).thenReturn (clusterState );
139
+ when (clusterState .metadata ()).thenReturn (metadata );
140
+ when (metadata .hasIndex (TEST_INDEX_NAME )).thenReturn (true );
141
+ when (mockRuleQueryMapper .from (any (GetRuleRequest .class ))).thenReturn (queryBuilder );
142
+ when (queryBuilder .filter (any ())).thenReturn (queryBuilder );
143
+
144
+ when (mockRule .getAttributeMap ()).thenReturn (Map .of (MOCK_RULE_ATTRIBUTE_ONE , Set .of (ATTRIBUTE_VALUE_ONE )));
145
+ when (mockRule .getFeatureType ()).thenReturn (RuleTestUtils .MockRuleFeatureType .INSTANCE );
146
+
147
+ SearchRequestBuilder searchRequestBuilder = mock (SearchRequestBuilder .class );
148
+ Client client = setUpMockClient (searchRequestBuilder );
149
+
150
+ RulePersistenceService rulePersistenceService = new IndexStoredRulePersistenceService (
151
+ TEST_INDEX_NAME ,
152
+ client ,
153
+ clusterService ,
154
+ MAX_VALUES_PER_PAGE ,
155
+ mockRuleEntityParser ,
156
+ mockRuleQueryMapper
157
+ );
158
+
159
+ SearchResponse searchResponse = mock (SearchResponse .class );
160
+ SearchHit hit = new SearchHit (1 );
161
+ hit .sourceRef (new BytesArray (VALID_JSON ));
162
+ SearchHits searchHits = new SearchHits (new SearchHit [] { hit }, new TotalHits (1 , TotalHits .Relation .EQUAL_TO ), 1.0f );
163
+ when (searchResponse .getHits ()).thenReturn (searchHits );
164
+
165
+ doAnswer ((invocation ) -> {
166
+ ActionListener <SearchResponse > actionListener = invocation .getArgument (0 );
167
+ actionListener .onResponse (searchResponse );
168
+ return null ;
169
+ }).when (searchRequestBuilder ).execute (any (ActionListener .class ));
170
+
171
+ ActionListener <CreateRuleResponse > listener = mock (ActionListener .class );
172
+ when (mockRuleEntityParser .parse (any (String .class ))).thenReturn (mockRule );
173
+ rulePersistenceService .createRule (createRuleRequest , listener );
174
+ ArgumentCaptor <Exception > failureCaptor = ArgumentCaptor .forClass (Exception .class );
175
+ verify (listener ).onFailure (failureCaptor .capture ());
176
+ }
177
+
64
178
public void testGetRuleByIdSuccess () {
65
179
GetRuleRequest getRuleRequest = mock (GetRuleRequest .class );
66
180
when (getRuleRequest .getId ()).thenReturn (_ID_ONE );
@@ -76,10 +190,12 @@ public void testGetRuleByIdSuccess() {
76
190
77
191
SearchRequestBuilder searchRequestBuilder = mock (SearchRequestBuilder .class );
78
192
Client client = setUpMockClient (searchRequestBuilder );
193
+ ClusterService clusterService = mock (ClusterService .class );
79
194
80
195
RulePersistenceService rulePersistenceService = new IndexStoredRulePersistenceService (
81
196
TEST_INDEX_NAME ,
82
197
client ,
198
+ clusterService ,
83
199
MAX_VALUES_PER_PAGE ,
84
200
mockRuleEntityParser ,
85
201
mockRuleQueryMapper
@@ -122,10 +238,12 @@ public void testGetRuleByIdNotFound() {
122
238
123
239
SearchRequestBuilder searchRequestBuilder = mock (SearchRequestBuilder .class );
124
240
Client client = setUpMockClient (searchRequestBuilder );
241
+ ClusterService clusterService = mock (ClusterService .class );
125
242
126
243
RulePersistenceService rulePersistenceService = new IndexStoredRulePersistenceService (
127
244
TEST_INDEX_NAME ,
128
245
client ,
246
+ clusterService ,
129
247
MAX_VALUES_PER_PAGE ,
130
248
mockRuleEntityParser ,
131
249
mockRuleQueryMapper
@@ -176,13 +294,15 @@ public void testDeleteRule_successful() {
176
294
DeleteRuleRequest request = new DeleteRuleRequest (ruleId , RuleTestUtils .MockRuleFeatureType .INSTANCE );
177
295
178
296
Client client = mock (Client .class );
297
+ ClusterService clusterService = mock (ClusterService .class );
179
298
ThreadPool threadPool = mock (ThreadPool .class );
180
299
when (client .threadPool ()).thenReturn (threadPool );
181
300
when (threadPool .getThreadContext ()).thenReturn (new ThreadContext (Settings .EMPTY ));
182
301
183
302
RulePersistenceService rulePersistenceService = new IndexStoredRulePersistenceService (
184
303
TEST_INDEX_NAME ,
185
304
client ,
305
+ clusterService ,
186
306
MAX_VALUES_PER_PAGE ,
187
307
mock (RuleEntityParser .class ),
188
308
mock (RuleQueryMapper .class )
@@ -214,13 +334,15 @@ public void testDeleteRule_notFound() {
214
334
DeleteRuleRequest request = new DeleteRuleRequest (ruleId , RuleTestUtils .MockRuleFeatureType .INSTANCE );
215
335
216
336
Client client = mock (Client .class );
337
+ ClusterService clusterService = mock (ClusterService .class );
217
338
ThreadPool threadPool = mock (ThreadPool .class );
218
339
when (client .threadPool ()).thenReturn (threadPool );
219
340
when (threadPool .getThreadContext ()).thenReturn (new ThreadContext (Settings .EMPTY ));
220
341
221
342
RulePersistenceService rulePersistenceService = new IndexStoredRulePersistenceService (
222
343
TEST_INDEX_NAME ,
223
344
client ,
345
+ clusterService ,
224
346
MAX_VALUES_PER_PAGE ,
225
347
mock (RuleEntityParser .class ),
226
348
mock (RuleQueryMapper .class )
0 commit comments