Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Testing Passport Authenticated Controllers and Routes in Laravel
{
...
"autoload-dev": {
"classmap": [
"tests/TestCase.php",
"tests/PassportTestCase.php"
]
},
...
}
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExamplePassportTest extends \PassportTestCase
{
use DatabaseTransactions;
protected $scopes = ['restricted-scope'];
public function testRestrictedRoute()
{
$this->get('/api/user')
->assertResponseStatus(401);
}
public function testUnrestrictedRoute()
{
$this->get('/api/restricted')
->assertResponseOk();
}
}
<?php
use App\User;
use Laravel\Passport\ClientRepository;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class PassportTestCase extends TestCase
{
use DatabaseTransactions;
protected $headers = [];
protected $scopes = [];
protected $user;
public function setUp()
{
parent::setUp();
$clientRepository = new ClientRepository();
$client = $clientRepository->createPersonalAccessClient(
null, 'Test Personal Access Client', $this->baseUrl
);
DB::table('oauth_personal_access_clients')->insert([
'client_id' => $client->id,
'created_at' => new DateTime,
'updated_at' => new DateTime,
]);
$this->user = factory(User::class)->create();
$token = $this->user->createToken('TestToken', $this->scopes)->accessToken;
$this->headers['Accept'] = 'application/json';
$this->headers['Authorization'] = 'Bearer '.$token;
}
public function get($uri, array $headers = [])
{
return parent::get($uri, array_merge($this->headers, $headers));
}
public function getJson($uri, array $headers = [])
{
return parent::getJson($uri, array_merge($this->headers, $headers));
}
public function post($uri, array $data = [], array $headers = [])
{
return parent::post($uri, $data, array_merge($this->headers, $headers));
}
public function postJson($uri, array $data = [], array $headers = [])
{
return parent::postJson($uri, $data, array_merge($this->headers, $headers));
}
public function put($uri, array $data = [], array $headers = [])
{
return parent::put($uri, $data, array_merge($this->headers, $headers));
}
public function putJson($uri, array $data = [], array $headers = [])
{
return parent::putJson($uri, $data, array_merge($this->headers, $headers));
}
public function patch($uri, array $data = [], array $headers = [])
{
return parent::patch($uri, $data, array_merge($this->headers, $headers));
}
public function patchJson($uri, array $data = [], array $headers = [])
{
return parent::patchJson($uri, $data, array_merge($this->headers, $headers));
}
public function delete($uri, array $data = [], array $headers = [])
{
return parent::delete($uri, $data, array_merge($this->headers, $headers));
}
public function deleteJson($uri, array $data = [], array $headers = [])
{
return parent::deleteJson($uri, $data, array_merge($this->headers, $headers));
}
}
@ronnievisser
Copy link

ronnievisser commented Nov 3, 2016

Hi,

I'm having an issue that migration are not applied when migrating in tests. Do you have a solution for this also?

thanks

Copy link

ghost commented Dec 30, 2016

Same issues for me : " no such table : oauth_clients"

@archy-bold
Copy link
Author

archy-bold commented Jun 16, 2017

Sorry, I didn't get any notifications for this gist for some reason. You need to ensure Passport is installed and running on your Laravel app. You can do that as follows:

Install with composer:

composer require laravel/passport

Then add the following to the providers array of your app/config.php file:

Laravel\Passport\PassportServiceProvider::class,

Finally, run the setup for Passport:

php artisan migrate
php artisan passport:install

Source: https://laravel.com/docs/5.4/passport#installation

@jesseschutt
Copy link

jesseschutt commented Aug 16, 2017

Thanks for writing this up! It helped me :D

@kingsleyudenewu
Copy link

kingsleyudenewu commented Aug 2, 2018

Hi please can i do a test without using ClientRepository

@AhmedHelalAhmed
Copy link

AhmedHelalAhmed commented Aug 5, 2018

How about

  1. RestrictionPassportTest::testRestrictedRoute
    ErrorException: Undefined property: RestrictionPassportTest::$baseUrl

??

@hindermyertim
Copy link

hindermyertim commented Feb 5, 2019

How about

  1. RestrictionPassportTest::testRestrictedRoute
    ErrorException: Undefined property: RestrictionPassportTest::$baseUrl

??

Ya same issue here.

@datashaman
Copy link

datashaman commented Feb 23, 2019

Instead of using $this->baseUrl, just use an empty string ''.

@datashaman
Copy link

datashaman commented Feb 23, 2019

With Laravel 5.4+ you can use this very simple method to test passport routes: https://laravel.com/docs/5.7/passport#testing

@hfatahi
Copy link

hfatahi commented Feb 27, 2019

@archy-bold Is this any different than simply calling Passport::actingAs()?

@hemantachhami19
Copy link

hemantachhami19 commented Aug 13, 2020

searching for this .you saved my life sir . thank you 👍

@archy-bold
Copy link
Author

archy-bold commented Aug 13, 2020

Thanks @hemantachhami19, as has been said; you can just use Passport::actingAs($user) now instead of all this scaffolding.

Same for this @hfatahi @hindermyertim @AhmedHelalAhmed (only just got notifications)

@Maxcrazy1
Copy link

Maxcrazy1 commented Sep 2, 2021

Crack of cracks 👑

@cAstraea
Copy link

cAstraea commented Jan 22, 2022

@archy-bold do you have an example please ? I could never get actingAs to work in my tests... keep getting all sorts of weird errors like
BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::withAccessToken does not exist.

@archy-bold
Copy link
Author

archy-bold commented Jan 24, 2022

Hi @cAstraea. There's really not much to it, there's an example in the Passport documentation. If you're still experiencing errors, I imagine it's one of two things:

  1. You've not installed Passport correctly or not run the migrations on your test database. The documentation on installing should help you get it all set up. It will be worth checking the traits are on your model too.
  2. You might not be passing a single User model to the actingAs() function. Maybe it's worth dd()ing what you're passing to the function. It might be a QueryBuilder, or Collection object rather than a User model.

Hope that helps.

@cAstraea
Copy link

cAstraea commented Jan 27, 2022

Thanks yea that was it thank you 🤣 Dunno what I was thinking calling it on collection

@archy-bold
Copy link
Author

archy-bold commented Jan 28, 2022

@cAstraea I usually blame tiredness!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment