Files
breadcrumb-the-shire/tests/Unit/Module/AddressBookAuthorizationPolicyTest.php
fs c328067aa6 refactor: align addressbook module to MintyPHP\Module\AddressBook namespace
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>
2026-03-18 22:20:54 +01:00

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);
}
}