| Current Path : /home/rtorresani/www/setup/src/Magento/Setup/Test/Unit/Mvc/Bootstrap/ |
| Current File : //home/rtorresani/www/setup/src/Magento/Setup/Test/Unit/Mvc/Bootstrap/InitParamListenerTest.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Setup\Test\Unit\Mvc\Bootstrap;
use Laminas\EventManager\EventManagerInterface;
use Laminas\EventManager\SharedEventManager;
use Laminas\Mvc\Application;
use Laminas\Mvc\MvcEvent;
use Laminas\ServiceManager\ServiceLocatorInterface;
use Laminas\ServiceManager\ServiceManager;
use Laminas\Stdlib\RequestInterface;
use Magento\Framework\App\Bootstrap as AppBootstrap;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem;
use Magento\Setup\Mvc\Bootstrap\InitParamListener;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
/**
* Test for \Magento\Setup\Mvc\Bootstrap\InitParamListener
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class InitParamListenerTest extends TestCase
{
/**
* @var InitParamListener
*/
private $listener;
/** callable[][] */
private $callbacks = [];
protected function setUp(): void
{
$this->listener = new InitParamListener();
}
public function testAttach()
{
$events = $this->prepareEventManager();
$this->listener->attach($events);
}
public function testDetach()
{
$events = $this->prepareEventManager();
$this->listener->attach($events);
$events->expects($this->once())->method('detach')->with([$this->listener, 'onBootstrap'])->willReturn(true);
$this->listener->detach($events);
}
public function testOnBootstrap()
{
/** @var MvcEvent|MockObject $mvcEvent */
$mvcEvent = $this->createMock(MvcEvent::class);
$mvcApplication = $this->getMockBuilder(Application::class)
->disableOriginalConstructor()
->getMock();
$mvcEvent->expects($this->once())->method('getApplication')->willReturn($mvcApplication);
$serviceManager = $this->createMock(ServiceManager::class);
$initParams[AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS][DirectoryList::ROOT] = ['path' => '/test'];
$serviceManager->expects($this->once())->method('get')
->willReturn($initParams);
$serviceManager->expects($this->exactly(2))->method('setService')
->withConsecutive(
[
DirectoryList::class,
$this->isInstanceOf(DirectoryList::class),
],
[
Filesystem::class,
$this->isInstanceOf(Filesystem::class),
]
);
$mvcApplication->expects($this->any())->method('getServiceManager')->willReturn($serviceManager);
$eventManager = $this->getMockForAbstractClass(EventManagerInterface::class);
$mvcApplication->expects($this->any())->method('getEventManager')->willReturn($eventManager);
$eventManager->expects($this->any())->method('attach');
$this->listener->onBootstrap($mvcEvent);
}
public function testCreateDirectoryList()
{
$initParams[AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] =
[DirectoryList::ROOT => [DirectoryList::PATH => '/test/root']];
$directoryList = $this->listener->createDirectoryList($initParams);
$this->assertEquals('/test/root/app', $directoryList->getPath(DirectoryList::APP));
}
public function testCreateDirectoryListException()
{
$this->expectException('LogicException');
$this->expectExceptionMessage('Magento root directory is not specified.');
$this->listener->createDirectoryList([]);
}
/**
* @param array $zfAppConfig Data that comes from Laminas Framework Application config
* @param array $env Config that comes from SetEnv
* @param array|string|null $argv Argv
* @param array $expectedArray Expected result array
*
* @dataProvider createServiceDataProvider
*/
public function testCreateService($zfAppConfig, $env, $argv, $expectedArray)
{
foreach ($env as $envKey => $envValue) {
$_SERVER[$envKey] = $envValue;
}
$listener = new InitParamListener();
/**
* @var ServiceLocatorInterface|MockObject $serviceLocator
*/
$serviceLocator = $this->getMockForAbstractClass(ServiceLocatorInterface::class);
$mvcApplication = $this->getMockBuilder(Application::class)
->disableOriginalConstructor()
->getMock();
if ($argv !== null) {
$zfAppConfig['argv'] = $argv;
$expectedArray['argv'] = $argv;
}
$mvcApplication->expects($this->any())->method('getConfig')->willReturn(
$zfAppConfig ? [InitParamListener::BOOTSTRAP_PARAM => $zfAppConfig] : []
);
$serviceLocator->expects($this->once())->method('get')->with('Application')
->willReturn($mvcApplication);
$this->assertEquals($expectedArray, $listener->createService($serviceLocator));
}
/**
* @return array
*/
public function createServiceDataProvider()
{
return [
'none' => [
[], //zfAppConfig
[], //env
null, //argv
[] //expectedArray
],
'mage_mode App' => [
['MAGE_MODE' => 'developer'],
[],
'', //test non array value
['MAGE_MODE' => 'developer']
],
'mage_mode Env' => [
[],
['MAGE_MODE' => 'developer'],
null,
['MAGE_MODE' => 'developer']
],
'mage_mode CLI' => [
[],
[],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer'],
['MAGE_MODE' => 'developer']
],
'one MAGE_DIRS CLI' => [
[],
[],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer&MAGE_DIRS[base][path]=/var/www/magento2'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2']], 'MAGE_MODE' => 'developer'],
],
'two MAGE_DIRS CLI' => [
[],
[],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer&MAGE_DIRS[base][path]=/var/www/magento2&MAGE_DIRS[cache][path]=/tmp/cache'],
[
'MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2'], 'cache' => ['path' => '/tmp/cache']],
'MAGE_MODE' => 'developer',
],
],
'mage_mode only' => [
[],
[],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer'],
['MAGE_MODE' => 'developer']
],
'MAGE_DIRS Env' => [
[],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2']], 'MAGE_MODE' => 'developer'],
null,
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2']], 'MAGE_MODE' => 'developer'],
],
'two MAGE_DIRS' => [
[],
[],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer&MAGE_DIRS[base][path]=/var/www/magento2&MAGE_DIRS[cache][path]=/tmp/cache'],
[
'MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2'], 'cache' => ['path' => '/tmp/cache']],
'MAGE_MODE' => 'developer',
],
],
'Env overwrites App' => [
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/App']], 'MAGE_MODE' => 'developer'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']], 'MAGE_MODE' => 'developer'],
['bin/magento', 'setup:install'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']], 'MAGE_MODE' => 'developer'],
],
'CLI overwrites Env' => [
['MAGE_MODE' => 'developer'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']]],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_DIRS[base][path]=/var/www/magento2/CLI'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/CLI']], 'MAGE_MODE' => 'developer'],
],
'CLI overwrites All' => [
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/App']], 'MAGE_MODE' => 'production'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']]],
['bin/magento', 'setup:install', '--magento-init-params=MAGE_DIRS[base][path]=/var/www/magento2/CLI'],
['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/CLI']], 'MAGE_MODE' => 'developer'],
],
];
}
public function testCreateFilesystem()
{
$testPath = 'test/path/';
/**
* @var DirectoryList|
* \PHPUnit\Framework\MockObject\MockObject $directoryList
*/
$directoryList = $this->getMockBuilder(DirectoryList::class)
->disableOriginalConstructor()
->getMock();
$directoryList->expects($this->any())->method('getPath')->willReturn($testPath);
$filesystem = $this->listener->createFilesystem($directoryList);
// Verifies the filesystem was created with the directory list passed in
$this->assertEquals($testPath, $filesystem->getDirectoryRead('app')->getAbsolutePath());
}
/**
* Prepare the event manager with a SharedEventManager, it will expect attach() to be called once.
*
* @return MockObject
*/
private function prepareEventManager()
{
$this->callbacks[] = [$this->listener, 'onBootstrap'];
/** @var EventManagerInterface|MockObject $events */
$eventManager = $this->getMockForAbstractClass(EventManagerInterface::class);
$sharedManager = $this->createMock(SharedEventManager::class);
$sharedManager->expects($this->once())->method('attach')->with(
Application::class,
MvcEvent::EVENT_BOOTSTRAP,
[$this->listener, 'onBootstrap']
);
$sharedManager->expects($this->once())->method('getListeners')->willReturn($this->callbacks);
$eventManager->expects($this->once())->method('getSharedManager')->willReturn($sharedManager);
return $eventManager;
}
}