Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CatalogProductViewObserverTest.php
Go to the documentation of this file.
1 <?php
7 
11 class CatalogProductViewObserverTest extends \PHPUnit\Framework\TestCase
12 {
16  protected $observer;
17 
21  protected $eventSaverMock;
22 
27 
32 
36  protected $productIndexMock;
37 
41  protected $reportEventMock;
42 
46  protected $storeMock;
47 
52 
57 
62 
66  private $reportStatusMock;
67 
71  protected function setUp()
72  {
73  $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
74 
75  $this->customerSessionMock = $this->getMockBuilder(\Magento\Customer\Model\Session::class)
76  ->disableOriginalConstructor()->getMock();
77  $this->customerVisitorMock = $this->getMockBuilder(\Magento\Customer\Model\Visitor::class)
78  ->disableOriginalConstructor()->getMock();
79 
80  $this->productIndexFactoryMock = $this->getMockBuilder(
81  \Magento\Reports\Model\Product\Index\ViewedFactory::class
82  )
83  ->setMethods(['create'])
84  ->disableOriginalConstructor()->getMock();
85  $this->productIndexMock = $this->getMockBuilder(\Magento\Reports\Model\Product\Index\Viewed::class)
86  ->disableOriginalConstructor()->getMock();
87 
88  $this->productIndexFactoryMock->expects($this->any())
89  ->method('create')
90  ->willReturn($this->productIndexMock);
91 
92  $reportEventFactory = $this->getMockBuilder(\Magento\Reports\Model\EventFactory::class)
93  ->setMethods(['create'])->disableOriginalConstructor()->getMock();
94  $this->reportEventMock = $this->getMockBuilder(\Magento\Reports\Model\Event::class)
95  ->disableOriginalConstructor()->getMock();
96 
97  $reportEventFactory->expects($this->any())
98  ->method('create')
99  ->willReturn($this->reportEventMock);
100 
102  $storeManager = $this->createMock(\Magento\Store\Model\StoreManagerInterface::class);
103  $this->storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
104  ->disableOriginalConstructor()->getMock();
105 
106  $storeManager->expects($this->any())
107  ->method('getStore')
108  ->willReturn($this->storeMock);
109 
110  $this->productCompModelMock = $this->getMockBuilder(\Magento\Reports\Model\Product\Index\Compared::class)
111  ->disableOriginalConstructor()
112  ->getMock();
113 
114  $this->productCompFactoryMock = $this->getMockBuilder(
115  \Magento\Reports\Model\Product\Index\ComparedFactory::class
116  )
117  ->disableOriginalConstructor()
118  ->setMethods(['create'])
119  ->getMock();
120  $this->productCompFactoryMock->expects($this->any())
121  ->method('create')
122  ->willReturn($this->productCompModelMock);
123 
124  $this->productCompFactoryMock = $this->getMockBuilder(
125  \Magento\Reports\Model\Product\Index\ComparedFactory::class
126  )->disableOriginalConstructor()
127  ->setMethods(['create'])
128  ->getMock();
129 
130  $this->eventSaverMock = $this->getMockBuilder(\Magento\Reports\Observer\EventSaver::class)
131  ->disableOriginalConstructor()
132  ->setMethods(['save'])
133  ->getMock();
134 
135  $this->reportStatusMock = $this->getMockBuilder(\Magento\Reports\Model\ReportStatus::class)
136  ->disableOriginalConstructor()
137  ->setMethods(['isReportEnabled'])
138  ->getMock();
139 
140  $this->observer = $objectManager->getObject(
141  \Magento\Reports\Observer\CatalogProductViewObserver::class,
142  [
143  'storeManager' => $storeManager,
144  'productIndxFactory' => $this->productIndexFactoryMock,
145  'customerSession' => $this->customerSessionMock,
146  'customerVisitor' => $this->customerVisitorMock,
147  'eventSaver' => $this->eventSaverMock,
148  'reportStatus' => $this->reportStatusMock
149  ]
150  );
151  }
152 
157  {
158  $productId = 5;
159  $customerId = 77;
160  $storeId = 1;
161  $expectedViewedData = [
162  'product_id' => $productId,
163  'customer_id' => $customerId,
164  'store_id' => $storeId,
165  ];
166 
167  $expectedEventData = [
169  'object_id' => $productId,
170  'subject_id' => $customerId,
171  'subtype' => 0,
172  'store_id' => $storeId,
173  ];
174 
175  $this->reportStatusMock->expects($this->once())->method('isReportEnabled')->willReturn(true);
176  $this->storeMock->expects($this->any())->method('getId')->willReturn($storeId);
177 
178  $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn(true);
179  $this->customerSessionMock->expects($this->any())->method('getCustomerId')->willReturn($customerId);
180 
181  $this->prepareProductIndexMock($expectedViewedData);
182  $this->prepareReportEventModel($expectedEventData);
183 
184  $this->eventSaverMock->expects($this->once())->method('save');
185 
186  $eventObserver = $this->getObserverMock($productId);
187  $this->observer->execute($eventObserver);
188  }
189 
194  {
195  $productId = 6;
196  $visitorId = 88;
197  $storeId = 1;
198  $expectedViewedData = [
199  'product_id' => $productId,
200  'visitor_id' => $visitorId,
201  'store_id' => $storeId,
202  ];
203 
204  $expectedEventData = [
206  'object_id' => $productId,
207  'subject_id' => $visitorId,
208  'subtype' => 1,
209  'store_id' => $storeId,
210  ];
211 
212  $this->reportStatusMock->expects($this->once())->method('isReportEnabled')->willReturn(true);
213  $this->storeMock->expects($this->any())->method('getId')->willReturn($storeId);
214 
215  $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn(false);
216 
217  $this->customerVisitorMock->expects($this->any())->method('getId')->willReturn($visitorId);
218 
219  $this->eventSaverMock->expects($this->once())->method('save');
220 
221  $this->prepareProductIndexMock($expectedViewedData);
222  $this->prepareReportEventModel($expectedEventData);
223  $eventObserver = $this->getObserverMock($productId);
224  $this->observer->execute($eventObserver);
225  }
226 
231  protected function prepareProductIndexMock($expectedViewedData)
232  {
233  $this->productIndexMock->expects($this->any())
234  ->method('setData')
235  ->with($expectedViewedData)
236  ->willReturnSelf();
237 
238  $this->productIndexMock->expects($this->any())
239  ->method('save')
240  ->willReturnSelf();
241 
242  $this->productIndexMock->expects($this->any())
243  ->method('calculate')
244  ->willReturnSelf();
245  }
246 
251  protected function prepareReportEventModel($expectedEventData)
252  {
253  $this->reportEventMock->expects($this->any())->method('setData')->with($expectedEventData)->willReturnSelf();
254  $this->reportEventMock->expects($this->any())->method('save')->willReturnSelf();
255  }
256 
261  protected function getObserverMock($productId)
262  {
263  $eventObserverMock = $this->getMockBuilder(\Magento\Framework\Event\Observer::class)
264  ->disableOriginalConstructor()
265  ->getMock();
266  $eventMock = $this->getMockBuilder(\Magento\Framework\Event::class)
267  ->disableOriginalConstructor()
268  ->setMethods(['getProduct'])->getMock();
269  $productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
270  ->disableOriginalConstructor()
271  ->getMock();
272 
273  $productMock->expects($this->any())->method('getId')->willReturn($productId);
274 
275  $eventMock->expects($this->any())->method('getProduct')->willReturn($productMock);
276 
277  $eventObserverMock->expects($this->any())->method('getEvent')->willReturn($eventMock);
278 
279  return $eventObserverMock;
280  }
281 }
$objectManager
Definition: bootstrap.php:17
$storeManager