PageTest.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Cms\Test\Unit\Helper;
  7. /**
  8. * @covers \Magento\Cms\Helper\Page
  9. *
  10. * @SuppressWarnings(PHPMD.TooManyFields)
  11. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  12. */
  13. class PageTest extends \PHPUnit\Framework\TestCase
  14. {
  15. /**
  16. * @var \Magento\Cms\Helper\Page
  17. */
  18. protected $object;
  19. /**
  20. * @var \Magento\Framework\App\Action\Action|\PHPUnit_Framework_MockObject_MockObject
  21. */
  22. protected $actionMock;
  23. /**
  24. * @var \Magento\Cms\Model\PageFactory|\PHPUnit_Framework_MockObject_MockObject
  25. */
  26. protected $pageFactoryMock;
  27. /**
  28. * @var \Magento\Cms\Model\Page|\PHPUnit_Framework_MockObject_MockObject
  29. */
  30. protected $pageMock;
  31. /**
  32. * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  33. */
  34. protected $storeManagerMock;
  35. /**
  36. * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject
  37. */
  38. protected $localeDateMock;
  39. /**
  40. * @var \Magento\Framework\View\DesignInterface|\PHPUnit_Framework_MockObject_MockObject
  41. */
  42. protected $designMock;
  43. /**
  44. * @var \Magento\Framework\View\Page\Config|\PHPUnit_Framework_MockObject_MockObject
  45. */
  46. protected $pageConfigMock;
  47. /**
  48. * @var \Magento\Framework\Escaper|\PHPUnit_Framework_MockObject_MockObject
  49. */
  50. protected $escaperMock;
  51. /**
  52. * @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  53. */
  54. protected $messageManagerMock;
  55. /**
  56. * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  57. */
  58. protected $eventManagerMock;
  59. /**
  60. * @var \Magento\Framework\UrlInterface|\PHPUnit_Framework_MockObject_MockObject
  61. */
  62. protected $urlBuilderMock;
  63. /**
  64. * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject
  65. */
  66. protected $storeMock;
  67. /**
  68. * @var \Magento\Framework\View\Result\Page|\PHPUnit_Framework_MockObject_MockObject
  69. */
  70. protected $resultPageMock;
  71. /**
  72. * @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject
  73. */
  74. protected $layoutMock;
  75. /**
  76. * @var \Magento\Framework\View\Layout\ProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
  77. */
  78. protected $layoutProcessorMock;
  79. /**
  80. * @var \Magento\Framework\View\Element\BlockInterface|\PHPUnit_Framework_MockObject_MockObject
  81. */
  82. protected $blockMock;
  83. /**
  84. * @var \Magento\Framework\View\Element\Messages|\PHPUnit_Framework_MockObject_MockObject
  85. */
  86. protected $messagesBlockMock;
  87. /**
  88. * @var \Magento\Framework\Message\Collection|\PHPUnit_Framework_MockObject_MockObject
  89. */
  90. protected $messageCollectionMock;
  91. /**
  92. * @var \Magento\Framework\View\Result\PageFactory|\PHPUnit_Framework_MockObject_MockObject
  93. */
  94. protected $resultPageFactory;
  95. /**
  96. * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
  97. */
  98. private $httpRequestMock;
  99. /**
  100. * Test Setup
  101. */
  102. protected function setUp()
  103. {
  104. $this->actionMock = $this->getMockBuilder(\Magento\Framework\App\Action\Action::class)
  105. ->disableOriginalConstructor()
  106. ->getMock();
  107. $this->pageFactoryMock = $this->getMockBuilder(\Magento\Cms\Model\PageFactory::class)
  108. ->disableOriginalConstructor()
  109. ->setMethods(['create'])
  110. ->getMock();
  111. $this->pageMock = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
  112. ->disableOriginalConstructor()
  113. ->setMethods(
  114. [
  115. 'getId',
  116. 'setStoreId',
  117. 'load',
  118. 'getCustomThemeFrom',
  119. 'getCustomThemeTo',
  120. 'getCustomTheme',
  121. 'getPageLayout',
  122. 'getIdentifier',
  123. 'getCustomPageLayout',
  124. 'getCustomLayoutUpdateXml',
  125. 'getLayoutUpdateXml',
  126. 'getContentHeading',
  127. ]
  128. )
  129. ->getMock();
  130. $this->storeManagerMock = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
  131. ->getMockForAbstractClass();
  132. $this->localeDateMock = $this->getMockBuilder(\Magento\Framework\Stdlib\DateTime\TimezoneInterface::class)
  133. ->getMockForAbstractClass();
  134. $this->designMock = $this->getMockBuilder(\Magento\Framework\View\DesignInterface::class)
  135. ->getMockForAbstractClass();
  136. $this->pageConfigMock = $this->getMockBuilder(\Magento\Framework\View\Page\Config::class)
  137. ->disableOriginalConstructor()
  138. ->getMock();
  139. $this->escaperMock = $this->getMockBuilder(\Magento\Framework\Escaper::class)
  140. ->disableOriginalConstructor()
  141. ->getMock();
  142. $this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
  143. ->getMockForAbstractClass();
  144. $this->urlBuilderMock = $this->getMockBuilder(\Magento\Framework\UrlInterface::class)
  145. ->getMockForAbstractClass();
  146. $this->httpRequestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class)
  147. ->getMockForAbstractClass();
  148. $this->storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
  149. ->disableOriginalConstructor()
  150. ->getMock();
  151. $this->resultPageMock = $this->getMockBuilder(\Magento\Framework\View\Result\Page::class)
  152. ->disableOriginalConstructor()
  153. ->getMock();
  154. $this->layoutMock = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class)
  155. ->getMockForAbstractClass();
  156. $this->layoutProcessorMock = $this->getMockBuilder(\Magento\Framework\View\Layout\ProcessorInterface::class)
  157. ->getMockForAbstractClass();
  158. $this->blockMock = $this->getMockBuilder(\Magento\Framework\View\Element\AbstractBlock::class)
  159. ->setMethods(['setContentHeading'])
  160. ->disableOriginalConstructor()
  161. ->getMockForAbstractClass();
  162. $this->messagesBlockMock = $this->getMockBuilder(\Magento\Framework\View\Element\Messages::class)
  163. ->disableOriginalConstructor()
  164. ->getMock();
  165. $this->messageManagerMock = $this->getMockBuilder(\Magento\Framework\Message\ManagerInterface::class)
  166. ->getMockForAbstractClass();
  167. $this->messageCollectionMock = $this->getMockBuilder(\Magento\Framework\Message\Collection::class)
  168. ->disableOriginalConstructor()
  169. ->getMock();
  170. $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  171. $context = $objectManager->getObject(
  172. \Magento\Framework\App\Helper\Context::class,
  173. [
  174. 'eventManager' => $this->eventManagerMock,
  175. 'urlBuilder' => $this->urlBuilderMock,
  176. 'httpRequest' => $this->httpRequestMock,
  177. ]
  178. );
  179. $this->resultPageFactory = $this->createMock(\Magento\Framework\View\Result\PageFactory::class);
  180. $this->object = $objectManager->getObject(
  181. \Magento\Cms\Helper\Page::class,
  182. [
  183. 'context' => $context,
  184. 'pageFactory' => $this->pageFactoryMock,
  185. 'page' => $this->pageMock,
  186. 'storeManager' => $this->storeManagerMock,
  187. 'localeDate' => $this->localeDateMock,
  188. 'design' => $this->designMock,
  189. 'pageConfig' => $this->pageConfigMock,
  190. 'escaper' => $this->escaperMock,
  191. 'messageManager' => $this->messageManagerMock,
  192. 'resultPageFactory' => $this->resultPageFactory
  193. ]
  194. );
  195. }
  196. /**
  197. * @covers \Magento\Cms\Helper\Page::prepareResultPage
  198. * @param integer|null $pageId
  199. * @param integer|null $internalPageId
  200. * @param integer $pageLoadResultIndex
  201. * @param string $customPageLayout
  202. * @param string $handle
  203. * @param string $customLayoutUpdateXml
  204. * @param string $layoutUpdate
  205. * @param boolean $expectedResult
  206. *
  207. * @dataProvider renderPageExtendedDataProvider
  208. *
  209. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  210. */
  211. public function testPrepareResultPage(
  212. $pageId,
  213. $internalPageId,
  214. $pageLoadResultIndex,
  215. $customPageLayout,
  216. $handle,
  217. $customLayoutUpdateXml,
  218. $layoutUpdate,
  219. $expectedResult
  220. ) {
  221. $storeId = 321;
  222. $customThemeFrom = 'customThemeFrom';
  223. $customThemeTo = 'customThemeTo';
  224. $isScopeDateInInterval = true;
  225. $customTheme = 'customTheme';
  226. $pageLayout = 'pageLayout';
  227. $pageIdentifier = 111;
  228. $layoutUpdateXml = 'layoutUpdateXml';
  229. $contentHeading = 'contentHeading';
  230. $escapedContentHeading = 'escapedContentHeading';
  231. $pageLoadResultCollection = [
  232. null,
  233. $this->pageMock,
  234. ];
  235. $this->pageMock->expects($this->any())
  236. ->method('getId')
  237. ->willReturn($internalPageId);
  238. $this->storeManagerMock->expects($this->any())
  239. ->method('getStore')
  240. ->willReturn($this->storeMock);
  241. $this->storeMock->expects($this->any())
  242. ->method('getId')
  243. ->willReturn($storeId);
  244. $this->pageMock->expects($this->any())
  245. ->method('setStoreId')
  246. ->with($storeId)
  247. ->willReturnSelf();
  248. $this->pageMock->expects($this->any())
  249. ->method('load')
  250. ->with($pageId)
  251. ->willReturn($pageLoadResultCollection[$pageLoadResultIndex]);
  252. $this->pageMock->expects($this->any())
  253. ->method('getCustomThemeFrom')
  254. ->willReturn($customThemeFrom);
  255. $this->pageMock->expects($this->any())
  256. ->method('getCustomThemeTo')
  257. ->willReturn($customThemeTo);
  258. $this->localeDateMock->expects($this->any())
  259. ->method('isScopeDateInInterval')
  260. ->with(null, $customThemeFrom, $customThemeTo)
  261. ->willReturn($isScopeDateInInterval);
  262. $this->pageMock->expects($this->any())
  263. ->method('getCustomTheme')
  264. ->willReturn($customTheme);
  265. $this->designMock->expects($this->any())
  266. ->method('setDesignTheme')
  267. ->with($customTheme)
  268. ->willReturnSelf();
  269. $this->pageMock->expects($this->any())
  270. ->method('getPageLayout')
  271. ->willReturn($pageLayout);
  272. $this->pageMock->expects($this->any())
  273. ->method('getCustomPageLayout')
  274. ->willReturn($customPageLayout);
  275. $this->resultPageFactory->expects($this->any())->method('create')
  276. ->will($this->returnValue($this->resultPageMock));
  277. $this->resultPageMock->expects($this->any())
  278. ->method('getConfig')
  279. ->willReturn($this->pageConfigMock);
  280. $this->pageConfigMock->expects($this->any())
  281. ->method('setPageLayout')
  282. ->with($handle)
  283. ->willReturnSelf();
  284. $this->resultPageMock->expects($this->any())
  285. ->method('initLayout')
  286. ->willReturnSelf();
  287. $this->resultPageMock->expects($this->any())
  288. ->method('getLayout')
  289. ->willReturn($this->layoutMock);
  290. $this->layoutMock->expects($this->any())
  291. ->method('getUpdate')
  292. ->willReturn($this->layoutProcessorMock);
  293. $this->layoutProcessorMock->expects($this->any())
  294. ->method('addHandle')
  295. ->with('cms_page_view')
  296. ->willReturnSelf();
  297. $this->pageMock->expects($this->any())
  298. ->method('getIdentifier')
  299. ->willReturn($pageIdentifier);
  300. $this->eventManagerMock->expects($this->any())
  301. ->method('dispatch')
  302. ->with(
  303. 'cms_page_render',
  304. [
  305. 'page' => $this->pageMock,
  306. 'controller_action' => $this->actionMock,
  307. 'request' => $this->httpRequestMock,
  308. ]
  309. );
  310. $this->pageMock->expects($this->any())
  311. ->method('getCustomLayoutUpdateXml')
  312. ->willReturn($customLayoutUpdateXml);
  313. $this->pageMock->expects($this->any())
  314. ->method('getLayoutUpdateXml')
  315. ->willReturn($layoutUpdateXml);
  316. $this->layoutProcessorMock->expects($this->any())
  317. ->method('addUpdate')
  318. ->with($layoutUpdate)
  319. ->willReturnSelf();
  320. $this->layoutMock->expects($this->any())
  321. ->method('getBlock')
  322. ->with('page_content_heading')
  323. ->willReturn($this->blockMock);
  324. $this->pageMock->expects($this->any())
  325. ->method('getContentHeading')
  326. ->willReturn($contentHeading);
  327. $this->escaperMock->expects($this->any())
  328. ->method('escapeHtml')
  329. ->with($contentHeading)
  330. ->willReturn($escapedContentHeading);
  331. $this->blockMock->expects($this->any())
  332. ->method('setContentHeading')
  333. ->with($escapedContentHeading)
  334. ->willReturnSelf();
  335. if ($expectedResult) {
  336. $expectedResult = $this->resultPageMock;
  337. }
  338. $this->assertSame(
  339. $expectedResult,
  340. $this->object->prepareResultPage($this->actionMock, $pageId)
  341. );
  342. }
  343. /**
  344. * @return array
  345. */
  346. public function renderPageExtendedDataProvider()
  347. {
  348. return [
  349. 'ids NOT EQUAL BUT page->load() NOT SUCCESSFUL' => [
  350. 'pageId' => 123,
  351. 'internalPageId' => 234,
  352. 'pageLoadResultIndex' => 0,
  353. 'customPageLayout' => 'DOES NOT MATTER',
  354. 'handle' => 'DOES NOT MATTER',
  355. 'customLayoutUpdateXml' => 'DOES NOT MATTER',
  356. 'layoutUpdate' => 'DOES NOT MATTER',
  357. 'expectedResult' => false,
  358. ],
  359. 'page->load IS SUCCESSFUL BUT internalPageId IS EMPTY' => [
  360. 'pageId' => 123,
  361. 'internalPageId' => null,
  362. 'pageLoadResultIndex' => 1,
  363. 'customPageLayout' => 'DOES NOT MATTER',
  364. 'handle' => 'DOES NOT MATTER',
  365. 'customLayoutUpdateXml' => 'DOES NOT MATTER',
  366. 'layoutUpdate' => 'DOES NOT MATTER',
  367. 'expectedResult' => false,
  368. ],
  369. 'getPageLayout() AND getLayoutUpdateXml() ARE USED' => [
  370. 'pageId' => 123,
  371. 'internalPageId' => 234,
  372. 'pageLoadResultIndex' => 1,
  373. 'customPageLayout' => 'empty',
  374. 'handle' => 'pageLayout',
  375. 'customLayoutUpdateXml' => '',
  376. 'layoutUpdate' => 'layoutUpdateXml',
  377. 'expectedResult' => true,
  378. ],
  379. 'getCustomPageLayout() AND getCustomLayoutUpdateXml() ARE USED' => [
  380. 'pageId' => 123,
  381. 'internalPageId' => 234,
  382. 'pageLoadResultIndex' => 1,
  383. 'customPageLayout' => 'customPageLayout',
  384. 'handle' => 'customPageLayout',
  385. 'customLayoutUpdateXml' => 'customLayoutUpdateXml',
  386. 'layoutUpdate' => 'customLayoutUpdateXml',
  387. 'expectedResult' => true,
  388. ]
  389. ];
  390. }
  391. /**
  392. * @covers \Magento\Cms\Helper\Page::getPageUrl
  393. * @param integer|null $pageId
  394. * @param integer|null $internalPageId
  395. * @param integer $pageLoadResultIndex
  396. * @param string|null $expectedResult
  397. *
  398. * @dataProvider getPageUrlDataProvider
  399. */
  400. public function testGetPageUrl(
  401. $pageId,
  402. $internalPageId,
  403. $pageLoadResultIndex,
  404. $expectedResult
  405. ) {
  406. $storeId = 321;
  407. $pageIdentifier = 111;
  408. $url = '/some/url';
  409. $pageLoadResultCollection = [
  410. null,
  411. $this->pageMock,
  412. ];
  413. $this->pageFactoryMock->expects($this->any())
  414. ->method('create')
  415. ->willReturn($this->pageMock);
  416. $this->pageMock->expects($this->any())
  417. ->method('getId')
  418. ->willReturn($internalPageId);
  419. $this->storeManagerMock->expects($this->any())
  420. ->method('getStore')
  421. ->willReturn($this->storeMock);
  422. $this->storeMock->expects($this->any())
  423. ->method('getId')
  424. ->willReturn($storeId);
  425. $this->pageMock->expects($this->any())
  426. ->method('setStoreId')
  427. ->with($storeId)
  428. ->willReturnSelf();
  429. $this->pageMock->expects($this->any())
  430. ->method('load')
  431. ->with($pageId)
  432. ->willReturn($pageLoadResultCollection[$pageLoadResultIndex]);
  433. $this->pageMock->expects($this->any())
  434. ->method('getIdentifier')
  435. ->willReturn($pageIdentifier);
  436. $this->urlBuilderMock->expects($this->any())
  437. ->method('getUrl')
  438. ->with(null, ['_direct' => $pageIdentifier])
  439. ->willReturn($url);
  440. $this->assertEquals($expectedResult, $this->object->getPageUrl($pageId));
  441. }
  442. /**
  443. * @return array
  444. */
  445. public function getPageUrlDataProvider()
  446. {
  447. return [
  448. 'ids NOT EQUAL BUT page->load() NOT SUCCESSFUL' => [
  449. 'pageId' => 123,
  450. 'internalPageId' => null,
  451. 'pageLoadResultIndex' => 0,
  452. 'expectedResult' => null,
  453. ],
  454. 'page->load() IS SUCCESSFUL BUT internalId IS EMPTY' => [
  455. 'pageId' => 123,
  456. 'internalPageId' => null,
  457. 'pageLoadResultIndex' => 1,
  458. 'expectedResult' => null,
  459. ],
  460. 'SUCCESS' => [
  461. 'pageId' => 123,
  462. 'internalPageId' => 234,
  463. 'pageLoadResultIndex' => 1,
  464. 'expectedResult' => '/some/url',
  465. ]
  466. ];
  467. }
  468. }