SuperSeller3000/tests/Unit/Infrastructure/Security/PermissionVoterTest.php

61 lines
1.9 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace App\Tests\Unit\Infrastructure\Security;
use App\Domain\Auth\User;
use App\Infrastructure\Security\PermissionVoter;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
final class PermissionVoterTest extends TestCase
{
private PermissionVoter $voter;
protected function setUp(): void
{
$this->voter = new PermissionVoter();
}
public function testGrantsWhenUserHasPermission(): void
{
$user = new User('admin@test.com', 'hash');
$user->grantPermission('articles.publish');
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
self::assertSame(VoterInterface::ACCESS_GRANTED, $this->voter->vote($token, null, ['PERM_articles.publish']));
}
public function testDeniesWhenUserLacksPermission(): void
{
$user = new User('user@test.com', 'hash');
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
self::assertSame(VoterInterface::ACCESS_DENIED, $this->voter->vote($token, null, ['PERM_articles.publish']));
}
public function testAbstainsForNonPrefixedAttribute(): void
{
$user = new User('user@test.com', 'hash');
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
self::assertSame(VoterInterface::ACCESS_ABSTAIN, $this->voter->vote($token, null, ['ROLE_ADMIN']));
}
public function testDeniesAfterPermissionRevoked(): void
{
$user = new User('user@test.com', 'hash');
$user->grantPermission('articles.delete');
$user->revokePermission('articles.delete');
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
self::assertSame(VoterInterface::ACCESS_DENIED, $this->voter->vote($token, null, ['PERM_articles.delete']));
}
}