Skip to content

Commit

Permalink
Extract AttributeProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
jdreesen committed Sep 3, 2024
1 parent fb1243f commit 2e09709
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 35 deletions.
85 changes: 85 additions & 0 deletions src/Internal/AttributeProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<?php
declare(strict_types=1);

namespace Neusta\Pimcore\TestingFramework\Internal;

use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/** @internal */
final class AttributeProvider
{
/**
* @template T
*
* @param class-string<T> $name
*
* @return list<T>
*/
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<T> $name
*
* @return list<T>
*/
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<T> $name
*
* @return list<T>
*/
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);
}
}
54 changes: 19 additions & 35 deletions src/KernelTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,27 @@
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<ConfigureKernel> */
private static iterable $kernelConfigurations = [];
/**
* @internal
*
* @var list<ConfigureKernel>
*/
private static array $kernelConfigurations = [];

/**
* @param array{config?: callable(TestKernel):void, environment?: string, debug?: bool, ...} $options
*/
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);
Expand All @@ -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();
}
}

0 comments on commit 2e09709

Please sign in to comment.