|
5 | 5 | use Closure; |
6 | 6 | use DateTimeImmutable; |
7 | 7 | use Illuminate\Database\Eloquent\Collection as EloquentCollection; |
8 | | -use Illuminate\Support\Collection as IlluminateCollection; |
| 8 | +use Illuminate\Support\Collection as LaravelCollection; |
| 9 | +use Illuminate\Support\LazyCollection; |
9 | 10 | use Laravel\Scout\Builder; |
10 | 11 | use Laravel\Scout\Jobs\RemoveFromSearch; |
11 | 12 | use Mockery as m; |
12 | | -use MongoDB\BSON\Document; |
13 | 13 | use MongoDB\BSON\UTCDateTime; |
14 | 14 | use MongoDB\Collection; |
15 | 15 | use MongoDB\Database; |
16 | 16 | use MongoDB\Driver\CursorInterface; |
| 17 | +use MongoDB\Laravel\Eloquent\Model; |
17 | 18 | use MongoDB\Laravel\Scout\ScoutEngine; |
| 19 | +use MongoDB\Laravel\Tests\Scout\Models\ScoutUser; |
18 | 20 | use MongoDB\Laravel\Tests\Scout\Models\SearchableModel; |
19 | 21 | use MongoDB\Laravel\Tests\TestCase; |
20 | | -use MongoDB\Model\BSONDocument; |
21 | 22 | use PHPUnit\Framework\Attributes\DataProvider; |
22 | 23 |
|
23 | 24 | use function array_replace_recursive; |
| 25 | +use function count; |
24 | 26 | use function serialize; |
25 | 27 | use function unserialize; |
26 | 28 |
|
@@ -402,46 +404,71 @@ public function testPaginate() |
402 | 404 | $engine->paginate($builder, $perPage, $page); |
403 | 405 | } |
404 | 406 |
|
405 | | - #[DataProvider('provideResultsForMapIds')] |
406 | | - public function testLazyMapIds(array $results): void |
| 407 | + public function testMapMethodRespectsOrder() |
407 | 408 | { |
408 | | - $engine = new ScoutEngine(m::mock(Database::class), softDelete: false); |
409 | | - |
410 | | - $ids = $engine->lazyMap($results); |
411 | | - |
412 | | - $this->assertInstanceOf(IlluminateCollection::class, $ids); |
413 | | - $this->assertEquals(['key_1', 'key_2'], $ids->all()); |
| 409 | + $database = m::mock(Database::class); |
| 410 | + $engine = new ScoutEngine($database, false); |
| 411 | + |
| 412 | + $model = m::mock(Model::class); |
| 413 | + $model->shouldReceive(['getScoutKeyName' => 'id']); |
| 414 | + $model->shouldReceive('queryScoutModelsByIds->get') |
| 415 | + ->andReturn(LaravelCollection::make([ |
| 416 | + new ScoutUser(['id' => 1]), |
| 417 | + new ScoutUser(['id' => 2]), |
| 418 | + new ScoutUser(['id' => 3]), |
| 419 | + new ScoutUser(['id' => 4]), |
| 420 | + ])); |
| 421 | + |
| 422 | + $builder = m::mock(Builder::class); |
| 423 | + |
| 424 | + $results = $engine->map($builder, [ |
| 425 | + ['_id' => 1, '__count' => 4], |
| 426 | + ['_id' => 2, '__count' => 4], |
| 427 | + ['_id' => 4, '__count' => 4], |
| 428 | + ['_id' => 3, '__count' => 4], |
| 429 | + ], $model); |
| 430 | + |
| 431 | + $this->assertEquals(4, count($results)); |
| 432 | + $this->assertEquals([ |
| 433 | + 0 => ['id' => 1], |
| 434 | + 1 => ['id' => 2], |
| 435 | + 2 => ['id' => 4], |
| 436 | + 3 => ['id' => 3], |
| 437 | + ], $results->toArray()); |
414 | 438 | } |
415 | 439 |
|
416 | | - public static function provideResultsForMapIds(): iterable |
| 440 | + public function testLazyMapMethodRespectsOrder() |
417 | 441 | { |
418 | | - yield 'array' => [ |
419 | | - [ |
420 | | - ['_id' => 'key_1', 'foo' => 'bar'], |
421 | | - ['_id' => 'key_2', 'foo' => 'bar'], |
422 | | - ], |
423 | | - ]; |
424 | | - |
425 | | - yield 'object' => [ |
426 | | - [ |
427 | | - (object) ['_id' => 'key_1', 'foo' => 'bar'], |
428 | | - (object) ['_id' => 'key_2', 'foo' => 'bar'], |
429 | | - ], |
430 | | - ]; |
431 | | - |
432 | | - yield Document::class => [ |
433 | | - [ |
434 | | - Document::fromPHP(['_id' => 'key_1', 'foo' => 'bar']), |
435 | | - Document::fromPHP(['_id' => 'key_2', 'foo' => 'bar']), |
436 | | - ], |
437 | | - ]; |
438 | | - |
439 | | - yield BSONDocument::class => [ |
440 | | - [ |
441 | | - new BSONDocument(['_id' => 'key_1', 'foo' => 'bar']), |
442 | | - new BSONDocument(['_id' => 'key_2', 'foo' => 'bar']), |
443 | | - ], |
444 | | - ]; |
| 442 | + $lazy = false; |
| 443 | + $database = m::mock(Database::class); |
| 444 | + $engine = new ScoutEngine($database, false); |
| 445 | + |
| 446 | + $model = m::mock(Model::class); |
| 447 | + $model->shouldReceive(['getScoutKeyName' => 'id']); |
| 448 | + $model->shouldReceive('queryScoutModelsByIds->cursor') |
| 449 | + ->andReturn(LazyCollection::make([ |
| 450 | + new ScoutUser(['id' => 1]), |
| 451 | + new ScoutUser(['id' => 2]), |
| 452 | + new ScoutUser(['id' => 3]), |
| 453 | + new ScoutUser(['id' => 4]), |
| 454 | + ])); |
| 455 | + |
| 456 | + $builder = m::mock(Builder::class); |
| 457 | + |
| 458 | + $results = $engine->lazyMap($builder, [ |
| 459 | + ['_id' => 1, '__count' => 4], |
| 460 | + ['_id' => 2, '__count' => 4], |
| 461 | + ['_id' => 4, '__count' => 4], |
| 462 | + ['_id' => 3, '__count' => 4], |
| 463 | + ], $model); |
| 464 | + |
| 465 | + $this->assertEquals(4, count($results)); |
| 466 | + $this->assertEquals([ |
| 467 | + 0 => ['id' => 1], |
| 468 | + 1 => ['id' => 2], |
| 469 | + 2 => ['id' => 4], |
| 470 | + 3 => ['id' => 3], |
| 471 | + ], $results->toArray()); |
445 | 472 | } |
446 | 473 |
|
447 | 474 | public function testUpdate(): void |
|
0 commit comments