_configMock = $this->createPartialMock(\Magento\PageCache\Model\Config::class, ['getType', 'isEnabled']); $this->entitySpecificHandlesListMock = $this->createMock(EntitySpecificHandlesList::class); $this->_model = new \Magento\PageCache\Observer\ProcessLayoutRenderElement( $this->_configMock, $this->entitySpecificHandlesListMock, new \Magento\Framework\Serialize\Serializer\Json(), new \Magento\Framework\Serialize\Serializer\Base64Json() ); $this->_observerMock = $this->createPartialMock(\Magento\Framework\Event\Observer::class, ['getEvent']); $this->_layoutMock = $this->createPartialMock( \Magento\Framework\View\Layout::class, ['isCacheable', 'getBlock', 'getUpdate', 'getHandles'] ); $this->_blockMock = $this->getMockForAbstractClass( \Magento\Framework\View\Element\AbstractBlock::class, [], '', false, true, true, ['getData', 'isScopePrivate', 'getNameInLayout', 'getUrl'] ); $this->_transport = new \Magento\Framework\DataObject(['output' => 'test output html']); } /** * @param bool $cacheState * @param bool $varnishIsEnabled * @param bool $scopeIsPrivate * @param int|null $blockTtl * @param string $expectedOutput * @dataProvider processLayoutRenderDataProvider */ public function testExecute( $cacheState, $varnishIsEnabled, $scopeIsPrivate, $blockTtl, $expectedOutput ) { $eventMock = $this->createPartialMock( \Magento\Framework\Event::class, ['getLayout', 'getElementName', 'getTransport'] ); $this->_observerMock->expects($this->once())->method('getEvent')->will($this->returnValue($eventMock)); $eventMock->expects($this->once())->method('getLayout')->will($this->returnValue($this->_layoutMock)); $this->_configMock->expects($this->any())->method('isEnabled')->will($this->returnValue($cacheState)); if ($cacheState) { $eventMock->expects($this->once()) ->method('getElementName') ->will($this->returnValue('blockName')); $eventMock->expects($this->once()) ->method('getTransport') ->will($this->returnValue($this->_transport)); $this->_layoutMock->expects($this->once()) ->method('isCacheable') ->will($this->returnValue(true)); $this->_layoutMock->expects($this->any()) ->method('getUpdate') ->will($this->returnSelf()); $this->_layoutMock->expects($this->any()) ->method('getHandles') ->will($this->returnValue(['default', 'catalog_product_view', 'catalog_product_view_id_1'])); $this->entitySpecificHandlesListMock->expects($this->any()) ->method('getHandles') ->will($this->returnValue(['catalog_product_view_id_1'])); $this->_layoutMock->expects($this->once()) ->method('getBlock') ->will($this->returnValue($this->_blockMock)); if ($varnishIsEnabled) { $this->_blockMock->expects($this->once()) ->method('getData') ->with('ttl') ->will($this->returnValue($blockTtl)); $this->_blockMock->expects($this->any()) ->method('getUrl') ->with( 'page_cache/block/esi', ['blocks' => '[null]', 'handles' => 'WyJkZWZhdWx0IiwiY2F0YWxvZ19wcm9kdWN0X3ZpZXciXQ=='] ) ->will( $this->returnValue( 'page_cache/block/wrapesi/with/handles/WyJkZWZhdWx0IiwiY2F0YWxvZ19wcm9kdWN0X3ZpZXciXQ==' ) ); } if ($scopeIsPrivate) { $this->_blockMock->expects($this->once()) ->method('getNameInLayout') ->will($this->returnValue('testBlockName')); $this->_blockMock->expects($this->once()) ->method('isScopePrivate') ->will($this->returnValue($scopeIsPrivate)); } $this->_configMock->expects($this->any())->method('getType')->will($this->returnValue($varnishIsEnabled)); } $this->_model->execute($this->_observerMock); $this->assertEquals($expectedOutput, $this->_transport['output']); } public function testExecuteWithBase64Encode() { $expectedOutput = ''; $eventMock = $this->createPartialMock( \Magento\Framework\Event::class, ['getLayout', 'getElementName', 'getTransport'] ); $expectedUrl = 'page_cache/block/wrapesi/with/handles/' . base64_encode('and/other/stuff'); $this->_observerMock->expects($this->once())->method('getEvent')->will($this->returnValue($eventMock)); $eventMock->expects($this->once())->method('getLayout')->will($this->returnValue($this->_layoutMock)); $this->_configMock->expects($this->any())->method('isEnabled')->will($this->returnValue(true)); $eventMock->expects($this->once()) ->method('getElementName') ->will($this->returnValue('blockName')); $eventMock->expects($this->once()) ->method('getTransport') ->will($this->returnValue($this->_transport)); $this->_layoutMock->expects($this->once()) ->method('isCacheable') ->will($this->returnValue(true)); $this->_layoutMock->expects($this->any()) ->method('getUpdate') ->will($this->returnSelf()); $this->_layoutMock->expects($this->any()) ->method('getHandles') ->will($this->returnValue([])); $this->_layoutMock->expects($this->once()) ->method('getBlock') ->will($this->returnValue($this->_blockMock)); $this->entitySpecificHandlesListMock->expects($this->any()) ->method('getHandles') ->will($this->returnValue(['catalog_product_view_id_1'])); $this->_blockMock->expects($this->once()) ->method('getData') ->with('ttl') ->will($this->returnValue(100)); $this->_blockMock->expects($this->any()) ->method('getUrl') ->will($this->returnValue($expectedUrl)); $this->_blockMock->expects($this->once()) ->method('getNameInLayout') ->will($this->returnValue('testBlockName')); $this->_configMock->expects($this->any())->method('getType')->will($this->returnValue(true)); $this->_model->execute($this->_observerMock); $this->assertEquals($expectedOutput, $this->_transport['output']); } /** * Data provider for testProcessLayoutRenderElement * * @return array */ public function processLayoutRenderDataProvider() { return [ 'full_page type and Varnish enabled, public scope, ttl is set' => [ true, true, false, 360, '', ], 'full_page type and Varnish enabled, public scope, ttl is not set' => [ true, true, false, null, 'test output html', ], 'full_page type enabled, Varnish disabled, public scope, ttl is set' => [ true, false, false, 360, 'test output html', ], 'full_page type enabled, Varnish disabled, public scope, ttl is not set' => [ true, false, false, null, 'test output html', ], 'full_page type enabled, Varnish disabled, private scope, ttl is not set' => [ true, false, true, null, 'test output html', ], 'full_page type is disabled, Varnish enabled' => [false, true, false, null, 'test output html'] ]; } }