|
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,6 +125,122 @@ 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 | + /* |
| 135 | + yield 'whereBetween excessive nested array of numbers' => [ |
| 136 | + ['find' => [['id' => ['$gte' => 1, '$lte' => 2]], []], |
| 137 | + fn (Builder $builder) => $builder->whereBetween('id', [[1, 2, 3]]), |
| 138 | + ]; |
| 139 | +
|
| 140 | + yield 'whereBetween nested array of numbers' => [ |
| 141 | + ['find' => [['id' => ['$gte' => 1, '$lte' => 2]], []]], |
| 142 | + fn (Builder $builder) => $builder->whereBetween('id', [[1], [2, 3]]), |
| 143 | + ]; |
| 144 | + */ |
| 145 | + |
| 146 | + yield 'whereNotBetween array of numbers' => [ |
| 147 | + ['find' => [['$or' => [['id' => ['$lte' => 1]], ['id' => ['$gte' => 2]]]], []]], |
| 148 | + fn (Builder $builder) => $builder->whereNotBetween('id', [1, 2]), |
| 149 | + ]; |
| 150 | + |
| 151 | + $period = now()->toPeriod(now()->addDay()); |
| 152 | + yield 'whereBetween CarbonPeriod' => [ |
| 153 | + ['find' => [['created_at' => ['$gte' => new UTCDateTime($period->start), '$lte' => new UTCDateTime($period->end)]], []]], |
| 154 | + fn (Builder $builder) => $builder->whereBetween('created_at', $period), |
| 155 | + ]; |
| 156 | + |
| 157 | + $period = now()->toPeriod(now()->addMonth()); |
| 158 | + yield 'custom long carbon period date' => [ |
| 159 | + ['find' => [['created_at' => ['$gte' => new UTCDateTime($period->start), '$lte' => new UTCDateTime($period->end)]], []]], |
| 160 | + fn (Builder $builder) => $builder->whereBetween('created_at', $period), |
| 161 | + ]; |
| 162 | + |
| 163 | + yield 'whereBetween collection' => [ |
| 164 | + ['find' => [['id' => ['$gte' => 1, '$lte' => 2]], []]], |
| 165 | + fn (Builder $builder) => $builder->whereBetween('id', collect([1, 2])), |
| 166 | + ]; |
| 167 | + |
| 168 | + /** @see DatabaseQueryBuilderTest::testOrWhereBetween() */ |
| 169 | + yield 'whereBetween array numbers' => [ |
| 170 | + ['find' => [['$or' => [['id' => 1], ['id' => ['$gte' => 3, '$lte' => 5]]]], []]], |
| 171 | + fn (Builder $builder) => $builder |
| 172 | + ->where('id', '=', 1) |
| 173 | + ->orWhereBetween('id', [3, 5]), |
| 174 | + ]; |
| 175 | + |
| 176 | + /* |
| 177 | + yield 'whereBetween excessive nested array numbers' => [ |
| 178 | + ['find' => [['$or' => [['id' => 1], ['id' => ['$gte' => 3, '$lte' => 4]]]], []], |
| 179 | + fn (Builder $builder) => $builder |
| 180 | + ->where('id', '=', 1) |
| 181 | + ->orWhereBetween('id', [[3, 4, 5]]), |
| 182 | + ]; |
| 183 | +
|
| 184 | + yield 'orWhereBetween nested array numbers' => [ |
| 185 | + ['find' => [['$or' => [['id' => 1], ['id' => ['$gte' => 3, '$lte' => 5]]]], []], |
| 186 | + fn (Builder $builder) => $builder |
| 187 | + ->where('id', '=', 1) |
| 188 | + ->orWhereBetween('id', [[3, 5]]), |
| 189 | + ]; |
| 190 | +
|
| 191 | + yield 'orWhereBetween nested excessive array numbers' => [ |
| 192 | + ['find' => [['$or' => [['id' => 1], ['id' => ['$gte' => 4, '$lte' => 6]]]], []], |
| 193 | + fn (Builder $builder) => $builder |
| 194 | + ->where('id', '=', 1) |
| 195 | + ->orWhereBetween('id', [[4], [6, 8]]), |
| 196 | + ]; |
| 197 | + */ |
| 198 | + |
| 199 | + yield 'orWhereBetween collection' => [ |
| 200 | + ['find' => [['$or' => [['id' => 1], ['id' => ['$gte' => 3, '$lte' => 4]]]], []]], |
| 201 | + fn (Builder $builder) => $builder |
| 202 | + ->where('id', '=', 1) |
| 203 | + ->orWhereBetween('id', collect([3, 4])), |
| 204 | + ]; |
| 205 | + |
| 206 | + /** @see DatabaseQueryBuilderTest::testOrWhereNotBetween() */ |
| 207 | + yield 'orWhereNotBetween array of numbers' => [ |
| 208 | + ['find' => [['$or' => [['id' => 1], ['$or' => [['id' => ['$lte' => 3]], ['id' => ['$gte' => 5]]]]]], []]], |
| 209 | + fn (Builder $builder) => $builder |
| 210 | + ->where('id', '=', 1) |
| 211 | + ->orWhereNotBetween('id', [3, 5]), |
| 212 | + ]; |
| 213 | + |
| 214 | + /* |
| 215 | + yield 'orWhereNotBetween excessive array of numbers' => [ |
| 216 | + ['find' => [['$or' => [['id' => 1], ['$or' => [['id' => ['$lte' => 3]], ['id' => ['$gte' => 4]]]]]], []], |
| 217 | + fn (Builder $builder) => $builder |
| 218 | + ->where('id', '=', 1) |
| 219 | + ->orWhereNotBetween('id', [[3, 4, 5]]), |
| 220 | + ]; |
| 221 | +
|
| 222 | + yield 'orWhereNotBetween nested array of numbers' => [ |
| 223 | + ['find' => [['$or' => [['id' => 1], ['$or' => [['id' => ['$lte' => 3]], ['id' => ['$gte' => 5]]]]]], []], |
| 224 | + fn (Builder $builder) => $builder |
| 225 | + ->where('id', '=', 1) |
| 226 | + ->orWhereNotBetween('id', [[3, 5]]), |
| 227 | + ]; |
| 228 | + */ |
| 229 | + |
| 230 | + yield 'orWhereNotBetween excessive nested array of numbers' => [ |
| 231 | + ['find' => [['$or' => [['id' => 1], ['$or' => [['id' => ['$lte' => [4]]], ['id' => ['$gte' => [6, 8]]]]]]]]], |
| 232 | + fn (Builder $builder) => $builder |
| 233 | + ->where('id', '=', 1) |
| 234 | + ->orWhereNotBetween('id', [[4], [6, 8]]), |
| 235 | + ]; |
| 236 | + |
| 237 | + yield 'orWhereNotBetween collection' => [ |
| 238 | + ['find' => [['$or' => [['id' => 1], ['$or' => [['id' => ['$lte' => 3]], ['id' => ['$gte' => 4]]]]]], []]], |
| 239 | + fn (Builder $builder) => $builder |
| 240 | + ->where('id', '=', 1) |
| 241 | + ->orWhereNotBetween('id', collect([3, 4])), |
| 242 | + ]; |
| 243 | + |
127 | 244 | yield 'distinct' => [
|
128 | 245 | ['distinct' => ['foo', [], []]],
|
129 | 246 | fn (Builder $builder) => $builder->distinct('foo'),
|
@@ -154,6 +271,32 @@ public static function provideExceptions(): iterable
|
154 | 271 | 'Order direction must be "asc" or "desc"',
|
155 | 272 | fn (Builder $builder) => $builder->orderBy('_id', 'dasc'),
|
156 | 273 | ];
|
| 274 | + |
| 275 | + /** @see DatabaseQueryBuilderTest::testWhereBetweens */ |
| 276 | + yield 'whereBetween array too short' => [ |
| 277 | + \InvalidArgumentException::class, |
| 278 | + 'Between array must have 2 elements: [min, max]', |
| 279 | + fn (Builder $builder) => $builder->whereBetween('id', [1]), |
| 280 | + ]; |
| 281 | + |
| 282 | + yield 'whereBetween array too long' => [ |
| 283 | + \InvalidArgumentException::class, |
| 284 | + 'Between array must have 2 elements: [min, max]', |
| 285 | + fn (Builder $builder) => $builder->whereBetween('id', [1, 2, 3]), |
| 286 | + ]; |
| 287 | + |
| 288 | + yield 'whereBetween collection too long' => [ |
| 289 | + \InvalidArgumentException::class, |
| 290 | + 'Between array must have 2 elements: [min, max]', |
| 291 | + fn (Builder $builder) => $builder->whereBetween('id', new Collection([1, 2, 3])), |
| 292 | + ]; |
| 293 | + |
| 294 | + yield 'whereBetween array is not a list' => [ |
| 295 | + \InvalidArgumentException::class, |
| 296 | + 'Between array must a list with 2 elements: [min, max]', |
| 297 | + fn (Builder $builder) => $builder->whereBetween('id', ['min' => 1, 'max' => 2]), |
| 298 | + ]; |
| 299 | + |
157 | 300 | }
|
158 | 301 |
|
159 | 302 | private static function getBuilder(): Builder
|
|
0 commit comments