ModeTest.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Deploy\Test\Unit\Model;
  7. use Magento\Config\Console\Command\ConfigSet\ProcessorFacadeFactory;
  8. use Magento\Config\Console\Command\ConfigSet\ProcessorFacade;
  9. use Magento\Config\Console\Command\EmulatedAdminhtmlAreaProcessor;
  10. use Magento\Deploy\App\Mode\ConfigProvider;
  11. use Magento\Deploy\Model\Filesystem;
  12. use Magento\Deploy\Model\Mode;
  13. use Magento\Framework\App\Config\ScopeConfigInterface;
  14. use Magento\Framework\App\Console\MaintenanceModeEnabler;
  15. use Magento\Framework\App\DeploymentConfig\Reader;
  16. use Magento\Framework\App\DeploymentConfig\Writer;
  17. use Magento\Framework\App\MaintenanceMode;
  18. use Magento\Framework\App\State;
  19. use PHPUnit_Framework_MockObject_MockObject as Mock;
  20. use Symfony\Component\Console\Input\InputInterface;
  21. use Symfony\Component\Console\Output\OutputInterface;
  22. use Magento\Framework\Config\File\ConfigFilePool;
  23. use Magento\Framework\Exception\LocalizedException;
  24. /**
  25. * @inheritdoc
  26. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  27. */
  28. class ModeTest extends \PHPUnit\Framework\TestCase
  29. {
  30. /**
  31. * @var Mode
  32. */
  33. private $model;
  34. /**
  35. * @var Reader|Mock
  36. */
  37. private $readerMock;
  38. /**
  39. * @var InputInterface|Mock
  40. */
  41. private $inputMock;
  42. /**
  43. * @var OutputInterface|Mock
  44. */
  45. private $outputMock;
  46. /**
  47. * @var Writer|Mock
  48. */
  49. private $writerMock;
  50. /**
  51. * @var MaintenanceMode|Mock
  52. */
  53. private $maintenanceMock;
  54. /**
  55. * @var Filesystem|Mock
  56. */
  57. private $filesystemMock;
  58. /**
  59. * @var ConfigProvider|Mock
  60. */
  61. private $configProvider;
  62. /**
  63. * @var ProcessorFacadeFactory|Mock
  64. */
  65. private $processorFacadeFactory;
  66. /**
  67. * @var ProcessorFacade|Mock
  68. */
  69. private $processorFacade;
  70. /**
  71. * @var EmulatedAdminhtmlAreaProcessor|Mock
  72. */
  73. private $emulatedAreaProcessor;
  74. protected function setUp()
  75. {
  76. $this->inputMock = $this->getMockBuilder(InputInterface::class)
  77. ->getMockForAbstractClass();
  78. $this->outputMock = $this->getMockBuilder(OutputInterface::class)
  79. ->getMockForAbstractClass();
  80. $this->writerMock = $this->getMockBuilder(Writer::class)
  81. ->disableOriginalConstructor()
  82. ->getMock();
  83. $this->readerMock = $this->getMockBuilder(Reader::class)
  84. ->disableOriginalConstructor()
  85. ->getMock();
  86. $this->maintenanceMock = $this->getMockBuilder(MaintenanceMode::class)
  87. ->disableOriginalConstructor()
  88. ->getMock();
  89. $this->filesystemMock = $this->getMockBuilder(Filesystem::class)
  90. ->disableOriginalConstructor()
  91. ->getMock();
  92. $this->configProvider = $this->getMockBuilder(ConfigProvider::class)
  93. ->disableOriginalConstructor()
  94. ->getMock();
  95. $this->processorFacadeFactory = $this->getMockBuilder(ProcessorFacadeFactory::class)
  96. ->disableOriginalConstructor()
  97. ->setMethods(['create'])
  98. ->getMockForAbstractClass();
  99. $this->processorFacade = $this->getMockBuilder(ProcessorFacade::class)
  100. ->disableOriginalConstructor()
  101. ->getMock();
  102. $this->emulatedAreaProcessor = $this->getMockBuilder(EmulatedAdminhtmlAreaProcessor::class)
  103. ->disableOriginalConstructor()
  104. ->getMock();
  105. $this->model = new Mode(
  106. $this->inputMock,
  107. $this->outputMock,
  108. $this->writerMock,
  109. $this->readerMock,
  110. $this->maintenanceMock,
  111. $this->filesystemMock,
  112. $this->configProvider,
  113. $this->processorFacadeFactory,
  114. $this->emulatedAreaProcessor,
  115. new MaintenanceModeEnabler($this->maintenanceMock)
  116. );
  117. }
  118. public function testGetMode()
  119. {
  120. $this->readerMock->expects($this->exactly(2))
  121. ->method('load')
  122. ->willReturnOnConsecutiveCalls(
  123. [],
  124. [State::PARAM_MODE => State::MODE_DEVELOPER]
  125. );
  126. $this->assertSame(null, $this->model->getMode());
  127. $this->assertSame(State::MODE_DEVELOPER, $this->model->getMode());
  128. }
  129. /**
  130. * Test that production mode will be enabled before static generation call.
  131. * We need this to be sure that "min" files will be generated.
  132. */
  133. public function testEnableProductionMode()
  134. {
  135. $mode = State::MODE_DEVELOPER;
  136. $modeModel = $this->model;
  137. $dataStorage = [
  138. ConfigFilePool::APP_ENV => [
  139. State::PARAM_MODE => State::MODE_DEVELOPER,
  140. ],
  141. ];
  142. $this->configProvider->expects($this->any())
  143. ->method('getConfigs')
  144. ->willReturn([]);
  145. $this->writerMock->expects($this->once())
  146. ->method("saveConfig")
  147. ->willReturnCallback(function ($data) use (&$dataStorage) {
  148. $dataStorage = $data;
  149. });
  150. $this->readerMock->expects($this->any())
  151. ->method('load')
  152. ->willReturnCallback(function () use (&$dataStorage) {
  153. return $dataStorage[ConfigFilePool::APP_ENV];
  154. });
  155. $this->filesystemMock->expects($this->once())
  156. ->method("regenerateStatic")
  157. ->willReturnCallback(function () use (&$modeModel, &$mode) {
  158. $mode = $modeModel->getMode();
  159. });
  160. $this->model->enableProductionMode();
  161. $this->assertEquals(State::MODE_PRODUCTION, $mode);
  162. }
  163. /**
  164. * Test that previous mode will be enabled after error during static generation call.
  165. * We need this to be sure that mode will be reverted to it previous tate.
  166. *
  167. * @expectedException \Magento\Framework\Exception\LocalizedException
  168. */
  169. public function testEnableDeveloperModeOnFail()
  170. {
  171. $mode = State::MODE_DEVELOPER;
  172. $dataStorage = [
  173. ConfigFilePool::APP_ENV => [
  174. State::PARAM_MODE => State::MODE_DEVELOPER,
  175. ],
  176. ];
  177. $this->readerMock->expects($this->any())
  178. ->method('load')
  179. ->willReturn([State::PARAM_MODE => State::MODE_DEVELOPER]);
  180. $this->configProvider->expects($this->any())
  181. ->method('getConfigs')
  182. ->willReturn([]);
  183. $this->writerMock->expects($this->exactly(2))
  184. ->method("saveConfig")
  185. ->withConsecutive(
  186. [$this->equalTo([ConfigFilePool::APP_ENV => [State::PARAM_MODE => State::MODE_PRODUCTION]])],
  187. [$this->equalTo([ConfigFilePool::APP_ENV => [State::PARAM_MODE => State::MODE_DEVELOPER]])]
  188. )
  189. ->willReturnCallback(function ($data) use (&$dataStorage) {
  190. $dataStorage = $data;
  191. });
  192. $this->readerMock->expects($this->any())
  193. ->method('load')
  194. ->willReturnCallback(function () use (&$dataStorage) {
  195. return $dataStorage[ConfigFilePool::APP_ENV];
  196. });
  197. $this->filesystemMock->expects($this->once())
  198. ->method("regenerateStatic")
  199. ->willThrowException(new LocalizedException(__('Exception')));
  200. $this->model->enableProductionMode();
  201. $this->assertEquals(State::MODE_PRODUCTION, $mode);
  202. }
  203. public function testEnableProductionModeMinimal()
  204. {
  205. $this->readerMock->expects($this->once())
  206. ->method('load')
  207. ->willReturn([State::PARAM_MODE => State::MODE_DEVELOPER]);
  208. $this->configProvider->expects($this->once())
  209. ->method('getConfigs')
  210. ->with('developer', 'production')
  211. ->willReturn([
  212. 'dev/debug/debug_logging' => 0,
  213. ]);
  214. $this->emulatedAreaProcessor->expects($this->once())
  215. ->method('process')
  216. ->willReturnCallback(function (\Closure $closure) {
  217. return $closure->call($this->model);
  218. });
  219. $this->processorFacadeFactory->expects($this->once())
  220. ->method('create')
  221. ->willReturn($this->processorFacade);
  222. $this->processorFacade
  223. ->expects($this->once())
  224. ->method('processWithLockTarget')
  225. ->with(
  226. 'dev/debug/debug_logging',
  227. 0,
  228. ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
  229. null,
  230. true
  231. );
  232. $this->outputMock->expects($this->once())
  233. ->method('writeln')
  234. ->with('Config "dev/debug/debug_logging = 0" has been saved.');
  235. $this->model->enableProductionModeMinimal();
  236. }
  237. }