GaTest.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\GoogleAnalytics\Test\Unit\Block;
  7. use Magento\Framework\Escaper;
  8. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  9. use Magento\Framework\View\Element\Template\Context;
  10. use Magento\GoogleAnalytics\Block\Ga;
  11. use Magento\GoogleAnalytics\Helper\Data;
  12. use Magento\Sales\Api\Data\OrderItemInterface;
  13. use Magento\Sales\Model\Order;
  14. use Magento\Sales\Model\ResourceModel\Order\Collection;
  15. use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
  16. use Magento\Store\Model\Store;
  17. use Magento\Store\Model\StoreManagerInterface;
  18. use PHPUnit\Framework\TestCase;
  19. /**
  20. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  21. */
  22. class GaTest extends \PHPUnit\Framework\TestCase
  23. {
  24. /**
  25. * @var Ga | \PHPUnit_Framework_MockObject_MockObject
  26. */
  27. protected $gaBlock;
  28. /**
  29. * @var \PHPUnit_Framework_MockObject_MockObject
  30. */
  31. private $cookieHelperMock;
  32. /**
  33. * @var \PHPUnit_Framework_MockObject_MockObject
  34. */
  35. private $salesOrderCollectionMock;
  36. /**
  37. * @var \PHPUnit_Framework_MockObject_MockObject
  38. */
  39. private $storeManagerMock;
  40. /**
  41. * @var \PHPUnit_Framework_MockObject_MockObject
  42. */
  43. private $storeMock;
  44. /**
  45. * @var \PHPUnit_Framework_MockObject_MockObject
  46. */
  47. private $googleAnalyticsDataMock;
  48. protected function setUp()
  49. {
  50. $objectManager = new ObjectManager($this);
  51. $contextMock = $this->getMockBuilder(Context::class)->disableOriginalConstructor()->getMock();
  52. $contextMock->expects($this->once())
  53. ->method('getEscaper')
  54. ->willReturn($objectManager->getObject(Escaper::class));
  55. $this->storeManagerMock = $this->getMockBuilder(StoreManagerInterface::class)
  56. ->disableOriginalConstructor()
  57. ->getMock();
  58. $this->storeMock = $this->getMockBuilder(Store::class)->disableOriginalConstructor()->getMock();
  59. $contextMock->expects($this->once())->method('getStoreManager')->willReturn($this->storeManagerMock);
  60. $this->salesOrderCollectionMock = $this->getMockBuilder(CollectionFactory::class)
  61. ->disableOriginalConstructor()
  62. ->getMock();
  63. $this->googleAnalyticsDataMock = $this->getMockBuilder(Data::class)
  64. ->disableOriginalConstructor()
  65. ->getMock();
  66. $this->cookieHelperMock = $this->getMockBuilder(\Magento\Cookie\Helper\Cookie::class)
  67. ->disableOriginalConstructor()
  68. ->getMock();
  69. $this->gaBlock = $objectManager->getObject(
  70. Ga::class,
  71. [
  72. 'context' => $contextMock,
  73. 'salesOrderCollection' => $this->salesOrderCollectionMock,
  74. 'googleAnalyticsData' => $this->googleAnalyticsDataMock,
  75. 'cookieHelper' => $this->cookieHelperMock
  76. ]
  77. );
  78. }
  79. public function testOrderTrackingCode()
  80. {
  81. $this->salesOrderCollectionMock->expects($this->once())
  82. ->method('create')
  83. ->willReturn($this->createCollectionMock());
  84. $this->storeMock->expects($this->once())->method('getFrontendName')->willReturn('test');
  85. $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock);
  86. $expectedCode = "ga('require', 'ec', 'ec.js');
  87. ga('set', 'currencyCode', 'USD');
  88. ga('ec:addProduct', {
  89. 'id': 'sku0',
  90. 'name': 'testName0',
  91. 'price': '0.00',
  92. 'quantity': 1
  93. });
  94. ga('ec:setAction', 'purchase', {
  95. 'id': '100',
  96. 'affiliation': 'test',
  97. 'revenue': '10',
  98. 'tax': '2',
  99. 'shipping': '1'
  100. });
  101. ga('send', 'pageview');";
  102. $this->gaBlock->setOrderIds([1, 2]);
  103. $this->assertEquals(
  104. $this->packString($expectedCode),
  105. $this->packString($this->gaBlock->getOrdersTrackingCode())
  106. );
  107. }
  108. public function testIsCookieRestrictionModeEnabled()
  109. {
  110. $this->cookieHelperMock->expects($this->once())->method('isCookieRestrictionModeEnabled')->willReturn(false);
  111. $this->assertFalse($this->gaBlock->isCookieRestrictionModeEnabled());
  112. }
  113. public function testGetCurrentWebsiteId()
  114. {
  115. $websiteId = 100;
  116. $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class)->getMock();
  117. $websiteMock->expects($this->once())->method('getId')->willReturn($websiteId);
  118. $this->storeManagerMock->expects($this->once())->method('getWebsite')->willReturn($websiteMock);
  119. $this->assertEquals($websiteId, $this->gaBlock->getCurrentWebsiteId());
  120. }
  121. public function testOrderTrackingData()
  122. {
  123. $this->salesOrderCollectionMock->expects($this->once())
  124. ->method('create')
  125. ->willReturn($this->createCollectionMock());
  126. $this->storeMock->expects($this->once())->method('getFrontendName')->willReturn('test');
  127. $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock);
  128. $expectedResult = [
  129. 'orders' => [
  130. [
  131. 'id' => 100,
  132. 'affiliation' => 'test',
  133. 'revenue' => 10,
  134. 'tax' => 2,
  135. 'shipping' => 1
  136. ]
  137. ],
  138. 'products' => [
  139. [
  140. 'id' => 'sku0',
  141. 'name' => 'testName0',
  142. 'price' => 0.00,
  143. 'quantity' => 1
  144. ]
  145. ],
  146. 'currency' => 'USD'
  147. ];
  148. $this->gaBlock->setOrderIds([1, 2]);
  149. $this->assertEquals($expectedResult, $this->gaBlock->getOrdersTrackingData());
  150. }
  151. public function testGetPageTrackingData()
  152. {
  153. $pageName = '/page/name';
  154. $accountId = 100;
  155. $expectedResult = [
  156. 'optPageUrl' => ", '" . $pageName . "'",
  157. 'isAnonymizedIpActive' => true,
  158. 'accountId' => $accountId
  159. ];
  160. $this->gaBlock->setData('page_name', $pageName);
  161. $this->googleAnalyticsDataMock->expects($this->once())->method('isAnonymizedIpActive')->willReturn(true);
  162. $this->assertEquals($expectedResult, $this->gaBlock->getPageTrackingData($accountId));
  163. }
  164. /**
  165. * Create Order mock with $orderItemCount items
  166. *
  167. * @param int $orderItemCount
  168. * @return Order|\PHPUnit_Framework_MockObject_MockObject
  169. */
  170. protected function createOrderMock($orderItemCount = 1)
  171. {
  172. $orderItems = [];
  173. for ($i = 0; $i < $orderItemCount; $i++) {
  174. $orderItemMock = $this->getMockBuilder(OrderItemInterface::class)
  175. ->disableOriginalConstructor()
  176. ->getMock();
  177. $orderItemMock->expects($this->once())->method('getSku')->willReturn('sku' . $i);
  178. $orderItemMock->expects($this->once())->method('getName')->willReturn('testName' . $i);
  179. $orderItemMock->expects($this->once())->method('getPrice')->willReturn($i . '.00');
  180. $orderItemMock->expects($this->once())->method('getQtyOrdered')->willReturn($i + 1);
  181. $orderItems[] = $orderItemMock;
  182. }
  183. $orderMock = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock();
  184. $orderMock->expects($this->once())->method('getIncrementId')->willReturn(100);
  185. $orderMock->expects($this->once())->method('getAllVisibleItems')->willReturn($orderItems);
  186. $orderMock->expects($this->once())->method('getGrandTotal')->willReturn(10);
  187. $orderMock->expects($this->once())->method('getTaxAmount')->willReturn(2);
  188. $orderMock->expects($this->once())->method('getShippingAmount')->willReturn($orderItemCount);
  189. $orderMock->expects($this->once())->method('getOrderCurrencyCode')->willReturn('USD');
  190. return $orderMock;
  191. }
  192. /**
  193. * @return Collection | \PHPUnit_Framework_MockObject_MockObject
  194. */
  195. protected function createCollectionMock()
  196. {
  197. $collectionMock = $this->getMockBuilder(Collection::class)
  198. ->disableOriginalConstructor()
  199. ->getMock();
  200. $collectionMock->expects($this->any())
  201. ->method('getIterator')
  202. ->willReturn(new \ArrayIterator([$this->createOrderMock(1)]));
  203. return $collectionMock;
  204. }
  205. /**
  206. * Removes from $string whitespace characters
  207. *
  208. * @param string $string
  209. * @return string
  210. */
  211. protected function packString($string)
  212. {
  213. return preg_replace('/\s/', '', $string);
  214. }
  215. }