AreaTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\App\Test\Unit;
  7. use \Magento\Framework\App\Area;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class AreaTest extends \PHPUnit\Framework\TestCase
  12. {
  13. const SCOPE_ID = '1';
  14. /**
  15. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  16. */
  17. protected $objectManager;
  18. /**
  19. * @var \Magento\Framework\Event\ManagerInterface | \PHPUnit_Framework_MockObject_MockObject
  20. */
  21. protected $eventManagerMock;
  22. /**
  23. * @var \Magento\Framework\ObjectManagerInterface | \PHPUnit_Framework_MockObject_MockObject
  24. */
  25. protected $objectManagerMock;
  26. /**
  27. * @var \Magento\Framework\App\ObjectManager\ConfigLoader | \PHPUnit_Framework_MockObject_MockObject
  28. */
  29. protected $diConfigLoaderMock;
  30. /**
  31. * @var \Magento\Framework\TranslateInterface | \PHPUnit_Framework_MockObject_MockObject
  32. */
  33. protected $translatorMock;
  34. /**
  35. * @var \Psr\Log\LoggerInterface | \PHPUnit_Framework_MockObject_MockObject
  36. */
  37. protected $loggerMock;
  38. /**
  39. * @var \Magento\Framework\App\DesignInterface | \PHPUnit_Framework_MockObject_MockObject
  40. */
  41. protected $designMock;
  42. /**
  43. * @var \Magento\Framework\App\ScopeResolverInterface | \PHPUnit_Framework_MockObject_MockObject
  44. */
  45. protected $scopeResolverMock;
  46. /**
  47. * @var \Magento\Framework\View\DesignExceptions | \PHPUnit_Framework_MockObject_MockObject
  48. */
  49. protected $designExceptionsMock;
  50. /**
  51. * @var string
  52. */
  53. protected $areaCode;
  54. /**
  55. * @var Area
  56. */
  57. protected $object;
  58. /** @var \Magento\Framework\Phrase\RendererInterface */
  59. private $defaultRenderer;
  60. protected function setUp()
  61. {
  62. $this->defaultRenderer = \Magento\Framework\Phrase::getRenderer();
  63. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  64. $this->loggerMock = $this->getMockBuilder(\Psr\Log\LoggerInterface::class)
  65. ->disableOriginalConstructor()
  66. ->getMock();
  67. $this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
  68. ->disableOriginalConstructor()
  69. ->getMock();
  70. $this->translatorMock = $this->getMockBuilder(\Magento\Framework\TranslateInterface::class)
  71. ->disableOriginalConstructor()
  72. ->getMock();
  73. $this->diConfigLoaderMock = $this->getMockBuilder(\Magento\Framework\App\ObjectManager\ConfigLoader::class)
  74. ->disableOriginalConstructor()
  75. ->getMock();
  76. $this->objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManagerInterface::class)
  77. ->disableOriginalConstructor()
  78. ->getMock();
  79. $this->designMock = $this->getMockBuilder(\Magento\Framework\App\DesignInterface::class)
  80. ->disableOriginalConstructor()
  81. ->getMock();
  82. $this->scopeResolverMock = $this->getMockBuilder(\Magento\Framework\App\ScopeResolverInterface::class)
  83. ->disableOriginalConstructor()
  84. ->getMock();
  85. $scopeMock = $this->getMockBuilder(\Magento\Framework\App\ScopeInterface::class)
  86. ->disableOriginalConstructor()
  87. ->getMock();
  88. $scopeMock->expects($this->any())
  89. ->method('getId')
  90. ->will($this->returnValue(self::SCOPE_ID));
  91. $this->scopeResolverMock->expects($this->any())
  92. ->method('getScope')
  93. ->will($this->returnValue($scopeMock));
  94. $this->designExceptionsMock = $this->getMockBuilder(\Magento\Framework\View\DesignExceptions::class)
  95. ->disableOriginalConstructor()
  96. ->getMock();
  97. $this->areaCode = Area::AREA_FRONTEND;
  98. $this->object = $this->objectManager->getObject(
  99. \Magento\Framework\App\Area::class,
  100. [
  101. 'logger' => $this->loggerMock,
  102. 'objectManager' => $this->objectManagerMock,
  103. 'eventManager' => $this->eventManagerMock,
  104. 'translator' => $this->translatorMock,
  105. 'diConfigLoader' => $this->diConfigLoaderMock,
  106. 'design' => $this->designMock,
  107. 'scopeResolver' => $this->scopeResolverMock,
  108. 'designExceptions' => $this->designExceptionsMock,
  109. 'areaCode' => $this->areaCode,
  110. ]
  111. );
  112. }
  113. public function tearDown()
  114. {
  115. \Magento\Framework\Phrase::setRenderer($this->defaultRenderer);
  116. }
  117. public function testLoadConfig()
  118. {
  119. $this->verifyLoadConfig();
  120. $this->object->load(Area::PART_CONFIG);
  121. }
  122. public function testLoadTranslate()
  123. {
  124. $this->translatorMock->expects($this->once())
  125. ->method('loadData');
  126. $renderMock = $this->getMockBuilder(\Magento\Framework\Phrase\RendererInterface::class)
  127. ->disableOriginalConstructor()
  128. ->getMock();
  129. $this->objectManagerMock->expects($this->once())
  130. ->method('get')
  131. ->with(\Magento\Framework\Phrase\RendererInterface::class)
  132. ->will($this->returnValue($renderMock));
  133. $this->object->load(Area::PART_TRANSLATE);
  134. }
  135. public function testLoadDesign()
  136. {
  137. $designMock = $this->getMockBuilder(\Magento\Framework\View\DesignInterface::class)
  138. ->disableOriginalConstructor()
  139. ->getMock();
  140. $this->objectManagerMock->expects($this->once())
  141. ->method('get')
  142. ->with(\Magento\Framework\View\DesignInterface::class)
  143. ->will($this->returnValue($designMock));
  144. $designMock->expects($this->once())
  145. ->method('setArea')
  146. ->with($this->areaCode)
  147. ->willReturnSelf();
  148. $designMock->expects($this->once())
  149. ->method('setDefaultDesignTheme');
  150. $this->object->load(Area::PART_DESIGN);
  151. }
  152. public function testLoadUnknownPart()
  153. {
  154. $this->objectManagerMock->expects($this->never())
  155. ->method('configure');
  156. $this->objectManagerMock->expects($this->never())
  157. ->method('get');
  158. $this->object->load('unknown part');
  159. }
  160. public function testLoad()
  161. {
  162. $this->verifyLoadConfig();
  163. $this->translatorMock->expects($this->once())
  164. ->method('loadData');
  165. $renderMock = $this->getMockBuilder(\Magento\Framework\Phrase\RendererInterface::class)
  166. ->disableOriginalConstructor()
  167. ->getMock();
  168. $designMock = $this->getMockBuilder(\Magento\Framework\View\DesignInterface::class)
  169. ->disableOriginalConstructor()
  170. ->getMock();
  171. $designMock->expects($this->once())
  172. ->method('setArea')
  173. ->with($this->areaCode)
  174. ->willReturnSelf();
  175. $designMock->expects($this->once())
  176. ->method('setDefaultDesignTheme');
  177. $this->objectManagerMock->expects($this->exactly(2))
  178. ->method('get')
  179. ->will($this->returnValueMap(
  180. [
  181. [\Magento\Framework\Phrase\RendererInterface::class, $renderMock],
  182. [\Magento\Framework\View\DesignInterface::class, $designMock],
  183. ]
  184. ));
  185. $this->object->load();
  186. }
  187. private function verifyLoadConfig()
  188. {
  189. $configs = ['dummy configs'];
  190. $this->diConfigLoaderMock->expects($this->once())
  191. ->method('load')
  192. ->with($this->areaCode)
  193. ->will($this->returnValue($configs));
  194. $this->objectManagerMock->expects($this->once())
  195. ->method('configure')
  196. ->with($configs);
  197. }
  198. public function testDetectDesign()
  199. {
  200. $this->designExceptionsMock->expects($this->never())
  201. ->method('getThemeByRequest');
  202. $this->designMock->expects($this->once())
  203. ->method('loadChange')
  204. ->with(self::SCOPE_ID)
  205. ->willReturnSelf();
  206. $designMock = $this->getMockBuilder(\Magento\Framework\View\DesignInterface::class)
  207. ->disableOriginalConstructor()
  208. ->getMock();
  209. $this->objectManagerMock->expects($this->once())
  210. ->method('get')
  211. ->with(\Magento\Framework\View\DesignInterface::class)
  212. ->will($this->returnValue($designMock));
  213. $this->designMock->expects($this->once())
  214. ->method('changeDesign')
  215. ->with($designMock)
  216. ->willReturnSelf();
  217. $this->object->detectDesign();
  218. }
  219. /**
  220. * @param string|bool $value
  221. * @param int $callNum
  222. * @param int $callNum2
  223. * @dataProvider detectDesignByRequestDataProvider
  224. */
  225. public function testDetectDesignByRequest($value, $callNum, $callNum2)
  226. {
  227. $this->designExceptionsMock->expects($this->once())
  228. ->method('getThemeByRequest')
  229. ->will($this->returnValue($value));
  230. $designMock = $this->getMockBuilder(\Magento\Framework\View\DesignInterface::class)
  231. ->disableOriginalConstructor()
  232. ->getMock();
  233. $designMock->expects($this->exactly($callNum))
  234. ->method('setDesignTheme');
  235. $this->objectManagerMock->expects($this->once())
  236. ->method('get')
  237. ->with(\Magento\Framework\View\DesignInterface::class)
  238. ->will($this->returnValue($designMock));
  239. $this->designMock->expects($this->exactly($callNum2))
  240. ->method('loadChange')
  241. ->with(self::SCOPE_ID)
  242. ->willReturnSelf();
  243. $this->designMock->expects($this->exactly($callNum2))
  244. ->method('changeDesign')
  245. ->with($designMock)
  246. ->willReturnSelf();
  247. $requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
  248. ->disableOriginalConstructor()
  249. ->getMock();
  250. $this->object->detectDesign($requestMock);
  251. }
  252. /**
  253. * @return array
  254. */
  255. public function detectDesignByRequestDataProvider()
  256. {
  257. return [
  258. [false, 0, 1],
  259. ['theme', 1, 0],
  260. ];
  261. }
  262. public function testDetectDesignByRequestWithException()
  263. {
  264. $exception = new \Exception('exception');
  265. $this->designExceptionsMock->expects($this->once())
  266. ->method('getThemeByRequest')
  267. ->will($this->throwException($exception));
  268. $designMock = $this->getMockBuilder(\Magento\Framework\View\DesignInterface::class)
  269. ->disableOriginalConstructor()
  270. ->getMock();
  271. $designMock->expects($this->never())
  272. ->method('setDesignTheme');
  273. $this->objectManagerMock->expects($this->once())
  274. ->method('get')
  275. ->with(\Magento\Framework\View\DesignInterface::class)
  276. ->will($this->returnValue($designMock));
  277. $this->designMock->expects($this->once())
  278. ->method('loadChange')
  279. ->with(self::SCOPE_ID)
  280. ->willReturnSelf();
  281. $this->designMock->expects($this->once())
  282. ->method('changeDesign')
  283. ->with($designMock)
  284. ->willReturnSelf();
  285. $requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
  286. ->disableOriginalConstructor()
  287. ->getMock();
  288. $this->loggerMock->expects($this->once())
  289. ->method('critical')
  290. ->with($exception);
  291. $this->object->detectDesign($requestMock);
  292. }
  293. }