Laravel Scout Array Driver

sti3bas/laravel-scout-array-driver image

Laravel Scout Array Driver stats

Downloads
511.2K
Stars
78
Open Issues
0
Forks
6

View on GitHub →

Array driver for Laravel Scout

Array driver for Laravel Scout

This package adds an array driver to Laravel Scout and provides custom PHPUnit assertions to make testing search related functionality easier.

Contents

Installation

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"/>

Usage

The Search facade provides the following methods and assertions:

assertContains($model, $callback = null)

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';
});

assertNotContains($model, $callback = null)

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';
});

assertContainsIn($index, $model, $callback = null)

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';
});

assertNotContainsIn($index, $model, $callback = null)

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';
});

assertEmpty()

Checks if all search indexes are empty.

Search::assertEmpty(); // ✅
 
User::factory()->create();
 
Search::assertEmpty(); // ❌

assertEmptyIn($index)

Checks if search index is empty.

Search::assertEmptyIn('users'); // ✅
 
User::factory()->create();
 
Search::assertEmptyIn('users'); // ❌

assertNotEmpty()

Checks if there is at least one record in any of search indexes.

Search::assertNotEmpty(); // ❌
 
User::factory()->create();
 
Search::assertNotEmpty(); // ✅

assertNotEmptyIn($index)

Checks if search index is not empty.

Search::assertNotEmptyIn('users'); // ❌
 
User::factory()->create();
 
Search::assertNotEmptyIn('users'); // ✅

assertSynced($model, $callback = null)

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';
});

assertNotSynced($model, $callback = null)

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';
});

assertSyncedTo($model, $callback = null)

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'; // ❌
});

assertNotSyncedTo($model, $callback = null)

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'; // ✅
});

assertSyncedTimes($model, $callback = null)

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'; // ❌
});

assertSyncedTimesTo($index, $model, $callback = null)

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'; // ❌
});

assertNothingSynced()

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(); // ❌

assertNothingSyncedTo()

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'); // ❌

assertIndexExists($index)

Checks if search index exists.

$manager = $this->app->make(EngineManager::class);
 
$engine = $manager->engine();
 
Search::assertIndexExists('test'); // ❌
 
$engine->createIndex('test');
 
Search::assertIndexExists('test'); // ✅

assertIndexNotExists($index)

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'); // ❌

fakeRecord($model, $data, $merge = true, $index = null)

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' => 'peter@example.com',
]);
 
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('peter@example.com', $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'])); // ✅

License

The MIT License (MIT). Please see License File for more information.

Sti3bas photo

Freelance Full Stack Web Developer

Cube

Laravel Newsletter

Join 40k+ other developers and never miss out on new tips, tutorials, and more.


Sti3Bas Laravel Scout Array Driver Related Articles

How to Use the HTTP QUERY Method in Laravel with Scout Search image

How to Use the HTTP QUERY Method in Laravel with Scout Search

Read article
Failover Queue Driver in Laravel 12.34 image

Failover Queue Driver in Laravel 12.34

Read article
Building fast, fuzzy site search with Laravel and Typesense image

Building fast, fuzzy site search with Laravel and Typesense

Read article
ElasticSearch Driver for Laravel Scout image

ElasticSearch Driver for Laravel Scout

Read article
Laravel Scout Array Driver for Testing image

Laravel Scout Array Driver for Testing

Read article
Learn how to use the TNTSearch driver with Laravel Scout image

Learn how to use the TNTSearch driver with Laravel Scout

Read article
LoadForge logo

LoadForge

Scalable load testing for web apps & APIs. Simulate real-world traffic and identify breaking points and performance limits with powerful, scalable load tests designed for Laravel.

LoadForge
Shift logo

Shift

Running an old Laravel version? Instant, automated Laravel upgrades and code modernization to keep your applications fresh.

Shift
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS Starter Kit

SaaSykit is a Multi-tenant Laravel SaaS Starter Kit that comes with all features required to run a modern SaaS. Payments, Beautiful Checkout, Admin Panel, User dashboard, Auth, Ready Components, Stats, Blog, Docs and more.

SaaSykit: Laravel SaaS Starter Kit
Securing Laravel logo

Securing Laravel

The essential security resource for Laravel devs, covering everything you need to keep your apps secure. Sign up to receive weekly security tips and monthly in depth articles, diving deep into security concepts you need to know!

Securing Laravel
PhpStorm logo

PhpStorm

The go-to PHP IDE with extensive out-of-the-box support for Laravel and its ecosystem.

PhpStorm
Curotec logo

Curotec

World class Laravel experts with GenAI dev skills. LATAM-based, embedded engineers that ship fast, communicate clearly, and elevate your product. No bloat, no BS.

Curotec