Skip to content

Commit 5e9e4b8

Browse files
authored
Test Improvements (#1688)
* Test Improvements Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> --------- Signed-off-by: Mior Muhammad Zaki <[email protected]>
1 parent 286baeb commit 5e9e4b8

File tree

8 files changed

+129
-120
lines changed

8 files changed

+129
-120
lines changed

composer.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
},
3535
"require-dev": {
3636
"mockery/mockery": "^1.0",
37-
"orchestra/testbench": "^7.0|^8.0",
37+
"orchestra/testbench": "^7.31|^8.11",
3838
"phpstan/phpstan": "^1.10",
3939
"phpunit/phpunit": "^9.3"
4040
},
@@ -46,7 +46,9 @@
4646
},
4747
"autoload-dev": {
4848
"psr-4": {
49-
"Laravel\\Passport\\Tests\\": "tests/"
49+
"Laravel\\Passport\\Tests\\": "tests/",
50+
"Workbench\\App\\": "workbench/app/",
51+
"Workbench\\Database\\Factories\\": "workbench/database/factories/"
5052
}
5153
},
5254
"extra": {
@@ -62,6 +64,10 @@
6264
"config": {
6365
"sort-packages": true
6466
},
67+
"scripts": {
68+
"post-autoload-dump": "@prepare",
69+
"prepare": "@php vendor/bin/testbench package:discover --ansi"
70+
},
6571
"minimum-stability": "dev",
6672
"prefer-stable": true
6773
}

testbench.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
providers:
2+
- Laravel\Passport\PassportServiceProvider
3+
4+
migrations: true
5+

tests/Feature/AccessTokenControllerTest.php

Lines changed: 27 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,26 @@
44

55
use Carbon\CarbonImmutable;
66
use Illuminate\Contracts\Hashing\Hasher;
7-
use Illuminate\Database\Schema\Blueprint;
8-
use Illuminate\Support\Facades\Schema;
97
use Laravel\Passport\Client;
108
use Laravel\Passport\Database\Factories\ClientFactory;
11-
use Laravel\Passport\HasApiTokens;
129
use Laravel\Passport\Passport;
1310
use Laravel\Passport\PersonalAccessTokenFactory;
1411
use Laravel\Passport\Token;
12+
use Orchestra\Testbench\Concerns\WithLaravelMigrations;
13+
use Workbench\Database\Factories\UserFactory;
1514

1615
class AccessTokenControllerTest extends PassportTestCase
1716
{
18-
protected function setUp(): void
19-
{
20-
parent::setUp();
21-
22-
Schema::create('users', function (Blueprint $table) {
23-
$table->increments('id');
24-
$table->string('email')->unique();
25-
$table->string('password');
26-
$table->dateTime('created_at');
27-
$table->dateTime('updated_at');
28-
});
29-
}
30-
31-
protected function tearDown(): void
32-
{
33-
Schema::dropIfExists('users');
34-
35-
parent::tearDown();
36-
}
37-
38-
protected function getUserClass()
39-
{
40-
return User::class;
41-
}
17+
use WithLaravelMigrations;
4218

4319
public function testGettingAccessTokenWithClientCredentialsGrant()
4420
{
4521
$this->withoutExceptionHandling();
4622

47-
$user = new User();
48-
$user->email = '[email protected]';
49-
$user->password = $this->app->make(Hasher::class)->make('foobar123');
50-
$user->save();
23+
$user = UserFactory::new()->create([
24+
'email' => '[email protected]',
25+
'password' => $this->app->make(Hasher::class)->make('foobar123'),
26+
]);
5127

5228
/** @var Client $client */
5329
$client = ClientFactory::new()->asClientCredentials()->create(['user_id' => $user->getKey()]);
@@ -87,10 +63,10 @@ public function testGettingAccessTokenWithClientCredentialsGrant()
8763

8864
public function testGettingAccessTokenWithClientCredentialsGrantInvalidClientSecret()
8965
{
90-
$user = new User();
91-
$user->email = '[email protected]';
92-
$user->password = $this->app->make(Hasher::class)->make('foobar123');
93-
$user->save();
66+
$user = UserFactory::new()->create([
67+
'email' => '[email protected]',
68+
'password' => $this->app->make(Hasher::class)->make('foobar123'),
69+
]);
9470

9571
/** @var Client $client */
9672
$client = ClientFactory::new()->asClientCredentials()->create(['user_id' => $user->getKey()]);
@@ -131,10 +107,10 @@ public function testGettingAccessTokenWithPasswordGrant()
131107
$this->withoutExceptionHandling();
132108

133109
$password = 'foobar123';
134-
$user = new User();
135-
$user->email = '[email protected]';
136-
$user->password = $this->app->make(Hasher::class)->make($password);
137-
$user->save();
110+
$user = UserFactory::new()->create([
111+
'email' => '[email protected]',
112+
'password' => $this->app->make(Hasher::class)->make($password),
113+
]);
138114

139115
/** @var Client $client */
140116
$client = ClientFactory::new()->asPasswordClient()->create(['user_id' => $user->getKey()]);
@@ -178,10 +154,10 @@ public function testGettingAccessTokenWithPasswordGrant()
178154
public function testGettingAccessTokenWithPasswordGrantWithInvalidPassword()
179155
{
180156
$password = 'foobar123';
181-
$user = new User();
182-
$user->email = '[email protected]';
183-
$user->password = $this->app->make(Hasher::class)->make($password);
184-
$user->save();
157+
$user = UserFactory::new()->create([
158+
'email' => '[email protected]',
159+
'password' => $this->app->make(Hasher::class)->make($password),
160+
]);
185161

186162
/** @var Client $client */
187163
$client = ClientFactory::new()->asPasswordClient()->create(['user_id' => $user->getKey()]);
@@ -221,10 +197,10 @@ public function testGettingAccessTokenWithPasswordGrantWithInvalidPassword()
221197
public function testGettingAccessTokenWithPasswordGrantWithInvalidClientSecret()
222198
{
223199
$password = 'foobar123';
224-
$user = new User();
225-
$user->email = '[email protected]';
226-
$user->password = $this->app->make(Hasher::class)->make($password);
227-
$user->save();
200+
$user = UserFactory::new()->create([
201+
'email' => '[email protected]',
202+
'password' => $this->app->make(Hasher::class)->make($password),
203+
]);
228204

229205
/** @var Client $client */
230206
$client = ClientFactory::new()->asPasswordClient()->create(['user_id' => $user->getKey()]);
@@ -268,10 +244,10 @@ public function testGettingCustomResponseType()
268244
$this->withoutExceptionHandling();
269245
Passport::$authorizationServerResponseType = new IdTokenResponse('foo_bar_open_id_token');
270246

271-
$user = new User();
272-
$user->email = '[email protected]';
273-
$user->password = $this->app->make(Hasher::class)->make('foobar123');
274-
$user->save();
247+
$user = UserFactory::new()->create([
248+
'email' => '[email protected]',
249+
'password' => $this->app->make(Hasher::class)->make('foobar123'),
250+
]);
275251

276252
/** @var Client $client */
277253
$client = ClientFactory::new()->asClientCredentials()->create(['user_id' => $user->getKey()]);
@@ -294,11 +270,6 @@ public function testGettingCustomResponseType()
294270
}
295271
}
296272

297-
class User extends \Illuminate\Foundation\Auth\User
298-
{
299-
use HasApiTokens;
300-
}
301-
302273
class IdTokenResponse extends \League\OAuth2\Server\ResponseTypes\BearerTokenResponse
303274
{
304275
/**

tests/Feature/ActingAsTest.php

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
namespace Laravel\Passport\Tests\Feature;
44

55
use Illuminate\Contracts\Routing\Registrar;
6-
use Illuminate\Foundation\Auth\User;
76
use Illuminate\Support\Facades\Route;
8-
use Laravel\Passport\HasApiTokens;
97
use Laravel\Passport\Http\Middleware\CheckForAnyScope;
108
use Laravel\Passport\Http\Middleware\CheckScopes;
119
use Laravel\Passport\Passport;
10+
use Workbench\App\Models\User;
1211

1312
class ActingAsTest extends PassportTestCase
1413
{
@@ -23,7 +22,7 @@ public function testActingAsWhenTheRouteIsProtectedByAuthMiddleware()
2322
return 'bar';
2423
})->middleware('auth:api');
2524

26-
Passport::actingAs(new PassportUser());
25+
Passport::actingAs(new User());
2726

2827
$response = $this->get('/foo');
2928
$response->assertSuccessful();
@@ -41,7 +40,7 @@ public function testActingAsWhenTheRouteIsProtectedByCheckScopesMiddleware()
4140
return 'bar';
4241
})->middleware(CheckScopes::class.':admin,footest');
4342

44-
Passport::actingAs(new PassportUser(), ['admin', 'footest']);
43+
Passport::actingAs(new User(), ['admin', 'footest']);
4544

4645
$response = $this->get('/foo');
4746
$response->assertSuccessful();
@@ -59,7 +58,7 @@ public function testActingAsWhenTheRouteIsProtectedByCheckForAnyScopeMiddleware(
5958
return 'bar';
6059
})->middleware(CheckForAnyScope::class.':admin,footest');
6160

62-
Passport::actingAs(new PassportUser(), ['footest']);
61+
Passport::actingAs(new User(), ['footest']);
6362

6463
$response = $this->get('/foo');
6564
$response->assertSuccessful();
@@ -76,7 +75,7 @@ public function testActingAsWhenTheRouteIsProtectedByCheckScopesMiddlewareWithIn
7675
return 'bar';
7776
});
7877

79-
Passport::actingAs(new PassportUser(), ['foo', 'baz']);
78+
Passport::actingAs(new User(), ['foo', 'baz']);
8079

8180
$response = $this->get('/foo');
8281
$response->assertSuccessful();
@@ -93,17 +92,10 @@ public function testActingAsWhenTheRouteIsProtectedByCheckForAnyScopeMiddlewareW
9392
return 'bar';
9493
});
9594

96-
Passport::actingAs(new PassportUser(), ['foo']);
95+
Passport::actingAs(new User(), ['foo']);
9796

9897
$response = $this->get('/foo');
9998
$response->assertSuccessful();
10099
$response->assertSee('bar');
101100
}
102101
}
103-
104-
class PassportUser extends User
105-
{
106-
use HasApiTokens;
107-
108-
protected $table = 'users';
109-
}

tests/Feature/KeysCommandTest.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,8 @@
22

33
namespace Laravel\Passport\Tests\Feature;
44

5-
use Mockery as m;
6-
75
class KeysCommandTest extends PassportTestCase
86
{
9-
protected function tearDown(): void
10-
{
11-
m::close();
12-
13-
@unlink(self::PUBLIC_KEY);
14-
@unlink(self::PRIVATE_KEY);
15-
}
16-
177
public function testPrivateAndPublicKeysAreGenerated()
188
{
199
$this->assertFileExists(self::PUBLIC_KEY);

tests/Feature/PassportTestCase.php

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,65 +3,48 @@
33
namespace Laravel\Passport\Tests\Feature;
44

55
use Illuminate\Contracts\Config\Repository;
6-
use Illuminate\Foundation\Testing\RefreshDatabase;
6+
use Illuminate\Foundation\Testing\LazilyRefreshDatabase;
77
use Laravel\Passport\Passport;
8-
use Laravel\Passport\PassportServiceProvider;
8+
use Orchestra\Testbench\Concerns\WithWorkbench;
99
use Orchestra\Testbench\TestCase;
10+
use Workbench\App\Models\User;
1011

1112
abstract class PassportTestCase extends TestCase
1213
{
13-
use RefreshDatabase;
14+
use LazilyRefreshDatabase, WithWorkbench;
1415

1516
const KEYS = __DIR__.'/../keys';
1617
const PUBLIC_KEY = self::KEYS.'/oauth-public.key';
1718
const PRIVATE_KEY = self::KEYS.'/oauth-private.key';
1819

1920
protected function setUp(): void
2021
{
21-
parent::setUp();
22+
$this->afterApplicationCreated(function () {
23+
Passport::loadKeysFrom(self::KEYS);
2224

23-
$this->artisan('migrate:fresh');
25+
@unlink(self::PUBLIC_KEY);
26+
@unlink(self::PRIVATE_KEY);
2427

25-
Passport::loadKeysFrom(self::KEYS);
28+
$this->artisan('passport:keys');
29+
});
2630

27-
@unlink(self::PUBLIC_KEY);
28-
@unlink(self::PRIVATE_KEY);
31+
$this->beforeApplicationDestroyed(function () {
32+
@unlink(self::PUBLIC_KEY);
33+
@unlink(self::PRIVATE_KEY);
34+
});
2935

30-
$this->artisan('passport:keys');
36+
parent::setUp();
3137
}
3238

33-
protected function getEnvironmentSetUp($app)
39+
protected function defineEnvironment($app)
3440
{
3541
$config = $app->make(Repository::class);
3642

37-
$config->set('auth.defaults.provider', 'users');
38-
39-
if (($userClass = $this->getUserClass()) !== null) {
40-
$config->set('auth.providers.users.model', $userClass);
41-
}
42-
43-
$config->set('auth.guards.api', ['driver' => 'passport', 'provider' => 'users']);
44-
45-
$app['config']->set('database.default', 'testbench');
46-
47-
$app['config']->set('database.connections.testbench', [
48-
'driver' => 'sqlite',
49-
'database' => ':memory:',
50-
'prefix' => '',
43+
$config->set([
44+
'auth.defaults.provider' => 'users',
45+
'auth.providers.users.model' => User::class,
46+
'auth.guards.api' => ['driver' => 'passport', 'provider' => 'users'],
47+
'database.default' => 'testing',
5148
]);
5249
}
53-
54-
protected function getPackageProviders($app)
55-
{
56-
return [PassportServiceProvider::class];
57-
}
58-
59-
/**
60-
* Get the Eloquent user model class name.
61-
*
62-
* @return string|null
63-
*/
64-
protected function getUserClass()
65-
{
66-
}
6750
}

workbench/app/Models/User.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Workbench\App\Models;
4+
5+
use Illuminate\Foundation\Auth\User as Authenticatable;
6+
use Illuminate\Notifications\Notifiable;
7+
use Laravel\Passport\HasApiTokens;
8+
9+
class User extends Authenticatable
10+
{
11+
use HasApiTokens, Notifiable;
12+
13+
/**
14+
* The attributes that are mass assignable.
15+
*
16+
* @var array<int, string>
17+
*/
18+
protected $fillable = [
19+
'name',
20+
'email',
21+
'password',
22+
];
23+
24+
/**
25+
* The attributes that should be hidden for serialization.
26+
*
27+
* @var array<int, string>
28+
*/
29+
protected $hidden = [
30+
'password',
31+
'remember_token',
32+
];
33+
34+
/**
35+
* The attributes that should be cast.
36+
*
37+
* @var array<string, string>
38+
*/
39+
protected $casts = [
40+
'email_verified_at' => 'datetime',
41+
];
42+
}

0 commit comments

Comments
 (0)