Array driver for Laravel Scout
sti3bas/laravel-scout-array-driver is a Laravel package for array driver for laravel scout.
It currently has 97 GitHub stars and 1.617.189 downloads on Packagist (latest version v4.3.2).
Install it with composer require sti3bas/laravel-scout-array-driver.
Discover more Laravel packages by sti3bas
or browse all Laravel packages to compare alternatives.
Last updated
This package adds an array driver to Laravel Scout and provides custom PHPUnit assertions to make testing search related functionality easier.
Install the package via Composer:
composer require sti3bas/laravel-scout-array-driver --dev
Set Scout driver to array in .env.testing file:
SCOUT_DRIVER=array
or in phpunit.xml file:
<server name="SCOUT_DRIVER" value="array"/>
The Search facade provides the following methods and assertions:
Checks if model exists in the search index.
$user = User::factory()->create([
'name' => 'Oliver',
]);
$user2 = User::withoutSyncingToSearch(function () {
return User::factory()->create([
'name' => 'John',
]);
});
Search::assertContains($user) // ✅
->assertContains($user2) // ❌
->assertContains($user, function ($record) { // ✅
return $record['name'] === 'Oliver';
})
->assertContains($user, function ($record) { // ❌
return $record['name'] === 'John';
})
->assertContains($user2, function ($record) { // ❌
return $record['name'] === 'John';
});
Checks if model doesn't exist in the search index.
$user = User::factory()->create([
'name' => 'Oliver',
]);
$user2 = User::withoutSyncingToSearch(function () {
return User::factory()->create([
'name' => 'John',
]);
});
Search::assertNotContains($user) // ❌
->assertNotContains($user2) // ✅
->assertNotContains($user, function ($record) { // ❌
return $record['name'] === 'Oliver';
})
->assertNotContains($user, function ($record) { // ✅
return $record['name'] === 'John';
})
->assertNotContains($user2, function ($record) { // ✅
return $record['name'] === 'John';
});
Checks if model exists in custom search index.
$user = User::factory()->create([
'name' => 'Oliver',
]);
Search::assertContainsIn('users', $user) // ✅
->assertContainsIn('non_existing_index', $user) // ❌
->assertContainsIn('users', $user, function ($record) { // ✅
return $record['name'] === 'Oliver';
})
->assertContainsIn('users', $user, function ($record) { // ❌
return $record['name'] === 'John';
});
Checks if model doesn't exist in custom search index.
$user = User::factory()->create([
'name' => 'Oliver',
]);
Search::assertNotContainsIn('users', $user) // ❌
->assertNotContainsIn('non_existing_index', $user) // ✅
->assertNotContainsIn('users', $user, function ($record) { // ❌
return $record['name'] === 'Oliver';
})
->assertNotContainsIn('users', $user, function ($record) { // ✅
return $record['name'] === 'John';
});
Checks if all search indexes are empty.
Search::assertEmpty(); // ✅
User::factory()->create();
Search::assertEmpty(); // ❌
Checks if search index is empty.
Search::assertEmptyIn('users'); // ✅
User::factory()->create();
Search::assertEmptyIn('users'); // ❌
Checks if there is at least one record in any of search indexes.
Search::assertNotEmpty(); // ❌
User::factory()->create();
Search::assertNotEmpty(); // ✅
Checks if search index is not empty.
Search::assertNotEmptyIn('users'); // ❌
User::factory()->create();
Search::assertNotEmptyIn('users'); // ✅
Checks if there is at least one record in any of search indexes.
Search::assertCount(1); // ❌
User::factory()->create();
Search::assertCount(1); // ✅
Checks if search index is not empty.
Search::assertNotEmptyIn('users', 1); // ❌
User::factory()->create();
Search::assertNotEmptyIn('users', 1); // ✅
Checks if model was synced to search index. This assertion checks every record of the given model which was synced during the request.
$user = User::factory()->create([
'name' => 'Peter',
]);
Search::assertSynced($user); // ✅
$user->update(['name' => 'John']);
$user->delete();
Search::assertContains($user) // ❌
->assertSynced($user) // ✅
->assertSynced($user, function ($record) { // ✅
return $record['name'] === 'Peter';
})
->assertSynced($user, function ($record) { // ✅
return $record['name'] === 'John';
})
->assertSynced($user, function ($record) { // ❌
return $record['name'] === 'Oliver';
});
Checks if model wasn't synced to search index. This assertion checks every record of the given model which was synced during the request.
$user = User::factory()->create([
'name' => 'Peter',
]);
Search::assertNotSynced($user); // ❌
$user->update(['name' => 'John']);
$user->delete();
Search::assertContains($user) // ❌
->assertNotSynced($user); // ❌
Search::assertNotSynced($user, function ($record) { // ❌
return $record['name'] === 'Peter';
})
->assertNotSynced($user, function ($record) { // ❌
return $record['name'] === 'John';
})
->assertNotSynced($user, function ($record) { // ✅
return $record['name'] === 'Oliver';
});
Checks if model was synced to custom search index. This assertion checks every record of the given model which was synced during the request.
$user = User::factory()->create([
'name' => 'Peter',
]);
Search::assertSyncedTo('users', $user); // ✅
$user->update(['name' => 'John']);
$user->delete();
Search::assertContains($user) // ❌
->assertSyncedTo('users', $user) // ✅
->assertSyncedTo('users', $user, function ($record) {
return $record['name'] === 'Peter'; // ✅
})
->assertSyncedTo('users', $user, function ($record) {
return $record['name'] === 'John'; // ✅
})
->assertSyncedTo('non_existing_index', $user, function ($record) {
return $record['name'] === 'John'; // ❌
});
Checks if model wasn't synced to custom search index. This assertion checks every record of the given model which was synced during the request.
$user = User::factory()->create([
'name' => 'Peter',
]);
Search::assertNotSyncedTo('users', $user) // ❌
->assertNotSyncedTo('not_existing_index', $user); // ✅
$user->update(['name' => 'John']);
$user->delete();
Search::assertContains($user) // ❌
->assertNotSyncedTo('users', $user) // ❌
->assertNotSyncedTo('users', $user, function ($record) {
return $record['name'] === 'Peter'; // ❌
})
->assertNotSyncedTo('users', $user, function ($record) {
return $record['name'] === 'Oliver'; // ✅
});
Checks if model was synced expected number of times. This assertion checks every record of the given model which was synced during the request.
$user = User::withoutSyncingToSearch(function () {
return User::factory()->create([
'name' => 'Peter',
]);
});
Search::assertSyncedTimes($user, 0) // ✅
->assertSyncedTimes($user, 1); // ❌
$user->searchable();
$user->update(['name' => 'John']);
$user->delete();
Search::assertContains($user) // ❌
->assertSyncedTimes($user, 2) // ✅
->assertSyncedTimes($user, 1, function ($record) {
return $record['name'] === 'Peter'; // ✅
})
->assertSyncedTimes($user, 1, function ($record) {
return $record['name'] === 'John'; // ✅
})
->assertSyncedTimes($user, 1, function ($record) {
return $record['name'] === 'Oliver'; // ❌
});
Checks if model was synced to custom search index expected number of times. This assertion checks every record of the given model which was synced during the request.
$user = User::withoutSyncingToSearch(function () {
return User::factory()->create([
'name' => 'Peter',
]);
});
Search::assertSyncedTimesTo('users', $user, 0) // ✅
->assertSyncedTimesTo('non_existing_index', $user, 1); // ❌
$user->searchable();
$user->update(['name' => 'John']);
$user->delete();
Search::assertContains($user) // ❌
->assertSyncedTimesTo('users', $user, 2) // ✅
->assertSyncedTimesTo('users', $user, 1, function ($record) {
return $record['name'] === 'Peter'; // ✅
})
->assertSyncedTimesTo('non_existing_index', 1, function ($record) {
return $record['name'] === 'John'; // ❌
});
Checks if nothing was synced to any of search indexes. This assertion checks every record which was synced during the request.
Search::assertNothingSynced(); // ✅
User::factory()->create();
Search::assertNothingSynced(); // ❌
Checks if nothing was synced to custom search index. This assertion checks every record which was synced during the request.
Search::assertNothingSyncedTo('users'); // ✅
User::factory()->create();
Search::assertNothingSyncedTo('users'); // ❌
Checks if search index exists.
$manager = $this->app->make(EngineManager::class);
$engine = $manager->engine();
Search::assertIndexExists('test'); // ❌
$engine->createIndex('test');
Search::assertIndexExists('test'); // ✅
Checks if search index doesn't exist.
$manager = $this->app->make(EngineManager::class);
$engine = $manager->engine();
Search::assertIndexNotExists('test'); // ✅
$engine->createIndex('test');
Search::assertIndexNotExists('test'); // ❌
This method allows to fake search index record of the model. It will not affect assertions.
$user = User::factory()->create([
'id' => 123,
'name' => 'Peter',
'email' => '[email protected]',
]);
Search::fakeRecord($user, [
'name' => 'John',
]);
$record = User::search()->where('id', 123)->raw()['hits'][0];
$this->assertEquals('Peter', $record['name']); // ❌
$this->assertEquals('John', $record['name']); // ✅
$this->assertEquals('[email protected]', $record['email']); // ✅
Search::fakeRecord($user, [
'id' => 123,
'name' => 'John',
], false);
$record = User::search()->where('id', 123)->raw()['hits'][0];
$this->assertEquals('Peter', $record['name']); // ❌
$this->assertEquals('John', $record['name']); // ✅
$this->assertTrue(!isset($record['email'])); // ✅
The MIT License (MIT). Please see License File for more information.