diff --git a/php-packages/testing/src/integration/Extend/OverrideExtensionManagerForTests.php b/php-packages/testing/src/integration/Extend/OverrideExtensionManagerForTests.php new file mode 100644 index 000000000..a975cdab7 --- /dev/null +++ b/php-packages/testing/src/integration/Extend/OverrideExtensionManagerForTests.php @@ -0,0 +1,35 @@ +<?php + +namespace Flarum\Testing\integration\Extend; + +use Flarum\Extend\ExtenderInterface; +use Flarum\Extension\Extension; +use Flarum\Testing\integration\Extension\ExtensionManagerIncludeCurrent; +use Illuminate\Contracts\Container\Container; + +class OverrideExtensionManagerForTests implements ExtenderInterface +{ + /** + * IDs of extensions to boot + */ + protected $extensions; + + public function __construct($extensions) + { + $this->extensions = $extensions; + } + + public function extend(Container $container, Extension $extension = null) + { + if (count($this->extensions)) { + $container->bind(ExtensionManager::class, ExtensionManagerIncludeCurrent::class); + $extensionManager = $container->make(ExtensionManager::class); + + foreach ($this->extensions as $extension) { + $extensionManager->enable($extension); + } + + $extensionManager->extend($container); + } + } +} diff --git a/php-packages/testing/src/integration/Extension/ExtensionManagerIncludeCurrent.php b/php-packages/testing/src/integration/Extension/ExtensionManagerIncludeCurrent.php new file mode 100644 index 000000000..0d869b8d8 --- /dev/null +++ b/php-packages/testing/src/integration/Extension/ExtensionManagerIncludeCurrent.php @@ -0,0 +1,42 @@ +<?php + +/* + * This file is part of Flarum. + * + * For detailed copyright and license information, please view the + * LICENSE file that was distributed with this source code. + */ + +namespace Flarum\Testing\integration\Extension; + +use Flarum\Extension\Extension; +use Flarum\Extension\ExtensionManager; +use Illuminate\Support\Arr; + +class ExtensionManagerIncludeCurrent extends ExtensionManager +{ + /** + * @return Collection + */ + public function getExtensions() + { + $extensions = parent::getExtensions(); + + $package = json_decode($this->filesystem->get($this->paths->vendor . '/../composer.json'), true); + + if (Arr::get($package, 'type') === 'flarum-extension') { + $current = new Extension($this->paths->vendor . '/../', $package); + $current->setInstalled(true); + $current->setVersion(Arr::get($package, 'version')); + $current->calculateDependencies([]); + + $extensions->put($current->getId(), $current); + + $this->extensions = $extensions->sortBy(function ($extension, $name) { + return $extension->composerJsonAttribute('extra.flarum-extension.title'); + }); + } + + return $this->extensions; + } +} diff --git a/php-packages/testing/src/integration/TestCase.php b/php-packages/testing/src/integration/TestCase.php index ad6986a83..7b385b173 100644 --- a/php-packages/testing/src/integration/TestCase.php +++ b/php-packages/testing/src/integration/TestCase.php @@ -13,6 +13,7 @@ use Flarum\Extend\ExtenderInterface; use Flarum\Foundation\Config; use Flarum\Foundation\InstalledSite; use Flarum\Foundation\Paths; +use Flarum\Testing\integration\Extend\OverrideExtensionManagerForTests; use Illuminate\Database\ConnectionInterface; use Laminas\Diactoros\ServerRequest; use Psr\Http\Message\ResponseInterface; @@ -51,10 +52,14 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase 'public' => __DIR__.'/tmp/public', 'storage' => __DIR__.'/tmp/storage', ]), - new Config(include __DIR__.'/tmp/config.php') + new Config(include __DIR__ . '/tmp/config.php') ); - $site->extendWith($this->extenders); + $extenders = array_merge([ + new OverrideExtensionManagerForTests($this->extensions) + ], $this->extenders); + + $site->extendWith($extenders); $this->app = $site->bootApp(); @@ -76,6 +81,16 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase $this->extenders = array_merge($this->extenders, $extenders); } + /** + * @var string[] + */ + protected $extensions = []; + + protected function extension(string ...$extensions) + { + $this->extensions = array_merge($this->extensions, $extensions); + } + /** * @var RequestHandlerInterface */