69 lines
1.9 KiB
PHP
69 lines
1.9 KiB
PHP
<?php
|
|
|
|
use App\Http\Middleware\CheckPermissions;
|
|
use App\Models\Permission;
|
|
use App\Models\Role;
|
|
use App\Models\User;
|
|
use Facades\Tests\Setup\UserFactory;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
$this->artisan('db:seed');
|
|
});
|
|
|
|
test('guest is blocked', function () {
|
|
$request = Request::create('/');
|
|
|
|
$this->expectException(HttpException::class);
|
|
|
|
permissionMiddleware()->handle($request, fn () => 'ok', 'users.manage');
|
|
});
|
|
|
|
test('user without permission is blocked', function () {
|
|
$user = UserFactory::user()->create();
|
|
$this->be($user);
|
|
|
|
$this->expectException(HttpException::class);
|
|
|
|
permissionMiddleware()->handle(permissionRequestFor($user), fn () => 'ok', 'users.manage');
|
|
});
|
|
|
|
test('user with permission passes', function () {
|
|
$user = UserFactory::withPermissions('users.manage')->create();
|
|
$this->be($user);
|
|
|
|
$response = permissionMiddleware()->handle(permissionRequestFor($user), fn () => 'ok', 'users.manage');
|
|
|
|
$this->assertSame('ok', $response);
|
|
});
|
|
|
|
test('multiple permissions separated by pipe', function () {
|
|
$role = Role::factory()->create();
|
|
$role->attachPermission(Permission::where('name', 'users.manage')->first());
|
|
$role->attachPermission(Permission::where('name', 'roles.manage')->first());
|
|
|
|
$user = User::factory()->create(['role_id' => $role->id]);
|
|
$this->be($user);
|
|
|
|
$response = permissionMiddleware()->handle(permissionRequestFor($user), fn () => 'ok', 'users.manage|roles.manage');
|
|
|
|
$this->assertSame('ok', $response);
|
|
});
|
|
|
|
function permissionRequestFor($user): Request
|
|
{
|
|
$request = Request::create('/');
|
|
$request->setUserResolver(fn () => $user);
|
|
|
|
return $request;
|
|
}
|
|
|
|
function permissionMiddleware(): CheckPermissions
|
|
{
|
|
return new CheckPermissions(auth()->guard());
|
|
}
|