forked from fa/breadcrumb-the-shire
Migrates addressbook service classes from core namespace (MintyPHP\Service\AddressBook\*) to proper module namespace (MintyPHP\Module\AddressBook\Service\*), consistent with the bookmarks module pattern. Moved to module: - AddressBookService → modules/addressbook/lib/Module/AddressBook/Service/ - AddressBookServicesFactory → modules/addressbook/lib/Module/AddressBook/Service/ - AddressBookServiceTest → modules/addressbook/tests/Module/AddressBook/Service/ - Pages, templates, CSS, JS all in module directory All module PHP classes now live under MintyPHP\Module\<Name>\*, enforced by ModuleStructureContractTest::testModuleClassesUseModuleNamespace. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
88 lines
3.1 KiB
PHP
88 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace MintyPHP\Tests\Unit\Module;
|
|
|
|
use MintyPHP\Module\AddressBook\AddressBookAuthorizationPolicy;
|
|
use MintyPHP\Service\Access\AuthorizationPolicyInterface;
|
|
use MintyPHP\Service\Access\PermissionService;
|
|
use MintyPHP\Tests\Service\Access\AuthorizationPolicyTestSupport;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @covers \MintyPHP\Module\AddressBook\AddressBookAuthorizationPolicy
|
|
*/
|
|
final class AddressBookAuthorizationPolicyTest extends TestCase
|
|
{
|
|
use AuthorizationPolicyTestSupport;
|
|
|
|
public function testImplementsInterface(): void
|
|
{
|
|
$policy = new AddressBookAuthorizationPolicy($this->createMock(PermissionService::class));
|
|
self::assertInstanceOf(AuthorizationPolicyInterface::class, $policy);
|
|
}
|
|
|
|
public function testSupportsOwnAbility(): void
|
|
{
|
|
$policy = new AddressBookAuthorizationPolicy($this->createMock(PermissionService::class));
|
|
self::assertTrue($policy->supports(AddressBookAuthorizationPolicy::ABILITY_VIEW));
|
|
}
|
|
|
|
public function testDoesNotSupportOtherAbilities(): void
|
|
{
|
|
$policy = new AddressBookAuthorizationPolicy($this->createMock(PermissionService::class));
|
|
self::assertFalse($policy->supports('ops.admin.jobs.view'));
|
|
self::assertFalse($policy->supports(''));
|
|
self::assertFalse($policy->supports('ops.address_book.view')); // old ability string
|
|
}
|
|
|
|
public function testAllowedWithPermission(): void
|
|
{
|
|
$permissionService = $this->permissionGatewayAllowing([
|
|
5 => [PermissionService::ADDRESS_BOOK_VIEW],
|
|
]);
|
|
|
|
$policy = new AddressBookAuthorizationPolicy($permissionService);
|
|
$decision = $policy->authorize(AddressBookAuthorizationPolicy::ABILITY_VIEW, [
|
|
'actor_user_id' => 5,
|
|
]);
|
|
|
|
self::assertTrue($decision->isAllowed());
|
|
}
|
|
|
|
public function testDeniedWithoutPermission(): void
|
|
{
|
|
$permissionService = $this->permissionGatewayAllowing([5 => []]);
|
|
|
|
$policy = new AddressBookAuthorizationPolicy($permissionService);
|
|
$decision = $policy->authorize(AddressBookAuthorizationPolicy::ABILITY_VIEW, [
|
|
'actor_user_id' => 5,
|
|
]);
|
|
|
|
$this->assertForbiddenDecision($decision);
|
|
}
|
|
|
|
public function testDeniedWithZeroActorId(): void
|
|
{
|
|
$permissionService = $this->createMock(PermissionService::class);
|
|
$permissionService->expects($this->never())->method('userHas');
|
|
|
|
$policy = new AddressBookAuthorizationPolicy($permissionService);
|
|
$decision = $policy->authorize(AddressBookAuthorizationPolicy::ABILITY_VIEW, [
|
|
'actor_user_id' => 0,
|
|
]);
|
|
|
|
$this->assertForbiddenDecision($decision);
|
|
}
|
|
|
|
public function testDeniedWithMissingActorId(): void
|
|
{
|
|
$permissionService = $this->createMock(PermissionService::class);
|
|
$permissionService->expects($this->never())->method('userHas');
|
|
|
|
$policy = new AddressBookAuthorizationPolicy($permissionService);
|
|
$decision = $policy->authorize(AddressBookAuthorizationPolicy::ABILITY_VIEW, []);
|
|
|
|
$this->assertForbiddenDecision($decision);
|
|
}
|
|
}
|