Skip to content

Commit 13cb646

Browse files
[10.x] Test Improvements (#880)
* [10.x] Supports PHP 8.4 Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> --------- Signed-off-by: Mior Muhammad Zaki <[email protected]> Co-authored-by: StyleCI Bot <[email protected]>
1 parent 036efa7 commit 13cb646

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1891
-1728
lines changed

composer.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
},
4545
"autoload-dev": {
4646
"psr-4": {
47-
"Laravel\\Scout\\Tests\\": "tests/"
47+
"Laravel\\Scout\\Tests\\": "tests/",
48+
"Workbench\\App\\": "workbench/app/",
49+
"Workbench\\Database\\Factories\\": "workbench/database/factories/"
4850
}
4951
},
5052
"extra": {

testbench.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
providers:
2+
- Workbench\App\Providers\WorkbenchServiceProvider
23
- Laravel\Scout\ScoutServiceProvider
34

4-
migrations: true
5+
migrations:
6+
- workbench/database/migrations
57

68
workbench:
79
install: true

tests/Feature/BuilderTest.php

+14-72
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,37 @@
33
namespace Laravel\Scout\Tests\Feature;
44

55
use Illuminate\Database\Eloquent\Factories\Sequence;
6-
use Illuminate\Foundation\Auth\User;
76
use Illuminate\Foundation\Testing\LazilyRefreshDatabase;
87
use Illuminate\Foundation\Testing\WithFaker;
9-
use Laravel\Scout\EngineManager;
10-
use Laravel\Scout\Engines\MeilisearchEngine;
11-
use Laravel\Scout\Tests\Fixtures\SearchableUserModel;
12-
use Mockery as m;
13-
use Orchestra\Testbench\Concerns\WithLaravelMigrations;
8+
use Orchestra\Testbench\Attributes\WithConfig;
9+
use Orchestra\Testbench\Attributes\WithMigration;
1410
use Orchestra\Testbench\Concerns\WithWorkbench;
15-
use Orchestra\Testbench\Factories\UserFactory;
1611
use Orchestra\Testbench\TestCase;
12+
use Workbench\App\Models\SearchableUser;
13+
use Workbench\Database\Factories\SearchableUserFactory;
1714

15+
#[WithConfig('scout.driver', 'database')]
16+
#[WithMigration]
1817
class BuilderTest extends TestCase
1918
{
20-
use LazilyRefreshDatabase, WithFaker, WithLaravelMigrations, WithWorkbench;
21-
22-
protected function defineEnvironment($app)
23-
{
24-
$app->make('config')->set('scout.driver', 'fake');
25-
}
19+
use LazilyRefreshDatabase;
20+
use WithFaker;
21+
use WithWorkbench;
2622

2723
protected function afterRefreshingDatabase()
2824
{
2925
$this->setUpFaker();
3026

31-
UserFactory::new()->count(50)->state(new Sequence(function () {
27+
SearchableUserFactory::new()->count(50)->state(new Sequence(function () {
3228
return ['name' => 'Laravel '.$this->faker()->name()];
3329
}))->create();
3430

35-
UserFactory::new()->times(50)->create();
31+
SearchableUserFactory::new()->times(50)->create();
3632
}
3733

3834
public function test_it_can_paginate_without_custom_query_callback()
3935
{
40-
$this->prepareScoutSearchMockUsing('Laravel');
41-
42-
$paginator = SearchableUserModel::search('Laravel')->paginate();
36+
$paginator = SearchableUser::search('Laravel')->paginate();
4337

4438
$this->assertSame(50, $paginator->total());
4539
$this->assertSame(4, $paginator->lastPage());
@@ -48,9 +42,7 @@ public function test_it_can_paginate_without_custom_query_callback()
4842

4943
public function test_it_can_paginate_with_custom_query_callback()
5044
{
51-
$this->prepareScoutSearchMockUsing('Laravel');
52-
53-
$paginator = SearchableUserModel::search('Laravel')->query(function ($builder) {
45+
$paginator = SearchableUser::search('Laravel')->query(function ($builder) {
5446
return $builder->where('id', '<', 11);
5547
})->paginate();
5648

@@ -61,60 +53,10 @@ public function test_it_can_paginate_with_custom_query_callback()
6153

6254
public function test_it_can_paginate_raw_without_custom_query_callback()
6355
{
64-
$this->prepareScoutSearchMockUsing('Laravel');
65-
66-
$paginator = SearchableUserModel::search('Laravel')->paginateRaw();
56+
$paginator = SearchableUser::search('Laravel')->paginateRaw();
6757

6858
$this->assertSame(50, $paginator->total());
6959
$this->assertSame(4, $paginator->lastPage());
7060
$this->assertSame(15, $paginator->perPage());
7161
}
72-
73-
public function test_it_can_paginate_raw_with_custom_query_callback()
74-
{
75-
$this->prepareScoutSearchMockUsing('Laravel');
76-
77-
$paginator = SearchableUserModel::search('Laravel')->query(function ($builder) {
78-
return $builder->where('id', '<', 11);
79-
})->paginateRaw();
80-
81-
$this->assertSame(10, $paginator->total());
82-
$this->assertSame(1, $paginator->lastPage());
83-
$this->assertSame(15, $paginator->perPage());
84-
}
85-
86-
protected function prepareScoutSearchMockUsing($searchQuery)
87-
{
88-
$engine = m::mock('Meilisearch\Client');
89-
$indexes = m::mock('Meilisearch\Endpoints\Indexes');
90-
91-
$manager = $this->app->make(EngineManager::class);
92-
$manager->extend('fake', function () use ($engine) {
93-
return new MeilisearchEngine($engine);
94-
});
95-
96-
$query = User::where('name', 'like', $searchQuery.'%');
97-
98-
$hitsPerPage = 15;
99-
$page = 1;
100-
$totalPages = intval($query->count() / $hitsPerPage);
101-
102-
$engine->shouldReceive('index')->with('users')->andReturn($indexes);
103-
$indexes->shouldReceive('rawSearch')
104-
->with($searchQuery, ['hitsPerPage' => $hitsPerPage, 'page' => $page])
105-
->andReturn([
106-
'query' => $searchQuery,
107-
'hits' => $query->get()->transform(function ($result) {
108-
return [
109-
'id' => $result->getKey(),
110-
'name' => $result->name,
111-
];
112-
})->toArray(),
113-
'hitsPerPage' => $hitsPerPage,
114-
'page' => $page,
115-
'totalHits' => $query->count(),
116-
'totalPages' => $totalPages > 0 ? $totalPages : 0,
117-
'processingTimeMs' => 1,
118-
]);
119-
}
12062
}

tests/Feature/CollectionEngineTest.php

+68-36
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,20 @@
44

55
use Illuminate\Database\Eloquent\Model;
66
use Illuminate\Foundation\Testing\LazilyRefreshDatabase;
7-
use Laravel\Scout\Tests\Fixtures\SearchableModelWithUnloadedValue;
8-
use Laravel\Scout\Tests\Fixtures\SearchableUserModel;
9-
use Laravel\Scout\Tests\Fixtures\SearchableUserModelWithCustomCreatedAt;
10-
use Laravel\Scout\Tests\Fixtures\SearchableUserModelWithCustomSearchableData;
11-
use Orchestra\Testbench\Concerns\WithLaravelMigrations;
7+
use Illuminate\Support\Collection;
8+
use Orchestra\Testbench\Attributes\WithConfig;
9+
use Orchestra\Testbench\Attributes\WithMigration;
1210
use Orchestra\Testbench\Concerns\WithWorkbench;
1311
use Orchestra\Testbench\Factories\UserFactory;
1412
use Orchestra\Testbench\TestCase;
13+
use Workbench\App\Models\SearchableUser;
1514

15+
#[WithConfig('scout.driver', 'collection')]
16+
#[WithMigration]
1617
class CollectionEngineTest extends TestCase
1718
{
18-
use LazilyRefreshDatabase, WithLaravelMigrations, WithWorkbench;
19-
20-
protected function defineEnvironment($app)
21-
{
22-
$app->make('config')->set('scout.driver', 'collection');
23-
}
19+
use LazilyRefreshDatabase;
20+
use WithWorkbench;
2421

2522
protected function afterRefreshingDatabase()
2623
{
@@ -39,113 +36,113 @@ protected function afterRefreshingDatabase()
3936

4037
public function test_it_can_retrieve_results_with_empty_search()
4138
{
42-
$models = SearchableUserModel::search()->get();
39+
$models = SearchableUser::search()->get();
4340

4441
$this->assertCount(2, $models);
4542
}
4643

4744
public function test_it_can_retrieve_results()
4845
{
49-
$models = SearchableUserModel::search('Taylor')->where('email', '[email protected]')->get();
46+
$models = SearchableUser::search('Taylor')->where('email', '[email protected]')->get();
5047
$this->assertCount(1, $models);
5148
$this->assertEquals(1, $models[0]->id);
5249

53-
$models = SearchableUserModel::search('Taylor')->query(function ($query) {
50+
$models = SearchableUser::search('Taylor')->query(function ($query) {
5451
$query->where('email', 'like', '[email protected]');
5552
})->get();
5653

5754
$this->assertCount(1, $models);
5855
$this->assertEquals(1, $models[0]->id);
5956

60-
$models = SearchableUserModel::search('Abigail')->where('email', '[email protected]')->get();
57+
$models = SearchableUser::search('Abigail')->where('email', '[email protected]')->get();
6158
$this->assertCount(1, $models);
6259
$this->assertEquals(2, $models[0]->id);
6360

64-
$models = SearchableUserModel::search('Taylor')->where('email', '[email protected]')->get();
61+
$models = SearchableUser::search('Taylor')->where('email', '[email protected]')->get();
6562
$this->assertCount(0, $models);
6663

67-
$models = SearchableUserModel::search('Taylor')->where('email', '[email protected]')->get();
64+
$models = SearchableUser::search('Taylor')->where('email', '[email protected]')->get();
6865
$this->assertCount(1, $models);
6966

70-
$models = SearchableUserModel::search('otwell')->get();
67+
$models = SearchableUser::search('otwell')->get();
7168
$this->assertCount(2, $models);
7269

73-
$models = SearchableUserModel::search('laravel')->get();
70+
$models = SearchableUser::search('laravel')->get();
7471
$this->assertCount(2, $models);
7572

76-
$models = SearchableUserModel::search('foo')->get();
73+
$models = SearchableUser::search('foo')->get();
7774
$this->assertCount(0, $models);
7875

79-
$models = SearchableUserModel::search('Abigail')->where('email', '[email protected]')->get();
76+
$models = SearchableUser::search('Abigail')->where('email', '[email protected]')->get();
8077
$this->assertCount(0, $models);
8178
}
8279

8380
public function test_it_can_retrieve_results_matching_to_custom_searchable_data()
8481
{
85-
$models = SearchableUserModelWithCustomSearchableData::search('rolyaT')->get();
82+
$models = SearchableUserWithCustomSearchableData::search('rolyaT')->get();
8683
$this->assertCount(1, $models);
8784
}
8885

8986
public function test_it_can_paginate_results()
9087
{
91-
$models = SearchableUserModel::search('Taylor')->where('email', '[email protected]')->paginate();
88+
$models = SearchableUser::search('Taylor')->where('email', '[email protected]')->paginate();
9289
$this->assertCount(1, $models);
9390

94-
$models = SearchableUserModel::search('Taylor')->where('email', '[email protected]')->paginate();
91+
$models = SearchableUser::search('Taylor')->where('email', '[email protected]')->paginate();
9592
$this->assertCount(0, $models);
9693

97-
$models = SearchableUserModel::search('Taylor')->where('email', '[email protected]')->paginate();
94+
$models = SearchableUser::search('Taylor')->where('email', '[email protected]')->paginate();
9895
$this->assertCount(1, $models);
9996

100-
$models = SearchableUserModel::search('laravel')->paginate();
97+
$models = SearchableUser::search('laravel')->paginate();
10198
$this->assertCount(2, $models);
10299

103100
$dummyQuery = function ($query) {
104101
$query->where('name', '!=', 'Dummy');
105102
};
106-
$models = SearchableUserModel::search('laravel')->query($dummyQuery)->orderBy('name')->paginate(1, 'page', 1);
103+
$models = SearchableUser::search('laravel')->query($dummyQuery)->orderBy('name')->paginate(1, 'page', 1);
107104
$this->assertCount(1, $models);
108105
$this->assertEquals('Abigail Otwell', $models[0]->name);
109106

110-
$models = SearchableUserModel::search('laravel')->query($dummyQuery)->orderBy('name')->paginate(1, 'page', 2);
107+
$models = SearchableUser::search('laravel')->query($dummyQuery)->orderBy('name')->paginate(1, 'page', 2);
111108
$this->assertCount(1, $models);
112109
$this->assertEquals('Taylor Otwell', $models[0]->name);
113110
}
114111

115112
public function test_limit_is_applied()
116113
{
117-
$models = SearchableUserModel::search('laravel')->get();
114+
$models = SearchableUser::search('laravel')->get();
118115
$this->assertCount(2, $models);
119116

120-
$models = SearchableUserModel::search('laravel')->take(1)->get();
117+
$models = SearchableUser::search('laravel')->take(1)->get();
121118
$this->assertCount(1, $models);
122119
}
123120

124121
public function test_it_can_order_results()
125122
{
126-
$models = SearchableUserModel::search('laravel')->orderBy('name', 'asc')->paginate(1, 'page', 1);
123+
$models = SearchableUser::search('laravel')->orderBy('name', 'asc')->paginate(1, 'page', 1);
127124
$this->assertCount(1, $models);
128125
$this->assertEquals('Abigail Otwell', $models[0]->name);
129126

130-
$models = SearchableUserModel::search('laravel')->orderBy('name', 'desc')->paginate(1, 'page', 1);
127+
$models = SearchableUser::search('laravel')->orderBy('name', 'desc')->paginate(1, 'page', 1);
131128
$this->assertCount(1, $models);
132129
$this->assertEquals('Taylor Otwell', $models[0]->name);
133130
}
134131

135132
public function test_it_can_order_by_latest_and_oldest()
136133
{
137-
$models = SearchableUserModel::search('laravel')->latest()->paginate(1, 'page', 1);
134+
$models = SearchableUser::search('laravel')->latest()->paginate(1, 'page', 1);
138135
$this->assertCount(1, $models);
139136
$this->assertEquals('Abigail Otwell', $models[0]->name);
140137

141-
$models = SearchableUserModel::search('laravel')->oldest()->paginate(1, 'page', 1);
138+
$models = SearchableUser::search('laravel')->oldest()->paginate(1, 'page', 1);
142139
$this->assertCount(1, $models);
143140
$this->assertEquals('Taylor Otwell', $models[0]->name);
144141
}
145142

146143
public function test_it_can_order_by_custom_model_created_at_timestamp()
147144
{
148-
$query = SearchableUserModelWithCustomCreatedAt::search()->latest();
145+
$query = SearchableUserWithCustomCreatedAt::search()->latest();
149146

150147
$this->assertCount(1, $query->orders);
151148
$this->assertEquals('created', $query->orders[0]['column']);
@@ -155,8 +152,43 @@ public function test_it_calls_make_searchable_using_before_searching()
155152
{
156153
Model::preventAccessingMissingAttributes(true);
157154

158-
$models = SearchableModelWithUnloadedValue::search('loaded')->get();
155+
$models = SearchableUserWithUnloadedValue::search('loaded')->get();
159156

160157
$this->assertCount(2, $models);
161158
}
162159
}
160+
161+
class SearchableUserWithCustomCreatedAt extends SearchableUser
162+
{
163+
public const CREATED_AT = 'created';
164+
}
165+
166+
class SearchableUserWithCustomSearchableData extends SearchableUser
167+
{
168+
/** {@inheritDoc} */
169+
public function toSearchableArray(): array
170+
{
171+
return [
172+
'reversed_name' => strrev($this->name),
173+
];
174+
}
175+
}
176+
177+
class SearchableUserWithUnloadedValue extends SearchableUser
178+
{
179+
/** {@inheritDoc} */
180+
public function toSearchableArray()
181+
{
182+
return [
183+
'value' => $this->unloadedValue,
184+
];
185+
}
186+
187+
/** {@inheritDoc} */
188+
public function makeSearchableUsing(Collection $models)
189+
{
190+
return $models->each(
191+
fn ($model) => $model->unloadedValue = 'loaded',
192+
);
193+
}
194+
}

0 commit comments

Comments
 (0)