PageTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sitemap\Test\Unit\Model\ResourceModel\Cms;
  7. use Magento\Cms\Api\Data\PageInterface;
  8. use Magento\Cms\Model\GetUtilityPageIdentifiers;
  9. use Magento\Framework\App\ResourceConnection;
  10. use Magento\Framework\DataObject;
  11. use Magento\Framework\DB\Adapter\AdapterInterface;
  12. use Magento\Framework\DB\Select;
  13. use Magento\Framework\EntityManager\EntityManager;
  14. use Magento\Framework\EntityManager\EntityMetadataInterface;
  15. use Magento\Framework\EntityManager\MetadataPool;
  16. use Magento\Framework\Model\ResourceModel\Db\Context;
  17. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  18. use Magento\Sitemap\Model\ResourceModel\Cms\Page;
  19. use PHPUnit\Framework\TestCase;
  20. /**
  21. * Provide tests for Cms Page resource model.
  22. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  23. */
  24. class PageTest extends TestCase
  25. {
  26. /**
  27. * Test subject.
  28. *
  29. * @var Page
  30. */
  31. private $model;
  32. /**
  33. * @var Context|\PHPUnit_Framework_MockObject_MockObject
  34. */
  35. private $context;
  36. /**
  37. * @var MetadataPool|\PHPUnit_Framework_MockObject_MockObject
  38. */
  39. private $metadataPool;
  40. /**
  41. * @var EntityManager|\PHPUnit_Framework_MockObject_MockObject
  42. */
  43. private $entityManager;
  44. /**
  45. * @var GetUtilityPageIdentifiers|\PHPUnit_Framework_MockObject_MockObject
  46. */
  47. private $getUtilityPageIdentifiers;
  48. /**
  49. * @var ResourceConnection|\PHPUnit_Framework_MockObject_MockObject
  50. */
  51. private $resource;
  52. /**
  53. * @inheritdoc
  54. */
  55. protected function setUp()
  56. {
  57. $objectManager = new ObjectManager($this);
  58. $this->resource = $this->getMockBuilder(ResourceConnection::class)
  59. ->disableOriginalConstructor()
  60. ->getMock();
  61. $this->context = $objectManager->getObject(
  62. Context::class,
  63. ['resource' => $this->resource]
  64. );
  65. $this->metadataPool = $this->getMockBuilder(MetadataPool::class)
  66. ->disableOriginalConstructor()
  67. ->getMock();
  68. $this->entityManager = $this->getMockBuilder(EntityManager::class)
  69. ->disableOriginalConstructor()
  70. ->getMock();
  71. $this->getUtilityPageIdentifiers = $this->getMockBuilder(GetUtilityPageIdentifiers::class)
  72. ->disableOriginalConstructor()
  73. ->getMock();
  74. $this->model = $objectManager->getObject(
  75. Page::class,
  76. [
  77. 'context' => $this->context,
  78. 'metadataPool' => $this->metadataPool,
  79. 'entityManager' => $this->entityManager,
  80. 'connectionName' => 'default',
  81. 'getUtilityPageIdentifiers' => $this->getUtilityPageIdentifiers,
  82. ]
  83. );
  84. }
  85. /**
  86. * Test Page::getCollection() build correct query to get cms page collection array.
  87. *
  88. * @return void
  89. */
  90. public function testGetCollection()
  91. {
  92. $pageId = 'testPageId';
  93. $url = 'testUrl';
  94. $updatedAt = 'testUpdatedAt';
  95. $pageIdentifiers = ['testCmsHomePage', 'testCmsNoRoute', 'testCmsNoCookies'];
  96. $storeId = 1;
  97. $linkField = 'testLinkField';
  98. $expectedPage = new DataObject();
  99. $expectedPage->setId($pageId);
  100. $expectedPage->setUrl($url);
  101. $expectedPage->setUpdatedAt($updatedAt);
  102. $query = $this->getMockBuilder(\Zend_Db_Statement_Interface::class)
  103. ->disableOriginalConstructor()
  104. ->setMethods(['fetch'])
  105. ->getMockForAbstractClass();
  106. $query->expects($this->exactly(2))
  107. ->method('fetch')
  108. ->willReturnOnConsecutiveCalls(
  109. [
  110. 'page_id' => $pageId,
  111. 'url' => $url,
  112. 'updated_at' => $updatedAt
  113. ],
  114. false
  115. );
  116. $select = $this->getMockBuilder(Select::class)
  117. ->disableOriginalConstructor()
  118. ->getMock();
  119. $select->expects($this->once())
  120. ->method('from')
  121. ->with(
  122. $this->identicalTo(['main_table' => 'cms_page']),
  123. $this->identicalTo(['page_id', 'url' => 'identifier', 'updated_at' => 'update_time'])
  124. )->willReturnSelf();
  125. $select->expects($this->once())
  126. ->method('join')
  127. ->with(
  128. $this->identicalTo(['store_table' => 'cms_page_store']),
  129. $this->identicalTo("main_table.{$linkField} = store_table.$linkField"),
  130. $this->identicalTo([])
  131. )->willReturnSelf();
  132. $select->expects($this->exactly(3))
  133. ->method('where')
  134. ->withConsecutive(
  135. [$this->identicalTo('main_table.is_active = 1')],
  136. [$this->identicalTo('main_table.identifier NOT IN (?)'), $this->identicalTo($pageIdentifiers)],
  137. [$this->identicalTo('store_table.store_id IN(?)'), $this->identicalTo([0, $storeId])]
  138. )->willReturnSelf();
  139. $connection = $this->getMockBuilder(AdapterInterface::class)
  140. ->setMethods(['select'])
  141. ->disableOriginalConstructor()
  142. ->getMockForAbstractClass();
  143. $connection->expects($this->once())
  144. ->method('select')
  145. ->willReturn($select);
  146. $connection->expects($this->once())
  147. ->method('query')
  148. ->with($this->identicalTo($select))
  149. ->willReturn($query);
  150. $entityMetadata = $this->getMockBuilder(EntityMetadataInterface::class)
  151. ->setMethods(['getLinkField', 'getEntityConnection'])
  152. ->disableOriginalConstructor()
  153. ->getMockForAbstractClass();
  154. $entityMetadata->expects($this->once())
  155. ->method('getLinkField')
  156. ->willReturn($linkField);
  157. $entityMetadata->expects($this->exactly(2))
  158. ->method('getEntityConnection')
  159. ->willReturn($connection);
  160. $this->getUtilityPageIdentifiers->expects($this->once())
  161. ->method('execute')
  162. ->willReturn($pageIdentifiers);
  163. $this->resource->expects($this->exactly(2))
  164. ->method('getTableName')
  165. ->withConsecutive(
  166. [$this->identicalTo('cms_page'), $this->identicalTo('default')],
  167. [$this->identicalTo('cms_page_store'), $this->identicalTo('default')]
  168. )->willReturnOnConsecutiveCalls(
  169. 'cms_page',
  170. 'cms_page_store'
  171. );
  172. $this->metadataPool->expects($this->exactly(3))
  173. ->method('getMetadata')
  174. ->with($this->identicalTo(PageInterface::class))
  175. ->willReturn($entityMetadata);
  176. $result = $this->model->getCollection($storeId);
  177. $resultPage = array_shift($result);
  178. $this->assertEquals($expectedPage, $resultPage);
  179. }
  180. }