Search code examples
phplaravellaravel-passportlaravel-middleware

Problem in my test function trying to access group of routes


What I'm trying to test is to access some routes but these routes are in laratrust role middleware this role is the auth user must be super admin to go in this routes my problem is I don't know how to write this function.

I tried to make the user super admin in the test function like this

public function  Test()
{
    $user = factory(User::class)->create();
    $user->attachRole('superadministrator');
    $this->actingAs($user, 'api');

    $response = $this->json('GET', 'api/users');
    $response->assertStatus(200);
}

but it didn't work even I checked the data base this user is superadministrator and the test give like I'm not super admin

This is my api routes:

Route::group(['middleware' => ['auth:api', 'role:superadministrator']],
function()
{
    Route::apiResource('users', 'UserController');
}

This is my index function in UserController:

public function index()
{
    return Response()->json(User::all, 200);
}

What I'm expect is a function can access this route because there is more routes in this group and the rest of the tests depends on this function


Solution

  • I've never used Laratrust, but after a quick look at its source code, it looks like the issue is that you need to specify the api guard on your role middleware check. Add ,guard:api to your role middleware:

    Route::group(['middleware' => ['auth:api', 'role:superadministrator,guard:api']], function() {
        Route::apiResource('users', 'UserController');
    }
    

    In the role middleware check, if you don't specify the guard, it will use the default guard defined in your auth config (which is web if you haven't changed it). So, the middleware will be looking for the user from the web auth guard, which doesn't exist.

    The good news is, your test worked! It found a bug in your route definition.