|
26 | 26 | use function collect;
|
27 | 27 | use function method_exists;
|
28 | 28 | use function now;
|
| 29 | +use function sprintf; |
29 | 30 | use function var_export;
|
30 | 31 |
|
31 | 32 | class BuilderTest extends TestCase
|
32 | 33 | {
|
33 | 34 | #[DataProvider('provideQueryBuilderToMql')]
|
34 |
| - public function testMql(array $expected, Closure $build): void |
| 35 | + public function testMql(array $expected, Closure $build, ?string $requiredMethod = null): void |
35 | 36 | {
|
| 37 | + if ($requiredMethod && ! method_exists(Builder::class, $requiredMethod)) { |
| 38 | + $this->markTestSkipped(sprintf('Method "%s::%s()" does not exist.', Builder::class, $requiredMethod)); |
| 39 | + } |
| 40 | + |
36 | 41 | $builder = $build(self::getBuilder());
|
37 | 42 | $this->assertInstanceOf(Builder::class, $builder);
|
38 | 43 | $mql = $builder->toMql();
|
@@ -758,6 +763,48 @@ function (Builder $builder) {
|
758 | 763 | fn (Builder $builder) => $builder->where('name', 'like', '_ac__me_'),
|
759 | 764 | ];
|
760 | 765 |
|
| 766 | + yield 'whereLike' => [ |
| 767 | + ['find' => [['name' => new Regex('^1$', 'i')], []]], |
| 768 | + fn |
| 769 | + (Builder $builder) => $builder->whereLike('name', '1'), |
| 770 | + 'whereLike', |
| 771 | + ]; |
| 772 | + |
| 773 | + yield 'whereLike case not sensitive' => [ |
| 774 | + ['find' => [['name' => new Regex('^1$', 'i')], []]], |
| 775 | + fn |
| 776 | + (Builder $builder) => $builder->whereLike('name', '1', false), |
| 777 | + 'whereLike', |
| 778 | + ]; |
| 779 | + |
| 780 | + yield 'whereLike case sensitive' => [ |
| 781 | + ['find' => [['name' => new Regex('^1$', '')], []]], |
| 782 | + fn |
| 783 | + (Builder $builder) => $builder->whereLike('name', '1', true), |
| 784 | + 'whereLike', |
| 785 | + ]; |
| 786 | + |
| 787 | + yield 'whereNotLike' => [ |
| 788 | + ['find' => [['name' => ['$not' => new Regex('^1$', 'i')]], []]], |
| 789 | + fn |
| 790 | + (Builder $builder) => $builder->whereNotLike('name', '1'), |
| 791 | + 'whereNotLike', |
| 792 | + ]; |
| 793 | + |
| 794 | + yield 'whereNotLike case not sensitive' => [ |
| 795 | + ['find' => [['name' => ['$not' => new Regex('^1$', 'i')]], []]], |
| 796 | + fn |
| 797 | + (Builder $builder) => $builder->whereNotLike('name', '1', false), |
| 798 | + 'whereNotLike', |
| 799 | + ]; |
| 800 | + |
| 801 | + yield 'whereNotLike case sensitive' => [ |
| 802 | + ['find' => [['name' => ['$not' => new Regex('^1$', '')]], []]], |
| 803 | + fn |
| 804 | + (Builder $builder) => $builder->whereNotLike('name', '1', true), |
| 805 | + 'whereNotLike', |
| 806 | + ]; |
| 807 | + |
761 | 808 | $regex = new Regex('^acme$', 'si');
|
762 | 809 | yield 'where BSON\Regex' => [
|
763 | 810 | ['find' => [['name' => $regex], []]],
|
@@ -1186,142 +1233,154 @@ function (Builder $elemMatchQuery): void {
|
1186 | 1233 | ];
|
1187 | 1234 |
|
1188 | 1235 | // Method added in Laravel v10.47.0
|
1189 |
| - if (method_exists(Builder::class, 'whereAll')) { |
1190 |
| - /** @see DatabaseQueryBuilderTest::testWhereAll */ |
1191 |
| - yield 'whereAll' => [ |
1192 |
| - [ |
1193 |
| - 'find' => [ |
1194 |
| - ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
1195 |
| - [], // options |
1196 |
| - ], |
| 1236 | + /** @see DatabaseQueryBuilderTest::testWhereAll */ |
| 1237 | + yield 'whereAll' => [ |
| 1238 | + [ |
| 1239 | + 'find' => [ |
| 1240 | + ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
| 1241 | + [], // options |
1197 | 1242 | ],
|
1198 |
| - fn(Builder $builder) => $builder->whereAll(['last_name', 'email'], 'Doe'), |
1199 |
| - ]; |
1200 |
| - |
1201 |
| - yield 'whereAll operator' => [ |
1202 |
| - [ |
1203 |
| - 'find' => [ |
1204 |
| - [ |
1205 |
| - '$and' => [ |
1206 |
| - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1207 |
| - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1208 |
| - ], |
| 1243 | + ], |
| 1244 | + fn |
| 1245 | + (Builder $builder) => $builder->whereAll(['last_name', 'email'], 'Doe'), |
| 1246 | + 'whereAll', |
| 1247 | + ]; |
| 1248 | + |
| 1249 | + yield 'whereAll operator' => [ |
| 1250 | + [ |
| 1251 | + 'find' => [ |
| 1252 | + [ |
| 1253 | + '$and' => [ |
| 1254 | + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
| 1255 | + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1209 | 1256 | ],
|
1210 |
| - [], // options |
1211 | 1257 | ],
|
| 1258 | + [], // options |
1212 | 1259 | ],
|
1213 |
| - fn(Builder $builder) => $builder->whereAll(['last_name', 'email'], 'not like', '%Doe%'), |
1214 |
| - ]; |
1215 |
| - |
1216 |
| - /** @see DatabaseQueryBuilderTest::testOrWhereAll */ |
1217 |
| - yield 'orWhereAll' => [ |
1218 |
| - [ |
1219 |
| - 'find' => [ |
1220 |
| - [ |
1221 |
| - '$or' => [ |
1222 |
| - ['first_name' => 'John'], |
1223 |
| - ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
1224 |
| - ], |
| 1260 | + ], |
| 1261 | + fn |
| 1262 | + (Builder $builder) => $builder->whereAll(['last_name', 'email'], 'not like', '%Doe%'), |
| 1263 | + 'whereAll', |
| 1264 | + ]; |
| 1265 | + |
| 1266 | + /** @see DatabaseQueryBuilderTest::testOrWhereAll */ |
| 1267 | + yield 'orWhereAll' => [ |
| 1268 | + [ |
| 1269 | + 'find' => [ |
| 1270 | + [ |
| 1271 | + '$or' => [ |
| 1272 | + ['first_name' => 'John'], |
| 1273 | + ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
1225 | 1274 | ],
|
1226 |
| - [], // options |
1227 | 1275 | ],
|
| 1276 | + [], // options |
1228 | 1277 | ],
|
1229 |
| - fn(Builder $builder) => $builder |
1230 |
| - ->where('first_name', 'John') |
1231 |
| - ->orWhereAll(['last_name', 'email'], 'Doe'), |
1232 |
| - ]; |
1233 |
| - |
1234 |
| - yield 'orWhereAll operator' => [ |
1235 |
| - [ |
1236 |
| - 'find' => [ |
1237 |
| - [ |
1238 |
| - '$or' => [ |
1239 |
| - ['first_name' => new Regex('^.*John.*$', 'i')], |
1240 |
| - [ |
1241 |
| - '$and' => [ |
1242 |
| - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1243 |
| - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1244 |
| - ], |
| 1278 | + ], |
| 1279 | + fn |
| 1280 | + (Builder $builder) => $builder |
| 1281 | + ->where('first_name', 'John') |
| 1282 | + ->orWhereAll(['last_name', 'email'], 'Doe'), |
| 1283 | + 'orWhereAll', |
| 1284 | + ]; |
| 1285 | + |
| 1286 | + yield 'orWhereAll operator' => [ |
| 1287 | + [ |
| 1288 | + 'find' => [ |
| 1289 | + [ |
| 1290 | + '$or' => [ |
| 1291 | + ['first_name' => new Regex('^.*John.*$', 'i')], |
| 1292 | + [ |
| 1293 | + '$and' => [ |
| 1294 | + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
| 1295 | + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1245 | 1296 | ],
|
1246 | 1297 | ],
|
1247 | 1298 | ],
|
1248 |
| - [], // options |
1249 | 1299 | ],
|
| 1300 | + [], // options |
1250 | 1301 | ],
|
1251 |
| - fn(Builder $builder) => $builder |
1252 |
| - ->where('first_name', 'like', '%John%') |
1253 |
| - ->orWhereAll(['last_name', 'email'], 'not like', '%Doe%'), |
1254 |
| - ]; |
1255 |
| - } |
| 1302 | + ], |
| 1303 | + fn |
| 1304 | + (Builder $builder) => $builder |
| 1305 | + ->where('first_name', 'like', '%John%') |
| 1306 | + ->orWhereAll(['last_name', 'email'], 'not like', '%Doe%'), |
| 1307 | + 'orWhereAll', |
| 1308 | + ]; |
1256 | 1309 |
|
1257 | 1310 | // Method added in Laravel v10.47.0
|
1258 |
| - if (method_exists(Builder::class, 'whereAny')) { |
1259 |
| - /** @see DatabaseQueryBuilderTest::testWhereAny */ |
1260 |
| - yield 'whereAny' => [ |
1261 |
| - [ |
1262 |
| - 'find' => [ |
1263 |
| - ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
1264 |
| - [], // options |
1265 |
| - ], |
| 1311 | + /** @see DatabaseQueryBuilderTest::testWhereAny */ |
| 1312 | + yield 'whereAny' => [ |
| 1313 | + [ |
| 1314 | + 'find' => [ |
| 1315 | + ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
| 1316 | + [], // options |
1266 | 1317 | ],
|
1267 |
| - fn(Builder $builder) => $builder->whereAny(['last_name', 'email'], 'Doe'), |
1268 |
| - ]; |
1269 |
| - |
1270 |
| - yield 'whereAny operator' => [ |
1271 |
| - [ |
1272 |
| - 'find' => [ |
1273 |
| - [ |
1274 |
| - '$or' => [ |
1275 |
| - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1276 |
| - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1277 |
| - ], |
| 1318 | + ], |
| 1319 | + fn |
| 1320 | + (Builder $builder) => $builder->whereAny(['last_name', 'email'], 'Doe'), |
| 1321 | + 'whereAny', |
| 1322 | + ]; |
| 1323 | + |
| 1324 | + yield 'whereAny operator' => [ |
| 1325 | + [ |
| 1326 | + 'find' => [ |
| 1327 | + [ |
| 1328 | + '$or' => [ |
| 1329 | + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
| 1330 | + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1278 | 1331 | ],
|
1279 |
| - [], // options |
1280 | 1332 | ],
|
| 1333 | + [], // options |
1281 | 1334 | ],
|
1282 |
| - fn(Builder $builder) => $builder->whereAny(['last_name', 'email'], 'not like', '%Doe%'), |
1283 |
| - ]; |
1284 |
| - |
1285 |
| - /** @see DatabaseQueryBuilderTest::testOrWhereAny */ |
1286 |
| - yield 'orWhereAny' => [ |
1287 |
| - [ |
1288 |
| - 'find' => [ |
1289 |
| - [ |
1290 |
| - '$or' => [ |
1291 |
| - ['first_name' => 'John'], |
1292 |
| - ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
1293 |
| - ], |
| 1335 | + ], |
| 1336 | + fn |
| 1337 | + (Builder $builder) => $builder->whereAny(['last_name', 'email'], 'not like', '%Doe%'), |
| 1338 | + 'whereAny', |
| 1339 | + ]; |
| 1340 | + |
| 1341 | + /** @see DatabaseQueryBuilderTest::testOrWhereAny */ |
| 1342 | + yield 'orWhereAny' => [ |
| 1343 | + [ |
| 1344 | + 'find' => [ |
| 1345 | + [ |
| 1346 | + '$or' => [ |
| 1347 | + ['first_name' => 'John'], |
| 1348 | + ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], |
1294 | 1349 | ],
|
1295 |
| - [], // options |
1296 | 1350 | ],
|
| 1351 | + [], // options |
1297 | 1352 | ],
|
1298 |
| - fn(Builder $builder) => $builder |
1299 |
| - ->where('first_name', 'John') |
1300 |
| - ->orWhereAny(['last_name', 'email'], 'Doe'), |
1301 |
| - ]; |
1302 |
| - |
1303 |
| - yield 'orWhereAny operator' => [ |
1304 |
| - [ |
1305 |
| - 'find' => [ |
1306 |
| - [ |
1307 |
| - '$or' => [ |
1308 |
| - ['first_name' => new Regex('^.*John.*$', 'i')], |
1309 |
| - [ |
1310 |
| - '$or' => [ |
1311 |
| - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1312 |
| - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1313 |
| - ], |
| 1353 | + ], |
| 1354 | + fn |
| 1355 | + (Builder $builder) => $builder |
| 1356 | + ->where('first_name', 'John') |
| 1357 | + ->orWhereAny(['last_name', 'email'], 'Doe'), |
| 1358 | + 'whereAny', |
| 1359 | + ]; |
| 1360 | + |
| 1361 | + yield 'orWhereAny operator' => [ |
| 1362 | + [ |
| 1363 | + 'find' => [ |
| 1364 | + [ |
| 1365 | + '$or' => [ |
| 1366 | + ['first_name' => new Regex('^.*John.*$', 'i')], |
| 1367 | + [ |
| 1368 | + '$or' => [ |
| 1369 | + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
| 1370 | + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], |
1314 | 1371 | ],
|
1315 | 1372 | ],
|
1316 | 1373 | ],
|
1317 |
| - [], // options |
1318 | 1374 | ],
|
| 1375 | + [], // options |
1319 | 1376 | ],
|
1320 |
| - fn(Builder $builder) => $builder |
1321 |
| - ->where('first_name', 'like', '%John%') |
1322 |
| - ->orWhereAny(['last_name', 'email'], 'not like', '%Doe%'), |
1323 |
| - ]; |
1324 |
| - } |
| 1377 | + ], |
| 1378 | + fn |
| 1379 | + (Builder $builder) => $builder |
| 1380 | + ->where('first_name', 'like', '%John%') |
| 1381 | + ->orWhereAny(['last_name', 'email'], 'not like', '%Doe%'), |
| 1382 | + 'orWhereAny', |
| 1383 | + ]; |
1325 | 1384 | }
|
1326 | 1385 |
|
1327 | 1386 | #[DataProvider('provideExceptions')]
|
|
0 commit comments