diff --git a/src/Internal/AttributeProvider.php b/src/Internal/AttributeProvider.php new file mode 100644 index 0000000..d0c73e6 --- /dev/null +++ b/src/Internal/AttributeProvider.php @@ -0,0 +1,85 @@ + $name + * + * @return list + */ + public static function getAttributes(KernelTestCase $testCase, string $name): array + { + $class = new \ReflectionClass($testCase); + $method = $class->getMethod($testCase->getName(false)); + + $attributes = [ + ...self::doGetAttributes($class, $name), + ...self::doGetAttributes($method, $name), + ...self::getAttributesFromProvidedData($testCase, $name), + ]; + + // remove them from the arguments passed to the test method + self::removeAttributesFromProvidedData($testCase, $name); + + return $attributes; + } + + /** + * @template T + * + * @param class-string $name + * + * @return list + */ + private static function doGetAttributes(\ReflectionClass|\ReflectionMethod $source, string $name): array + { + $attributes = []; + foreach ($source->getAttributes($name, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) { + $attributes[] = $attribute->newInstance(); + } + + return $attributes; + } + + /** + * @template T + * + * @param class-string $name + * + * @return list + */ + private static function getAttributesFromProvidedData(KernelTestCase $testCase, string $name): array + { + $attributes = []; + foreach ($testCase->getProvidedData() as $data) { + if ($data instanceof $name) { + $attributes[] = $data; + } + } + + return $attributes; + } + + /** + * @param class-string $name + */ + private static function removeAttributesFromProvidedData(KernelTestCase $testCase, string $name): void + { + if ([] === $providedData = $testCase->getProvidedData()) { + return; + } + + $filteredData = array_values(array_filter($providedData, fn ($data) => !$data instanceof $name)); + + (new \ReflectionProperty(TestCase::class, 'data'))->setValue($testCase, $filteredData); + } +} diff --git a/src/KernelTestCase.php b/src/KernelTestCase.php index 37ab67c..2f82aa2 100644 --- a/src/KernelTestCase.php +++ b/src/KernelTestCase.php @@ -4,12 +4,16 @@ namespace Neusta\Pimcore\TestingFramework; use Neusta\Pimcore\TestingFramework\Attribute\ConfigureKernel; -use PHPUnit\Framework\TestCase; +use Neusta\Pimcore\TestingFramework\Internal\AttributeProvider; abstract class KernelTestCase extends \Pimcore\Test\KernelTestCase { - /** @var list */ - private static iterable $kernelConfigurations = []; + /** + * @internal + * + * @var list + */ + private static array $kernelConfigurations = []; /** * @param array{config?: callable(TestKernel):void, environment?: string, debug?: bool, ...} $options @@ -17,7 +21,10 @@ abstract class KernelTestCase extends \Pimcore\Test\KernelTestCase protected static function createKernel(array $options = []): TestKernel { $kernel = parent::createKernel($options); - \assert($kernel instanceof TestKernel); + + if (!$kernel instanceof TestKernel) { + throw new \LogicException(sprintf('Kernel must be an instance of %s', TestKernel::class)); + } foreach (self::$kernelConfigurations as $configuration) { $configuration->configure($kernel); @@ -33,41 +40,18 @@ protected static function createKernel(array $options = []): TestKernel * * @before */ - public function _getKernelConfigurationFromAttributes(): void + public function _collectKernelConfigurations(): void { - $class = new \ReflectionClass($this); - $method = $class->getMethod($this->getName(false)); - $providedData = $this->getProvidedData(); - $configurations = []; - - foreach ($class->getAttributes(ConfigureKernel::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) { - $configurations[] = $attribute->newInstance(); - } - - foreach ($method->getAttributes(ConfigureKernel::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) { - $configurations[] = $attribute->newInstance(); - } - - if ([] !== $providedData) { - foreach ($providedData as $data) { - if ($data instanceof ConfigureKernel) { - $configurations[] = $data; - } - } - - // remove them from the arguments passed to the test method - (new \ReflectionProperty(TestCase::class, 'data'))->setValue($this, array_values(array_filter( - $providedData, - fn ($data) => !$data instanceof ConfigureKernel, - ))); - } - - self::$kernelConfigurations = $configurations; + self::$kernelConfigurations = AttributeProvider::getAttributes($this, ConfigureKernel::class); } - protected function tearDown(): void + /** + * @internal + * + * @after + */ + public function _resetKernelConfigurations(): void { self::$kernelConfigurations = []; - parent::tearDown(); } }