Files
michaelschiemer/tests/Framework/Attributes/Execution/AttributeRunnerTest.php
2025-11-24 21:28:25 +01:00

111 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Framework\Attributes\Execution;
use App\Framework\Attributes\Execution\AttributeExecutionContext;
use App\Framework\Attributes\Execution\AttributeRunner;
use App\Framework\Attributes\Execution\CallbackExecutor;
use App\Framework\Attributes\Guard;
use App\Framework\Core\ValueObjects\ClassName;
use App\Framework\Core\ValueObjects\MethodName;
use App\Framework\DI\Container;
use App\Framework\DI\DefaultContainer;
use App\Framework\DI\MethodInvoker;
use App\Framework\Discovery\Results\AttributeRegistry;
use App\Framework\Discovery\Results\DiscoveryRegistry;
use App\Framework\Discovery\ValueObjects\AttributeTarget;
use App\Framework\Discovery\ValueObjects\DiscoveredAttribute;
use App\Framework\Reflection\SimpleReflectionService;
use PHPUnit\Framework\TestCase;
final class AttributeRunnerTest extends TestCase
{
private Container $container;
private DiscoveryRegistry $discoveryRegistry;
private AttributeRunner $runner;
protected function setUp(): void
{
$this->container = new DefaultContainer();
$this->container->instance(MethodInvoker::class, new MethodInvoker(
$this->container,
new SimpleReflectionService()
));
$this->discoveryRegistry = new DiscoveryRegistry(
attributes: new AttributeRegistry()
);
$callbackExecutor = new CallbackExecutor($this->container);
$this->runner = new AttributeRunner(
discoveryRegistry: $this->discoveryRegistry,
container: $this->container,
callbackExecutor: $callbackExecutor
);
}
public function testExecuteAttributesReturnsEmptyArrayWhenNoAttributes(): void
{
$results = $this->runner->executeAttributes(Guard::class);
$this->assertIsArray($results);
$this->assertEmpty($results);
}
public function testExecuteAttributeReturnsNullForNonExecutable(): void
{
$discovered = new DiscoveredAttribute(
className: ClassName::create('TestClass'),
attributeClass: 'NonExecutableAttribute',
target: AttributeTarget::TARGET_CLASS
);
$result = $this->runner->executeAttribute($discovered);
$this->assertNull($result);
}
public function testExecuteForClass(): void
{
$className = ClassName::create('TestClass');
// Füge ein Guard-Attribut hinzu
$discovered = new DiscoveredAttribute(
className: $className,
attributeClass: Guard::class,
target: AttributeTarget::TARGET_CLASS,
arguments: [\App\Framework\Attributes\Execution\Handlers\PermissionGuard::class, [['edit_post']]]
);
$this->discoveryRegistry->attributes->add(Guard::class, $discovered);
$results = $this->runner->executeForClass($className, Guard::class);
$this->assertIsArray($results);
}
public function testExecuteForMethod(): void
{
$className = ClassName::create('TestClass');
$methodName = MethodName::create('testMethod');
// Füge ein Guard-Attribut hinzu
$discovered = new DiscoveredAttribute(
className: $className,
attributeClass: Guard::class,
target: AttributeTarget::METHOD,
methodName: $methodName,
arguments: [\App\Framework\Attributes\Execution\Handlers\PermissionGuard::class, [['edit_post']]]
);
$this->discoveryRegistry->attributes->add(Guard::class, $discovered);
$results = $this->runner->executeForMethod($className, $methodName, Guard::class);
$this->assertIsArray($results);
}
}