. * */ namespace Friendica\Test\src\Core\Hooks\Util; use Friendica\Core\Addon\Capabilities\ICanLoadAddons; use Friendica\Core\Hooks\Capabilities\ICanRegisterStrategies; use Friendica\Core\Hooks\Exceptions\HookConfigException; use Friendica\Core\Hooks\Util\StrategiesFileManager; use Friendica\Test\MockedTest; use Friendica\Test\Util\VFSTrait; use org\bovigo\vfs\vfsStream; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; class StrategiesFileManagerTest extends MockedTest { use VFSTrait; protected function setUp(): void { parent::setUp(); $this->setUpVfsDir(); } public function dataHooks(): array { return [ 'normal' => [ 'content' => << [ \Psr\Log\NullLogger::class => [''], ], ]; EOF, 'addonsArray' => [], 'assertStrategies' => [ [LoggerInterface::class, NullLogger::class, ''], ], ], 'normalWithString' => [ 'content' => << [ \Psr\Log\NullLogger::class => '', ], ]; EOF, 'addonsArray' => [], 'assertStrategies' => [ [LoggerInterface::class, NullLogger::class, ''], ], ], 'withAddons' => [ 'content' => << [ \Psr\Log\NullLogger::class => [''], ], ]; EOF, 'addonsArray' => [ \Psr\Log\LoggerInterface::class => [ \Psr\Log\NullLogger::class => ['null'], ], ], 'assertStrategies' => [ [LoggerInterface::class, NullLogger::class, ''], [LoggerInterface::class, NullLogger::class, 'null'], ], ], 'withAddonsWithString' => [ 'content' => << [ \Psr\Log\NullLogger::class => [''], ], ]; EOF, 'addonsArray' => [ \Psr\Log\LoggerInterface::class => [ \Psr\Log\NullLogger::class => 'null', ], ], 'assertStrategies' => [ [LoggerInterface::class, NullLogger::class, ''], [LoggerInterface::class, NullLogger::class, 'null'], ], ], // This should work because unique name convention is part of the instance manager logic, not of the file-infrastructure layer 'withAddonsDoubleNamed' => [ 'content' => << [ \Psr\Log\NullLogger::class => [''], ], ]; EOF, 'addonsArray' => [ \Psr\Log\LoggerInterface::class => [ \Psr\Log\NullLogger::class => [''], ], ], 'assertStrategies' => [ [LoggerInterface::class, NullLogger::class, ''], [LoggerInterface::class, NullLogger::class, ''], ], ], ]; } /** * @dataProvider dataHooks */ public function testSetupHooks(string $content, array $addonsArray, array $assertStrategies) { vfsStream::newFile(StrategiesFileManager::STATIC_DIR . '/' . StrategiesFileManager::CONFIG_NAME . '.config.php') ->withContent($content) ->at($this->root); $addonLoader = \Mockery::mock(ICanLoadAddons::class); $addonLoader->shouldReceive('getActiveAddonConfig')->andReturn($addonsArray)->once(); $hookFileManager = new StrategiesFileManager($this->root->url(), $addonLoader); $instanceManager = \Mockery::mock(ICanRegisterStrategies::class); foreach ($assertStrategies as $assertStrategy) { $instanceManager->shouldReceive('registerStrategy')->withArgs($assertStrategy)->once(); } $hookFileManager->loadConfig(); $hookFileManager->setupStrategies($instanceManager); self::expectNotToPerformAssertions(); } /** * Test the exception in case the strategies.config.php file is missing */ public function testMissingStrategiesFile() { $addonLoader = \Mockery::mock(ICanLoadAddons::class); $instanceManager = \Mockery::mock(ICanRegisterStrategies::class); $hookFileManager = new StrategiesFileManager($this->root->url(), $addonLoader); self::expectException(HookConfigException::class); self::expectExceptionMessage(sprintf('config file %s does not exist.', $this->root->url() . '/' . StrategiesFileManager::STATIC_DIR . '/' . StrategiesFileManager::CONFIG_NAME . '.config.php')); $hookFileManager->loadConfig(); } /** * Test the exception in case the strategies.config.php file is wrong */ public function testWrongStrategiesFile() { $addonLoader = \Mockery::mock(ICanLoadAddons::class); $instanceManager = \Mockery::mock(ICanRegisterStrategies::class); $hookFileManager = new StrategiesFileManager($this->root->url(), $addonLoader); vfsStream::newFile(StrategiesFileManager::STATIC_DIR . '/' . StrategiesFileManager::CONFIG_NAME . '.config.php') ->withContent("at($this->root); self::expectException(HookConfigException::class); self::expectExceptionMessage(sprintf('Error loading config file %s.', $this->root->url() . '/' . StrategiesFileManager::STATIC_DIR . '/' . StrategiesFileManager::CONFIG_NAME . '.config.php')); $hookFileManager->loadConfig(); } }