1
+ package com .arangodb .graphql .create ;
2
+
3
+ import com .arangodb .ArangoCollection ;
4
+ import com .arangodb .ArangoDB ;
5
+ import com .arangodb .ArangoDatabase ;
6
+ import com .arangodb .entity .CollectionType ;
7
+ import com .arangodb .model .CollectionCreateOptions ;
8
+ import com .arangodb .model .HashIndexOptions ;
9
+ import graphql .schema .*;
10
+ import org .junit .Before ;
11
+ import org .junit .Test ;
12
+ import org .junit .runner .RunWith ;
13
+ import org .mockito .ArgumentCaptor ;
14
+ import org .mockito .ArgumentMatchers ;
15
+ import org .mockito .Mock ;
16
+ import org .mockito .junit .MockitoJUnitRunner ;
17
+
18
+ import java .util .Arrays ;
19
+
20
+ import static graphql .Scalars .GraphQLString ;
21
+ import static org .hamcrest .Matchers .*;
22
+ import static org .hamcrest .core .IsEqual .equalTo ;
23
+ import static org .junit .Assert .*;
24
+ import static org .mockito .Mockito .*;
25
+
26
+ @ RunWith (MockitoJUnitRunner .class )
27
+ public class DatabaseObjectCreatorTest {
28
+
29
+ @ Mock
30
+ private ArangoDB arangoDB ;
31
+
32
+ @ Mock
33
+ private GraphQLSchema graphQLSchema ;
34
+
35
+ @ Mock
36
+ private ArangoDatabase arangoDatabase ;
37
+
38
+ @ Mock
39
+ private GraphQLObjectType mockType ;
40
+
41
+ @ Mock
42
+ private GraphQLDirective mockDirective ;
43
+
44
+ @ Mock
45
+ private GraphQLDirective mockEdgeDirective ;
46
+
47
+ @ Mock
48
+ private GraphQLArgument mockArgument ;
49
+
50
+ @ Mock
51
+ private ArangoCollection mockCollection ;
52
+
53
+ @ Mock
54
+ private ArangoCollection mockEdgeCollection ;
55
+
56
+ @ Mock
57
+ private GraphQLFieldDefinition mockFieldDefinition ;
58
+
59
+ @ Mock
60
+ private GraphQLArgument mockEdgeArgument ;
61
+
62
+ @ Mock
63
+ private GraphQLObjectType mockQueryType ;
64
+
65
+ @ Mock
66
+ private GraphQLFieldDefinition mockQueryFieldDefinition ;
67
+
68
+ @ Mock
69
+ private GraphQLArgument mockMandatoryArgument ;
70
+
71
+ @ Mock
72
+ private GraphQLArgument mockOptionalArgument ;
73
+
74
+ private String databaseName = "myDatabase" ;
75
+
76
+ private String collectionName = "myCollection" ;
77
+
78
+ private String edgeCollectionName = "myEdgeCollection" ;
79
+
80
+ private DatabaseObjectCreator databaseObjectCreator ;
81
+ private String mandatoryArgumentName = "mandatoryArg" ;
82
+ private String optionalArgumentName = "optionalArg" ;
83
+
84
+ private void attachVertexDirectiveToMockType () {
85
+ when (mockType .getDirective ("vertex" )).thenReturn (mockDirective );
86
+ when (mockDirective .getArgument ("collection" )).thenReturn (mockArgument );
87
+ when (mockArgument .getValue ()).thenReturn (collectionName );
88
+ }
89
+
90
+ private void attachEdgeDirectiveToMockType () {
91
+ attachVertexDirectiveToMockType ();
92
+
93
+ when (mockFieldDefinition .getDirective ("edge" )).thenReturn (mockEdgeDirective );
94
+ when (mockEdgeDirective .getArgument ("collection" )).thenReturn (mockEdgeArgument );
95
+ when (mockEdgeArgument .getValue ()).thenReturn (edgeCollectionName );
96
+ }
97
+
98
+ @ Before
99
+ public void setup () {
100
+ //Arango
101
+ when (arangoDB .db (databaseName )).thenReturn (arangoDatabase );
102
+ when (arangoDatabase .collection (collectionName )).thenReturn (mockCollection );
103
+ when (arangoDatabase .collection (edgeCollectionName )).thenReturn (mockEdgeCollection );
104
+
105
+ //GraphQL Schema
106
+ when (graphQLSchema .getAllTypesAsList ()).thenReturn (Arrays .asList (mockType ));
107
+ when (graphQLSchema .getQueryType ()).thenReturn (mockQueryType );
108
+ when (mockQueryType .getFieldDefinitions ()).thenReturn (Arrays .asList (mockQueryFieldDefinition ));
109
+ when (mockQueryFieldDefinition .getType ()).thenReturn (mockType );
110
+ when (mockMandatoryArgument .getName ()).thenReturn (mandatoryArgumentName );
111
+ when (mockMandatoryArgument .getType ()).thenReturn (new GraphQLNonNull (GraphQLString ));
112
+ when (mockOptionalArgument .getName ()).thenReturn (optionalArgumentName );
113
+
114
+
115
+ //Type Setup
116
+ when (mockType .getFieldDefinitions ()).thenReturn (Arrays .asList (mockFieldDefinition ));
117
+
118
+ databaseObjectCreator = new DatabaseObjectCreator (arangoDB , databaseName , graphQLSchema );
119
+ }
120
+
121
+ @ Test
122
+ public void createDatabase () {
123
+ when (arangoDatabase .exists ()).thenReturn (false );
124
+ databaseObjectCreator .createDatabase ();
125
+ verify (arangoDatabase ).create ();
126
+ }
127
+
128
+ @ Test
129
+ public void doNotCreateExistingDatabase () {
130
+ when (arangoDatabase .exists ()).thenReturn (true );
131
+ databaseObjectCreator .createDatabase ();
132
+ verify (arangoDatabase , never ()).create ();
133
+ }
134
+
135
+ @ Test
136
+ public void createCollectionForVertexDirectiveType () {
137
+ attachVertexDirectiveToMockType ();
138
+ when (mockCollection .exists ()).thenReturn (false );
139
+
140
+ databaseObjectCreator .createCollections ();
141
+
142
+ ArgumentCaptor <CollectionCreateOptions > captor = ArgumentCaptor .forClass (CollectionCreateOptions .class );
143
+ verify (mockCollection ).create (captor .capture ());
144
+ assertThat (captor .getValue ().getType (), equalTo (CollectionType .DOCUMENT ));
145
+
146
+ }
147
+
148
+ @ Test
149
+ public void doNotCreateExistingCollectionForVertexDirectiveType () {
150
+ attachVertexDirectiveToMockType ();
151
+ when (mockCollection .exists ()).thenReturn (true );
152
+
153
+ databaseObjectCreator .createCollections ();
154
+
155
+ verify (mockCollection , never ()).create (ArgumentMatchers .any (CollectionCreateOptions .class ));
156
+
157
+ }
158
+
159
+ @ Test
160
+ public void doNotCreateCollectionForTypeWithNoDirective () {
161
+
162
+ databaseObjectCreator .createCollections ();
163
+ verify (mockCollection , never ()).create (ArgumentMatchers .any (CollectionCreateOptions .class ));
164
+
165
+ }
166
+
167
+ @ Test
168
+ public void createCollectionForEdgeDirectiveType () {
169
+ attachEdgeDirectiveToMockType ();
170
+
171
+ when (mockEdgeCollection .exists ()).thenReturn (false );
172
+
173
+ databaseObjectCreator .createCollections ();
174
+
175
+ ArgumentCaptor <CollectionCreateOptions > captor = ArgumentCaptor .forClass (CollectionCreateOptions .class );
176
+ verify (mockEdgeCollection ).create (captor .capture ());
177
+ assertThat (captor .getValue ().getType (), equalTo (CollectionType .EDGES ));
178
+
179
+ }
180
+
181
+ @ Test
182
+ public void doNotCreateExistingCollectionForEdgeDirectiveType () {
183
+ attachEdgeDirectiveToMockType ();
184
+
185
+ when (mockEdgeCollection .exists ()).thenReturn (true );
186
+
187
+ databaseObjectCreator .createCollections ();
188
+
189
+ verify (mockEdgeCollection , never ()).create (ArgumentMatchers .any (CollectionCreateOptions .class ));
190
+
191
+ }
192
+
193
+ @ Test
194
+ public void doNotCreateCollectionForFieldWithNoEdgeDirectiveType () {
195
+ attachVertexDirectiveToMockType ();
196
+
197
+ databaseObjectCreator .createCollections ();
198
+
199
+ verify (mockEdgeCollection , never ()).create (ArgumentMatchers .any (CollectionCreateOptions .class ));
200
+
201
+ }
202
+
203
+ @ Test
204
+ public void createIndexes () {
205
+ attachVertexDirectiveToMockType ();
206
+ when (mockQueryFieldDefinition .getArguments ()).thenReturn (Arrays .asList (mockMandatoryArgument , mockOptionalArgument ));
207
+
208
+ databaseObjectCreator .createIndexes ();
209
+
210
+ ArgumentCaptor <Iterable <String >> captor = ArgumentCaptor .forClass (Iterable .class );
211
+
212
+ verify (mockCollection ).ensureHashIndex (captor .capture (), ArgumentMatchers .any (HashIndexOptions .class ));
213
+
214
+ assertThat (captor .getValue (), contains (mandatoryArgumentName , optionalArgumentName ));
215
+
216
+ }
217
+
218
+ @ Test
219
+ public void createIndexesWithOptionalFirstArg () {
220
+ attachVertexDirectiveToMockType ();
221
+ when (mockQueryFieldDefinition .getArguments ()).thenReturn (Arrays .asList (mockOptionalArgument , mockMandatoryArgument ));
222
+
223
+ databaseObjectCreator .createIndexes ();
224
+
225
+ ArgumentCaptor <Iterable <String >> captor = ArgumentCaptor .forClass (Iterable .class );
226
+
227
+ verify (mockCollection ).ensureHashIndex (captor .capture (), ArgumentMatchers .any (HashIndexOptions .class ));
228
+
229
+ assertThat (captor .getValue (), contains (mandatoryArgumentName , optionalArgumentName ));
230
+
231
+ }
232
+
233
+ @ Test
234
+ public void createIndexesWithNoMandatoryArgs () {
235
+ attachVertexDirectiveToMockType ();
236
+ when (mockQueryFieldDefinition .getArguments ()).thenReturn (Arrays .asList (mockOptionalArgument ));
237
+
238
+ databaseObjectCreator .createIndexes ();
239
+
240
+ ArgumentCaptor <Iterable <String >> captor = ArgumentCaptor .forClass (Iterable .class );
241
+
242
+ verify (mockCollection ).ensureHashIndex (captor .capture (), ArgumentMatchers .any (HashIndexOptions .class ));
243
+
244
+ assertThat (captor .getValue (), hasItem (optionalArgumentName ));
245
+
246
+ }
247
+
248
+
249
+ }
0 commit comments