5
5
namespace Jenssegers \Mongodb \Tests \Query ;
6
6
7
7
use DateTimeImmutable ;
8
+ use Illuminate \Database \Eloquent \Collection ;
8
9
use Illuminate \Tests \Database \DatabaseQueryBuilderTest ;
9
10
use Jenssegers \Mongodb \Connection ;
10
11
use Jenssegers \Mongodb \Query \Builder ;
@@ -124,13 +125,142 @@ function (Builder $builder) {
124
125
->orderBy ('score ' , ['$meta ' => 'textScore ' ]),
125
126
];
126
127
128
+ /** @see DatabaseQueryBuilderTest::testWhereBetweens() */
129
+ yield 'whereBetween array of numbers ' => [
130
+ ['find ' => [['id ' => ['$gte ' => 1 , '$lte ' => 2 ]], []]],
131
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , [1 , 2 ]),
132
+ ];
133
+
134
+ yield 'whereBetween nested array of numbers ' => [
135
+ ['find ' => [['id ' => ['$gte ' => [1 ], '$lte ' => [2 , 3 ]]], []]],
136
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , [[1 ], [2 , 3 ]]),
137
+ ];
138
+
139
+ $ period = now ()->toPeriod (now ()->addMonth ());
140
+ yield 'whereBetween CarbonPeriod ' => [
141
+ ['find ' => [
142
+ ['created_at ' => ['$gte ' => new UTCDateTime ($ period ->start ), '$lte ' => new UTCDateTime ($ period ->end )]],
143
+ [], // options
144
+ ]],
145
+ fn (Builder $ builder ) => $ builder ->whereBetween ('created_at ' , $ period ),
146
+ ];
147
+
148
+ yield 'whereBetween collection ' => [
149
+ ['find ' => [['id ' => ['$gte ' => 1 , '$lte ' => 2 ]], []]],
150
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , collect ([1 , 2 ])),
151
+ ];
152
+
153
+ /** @see DatabaseQueryBuilderTest::testOrWhereBetween() */
154
+ yield 'orWhereBetween array of numbers ' => [
155
+ ['find ' => [
156
+ ['$or ' => [
157
+ ['id ' => 1 ],
158
+ ['id ' => ['$gte ' => 3 , '$lte ' => 5 ]],
159
+ ]],
160
+ [], // options
161
+ ]],
162
+ fn (Builder $ builder ) => $ builder
163
+ ->where ('id ' , '= ' , 1 )
164
+ ->orWhereBetween ('id ' , [3 , 5 ]),
165
+ ];
166
+
167
+ /** @link https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#arrays */
168
+ yield 'orWhereBetween nested array of numbers ' => [
169
+ ['find ' => [
170
+ ['$or ' => [
171
+ ['id ' => 1 ],
172
+ ['id ' => ['$gte ' => [4 ], '$lte ' => [6 , 8 ]]],
173
+ ]],
174
+ [], // options
175
+ ]],
176
+ fn (Builder $ builder ) => $ builder
177
+ ->where ('id ' , '= ' , 1 )
178
+ ->orWhereBetween ('id ' , [[4 ], [6 , 8 ]]),
179
+ ];
180
+
181
+ yield 'orWhereBetween collection ' => [
182
+ ['find ' => [
183
+ ['$or ' => [
184
+ ['id ' => 1 ],
185
+ ['id ' => ['$gte ' => 3 , '$lte ' => 4 ]],
186
+ ]],
187
+ [], // options
188
+ ]],
189
+ fn (Builder $ builder ) => $ builder
190
+ ->where ('id ' , '= ' , 1 )
191
+ ->orWhereBetween ('id ' , collect ([3 , 4 ])),
192
+ ];
193
+
194
+ yield 'whereNotBetween array of numbers ' => [
195
+ ['find ' => [
196
+ ['$or ' => [
197
+ ['id ' => ['$lte ' => 1 ]],
198
+ ['id ' => ['$gte ' => 2 ]],
199
+ ]],
200
+ [], // options
201
+ ]],
202
+ fn (Builder $ builder ) => $ builder ->whereNotBetween ('id ' , [1 , 2 ]),
203
+ ];
204
+
205
+ /** @see DatabaseQueryBuilderTest::testOrWhereNotBetween() */
206
+ yield 'orWhereNotBetween array of numbers ' => [
207
+ ['find ' => [
208
+ ['$or ' => [
209
+ ['id ' => 1 ],
210
+ ['$or ' => [
211
+ ['id ' => ['$lte ' => 3 ]],
212
+ ['id ' => ['$gte ' => 5 ]],
213
+ ]],
214
+ ]],
215
+ [], // options
216
+ ]],
217
+ fn (Builder $ builder ) => $ builder
218
+ ->where ('id ' , '= ' , 1 )
219
+ ->orWhereNotBetween ('id ' , [3 , 5 ]),
220
+ ];
221
+
222
+ yield 'orWhereNotBetween nested array of numbers ' => [
223
+ ['find ' => [
224
+ ['$or ' => [
225
+ ['id ' => 1 ],
226
+ ['$or ' => [
227
+ ['id ' => ['$lte ' => [2 , 3 ]]],
228
+ ['id ' => ['$gte ' => [5 ]]],
229
+ ]],
230
+ ]],
231
+ [], // options
232
+ ]],
233
+ fn (Builder $ builder ) => $ builder
234
+ ->where ('id ' , '= ' , 1 )
235
+ ->orWhereNotBetween ('id ' , [[2 , 3 ], [5 ]]),
236
+ ];
237
+
238
+ yield 'orWhereNotBetween collection ' => [
239
+ ['find ' => [
240
+ ['$or ' => [
241
+ ['id ' => 1 ],
242
+ ['$or ' => [
243
+ ['id ' => ['$lte ' => 3 ]],
244
+ ['id ' => ['$gte ' => 4 ]],
245
+ ]],
246
+ ]],
247
+ [], // options
248
+ ]],
249
+ fn (Builder $ builder ) => $ builder
250
+ ->where ('id ' , '= ' , 1 )
251
+ ->orWhereNotBetween ('id ' , collect ([3 , 4 ])),
252
+ ];
253
+
127
254
yield 'distinct ' => [
128
255
['distinct ' => ['foo ' , [], []]],
129
256
fn (Builder $ builder ) => $ builder ->distinct ('foo ' ),
130
257
];
131
258
132
259
yield 'groupBy ' => [
133
- ['aggregate ' => [[['$group ' => ['_id ' => ['foo ' => '$foo ' ], 'foo ' => ['$last ' => '$foo ' ]]]], []]],
260
+ ['aggregate ' => [
261
+ [['$group ' => ['_id ' => ['foo ' => '$foo ' ], 'foo ' => ['$last ' => '$foo ' ]]]],
262
+ [], // options
263
+ ]],
134
264
fn (Builder $ builder ) => $ builder ->groupBy ('foo ' ),
135
265
];
136
266
}
@@ -154,6 +284,37 @@ public static function provideExceptions(): iterable
154
284
'Order direction must be "asc" or "desc" ' ,
155
285
fn (Builder $ builder ) => $ builder ->orderBy ('_id ' , 'dasc ' ),
156
286
];
287
+
288
+ /** @see DatabaseQueryBuilderTest::testWhereBetweens */
289
+ yield 'whereBetween array too short ' => [
290
+ \InvalidArgumentException::class,
291
+ 'Between $values must be a list with exactly two elements: [min, max] ' ,
292
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , [1 ]),
293
+ ];
294
+
295
+ yield 'whereBetween array too short (nested) ' => [
296
+ \InvalidArgumentException::class,
297
+ 'Between $values must be a list with exactly two elements: [min, max] ' ,
298
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , [[1 , 2 ]]),
299
+ ];
300
+
301
+ yield 'whereBetween array too long ' => [
302
+ \InvalidArgumentException::class,
303
+ 'Between $values must be a list with exactly two elements: [min, max] ' ,
304
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , [1 , 2 , 3 ]),
305
+ ];
306
+
307
+ yield 'whereBetween collection too long ' => [
308
+ \InvalidArgumentException::class,
309
+ 'Between $values must be a list with exactly two elements: [min, max] ' ,
310
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , new Collection ([1 , 2 , 3 ])),
311
+ ];
312
+
313
+ yield 'whereBetween array is not a list ' => [
314
+ \InvalidArgumentException::class,
315
+ 'Between $values must be a list with exactly two elements: [min, max] ' ,
316
+ fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , ['min ' => 1 , 'max ' => 2 ]),
317
+ ];
157
318
}
158
319
159
320
/** @dataProvider getEloquentMethodsNotSupported */
0 commit comments