/**
  * @param array $paymentMethodsAvailability
  * @param array $blocks
  * @dataProvider addAvailabilityOfMethodsDataProvider
  */
 public function testAddPaypalShortcuts($paymentMethodsAvailability, $blocks)
 {
     $this->paypalConfigMock->expects($this->any())->method('isMethodAvailable')->will($this->returnValueMap($paymentMethodsAvailability));
     $layoutMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout')->setMethods(['createBlock'])->disableOriginalConstructor()->getMock();
     $shortcutButtonsMock = $this->getMockBuilder('Magento\\Catalog\\Block\\ShortcutButtons')->setMethods(['getLayout', 'addShortcut'])->disableOriginalConstructor()->getMock();
     $blockInstances = [];
     $atPosition = 0;
     foreach ($blocks as $blockName => $blockInstance) {
         if ($this->paypalConfigMock->isMethodAvailable($blockInstance[1])) {
             $block = $this->getMockBuilder($blockInstance[0])->setMethods(null)->disableOriginalConstructor()->getMock();
             $blockInstances[$blockName] = $block;
             $layoutMock->expects(new MethodInvokedAtIndex($atPosition))->method('createBlock')->with($blockName)->will($this->returnValue($block));
             $atPosition++;
         }
     }
     $shortcutButtonsMock->expects($this->any())->method('getLayout')->will($this->returnValue($layoutMock));
     $atPosition = 0;
     foreach ($blocks as $blockName => $blockInstance) {
         if ($this->paypalConfigMock->isMethodAvailable($blockInstance[1])) {
             $shortcutButtonsMock->expects(new MethodInvokedAtIndex($atPosition))->method('addShortcut')->with($this->identicalTo($blockInstances[$blockName]));
             $atPosition++;
         }
     }
     $this->_event->setContainer($shortcutButtonsMock);
     $this->_model->execute($this->_observer);
 }
 /**
  * @param array $blocks
  *
  * @dataProvider dataProviderShortcutsButtons
  *
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testAddShortcutsButtons(array $blocks)
 {
     /** @var ShortcutButtons|\PHPUnit_Framework_MockObject_MockObject $shortcutButtonsMock */
     $shortcutButtonsMock = $this->getMockBuilder(ShortcutButtons::class)->setMethods(['getLayout', 'addShortcut'])->disableOriginalConstructor()->getMock();
     /** @var ShortcutButtons|\PHPUnit_Framework_MockObject_MockObject $shortcutButtonsMock */
     $eventMock = $this->getMockBuilder(DataObject::class)->setMethods(['getContainer', 'getCheckoutSession', 'getIsCatalogProduct', 'getOrPosition'])->disableOriginalConstructor()->getMock();
     $eventMock->expects(self::once())->method('getContainer')->willReturn($shortcutButtonsMock);
     $observer = new Observer();
     $observer->setEvent($eventMock);
     /** @var Config|\PHPUnit_Framework_MockObject_MockObject $paypalConfigMock */
     $paypalConfigMock = $this->getMockBuilder(Config::class)->disableOriginalConstructor()->getMock();
     /** @var Factory|\PHPUnit_Framework_MockObject_MockObject $shortcutFactoryMock */
     $shortcutFactoryMock = $this->getMockBuilder(Factory::class)->setMethods(['create'])->disableOriginalConstructor()->getMock();
     $model = new AddPaypalShortcutsObserver($shortcutFactoryMock, $paypalConfigMock);
     /** @var Layout|\PHPUnit_Framework_MockObject_MockObject $layoutMock */
     $layoutMock = $this->getMockBuilder(Layout::class)->setMethods(['createBlock'])->disableOriginalConstructor()->getMock();
     $callIndexBlock = 0;
     $callIndexShortcutFactory = 0;
     $callIndexAvailable = 0;
     $callIndexSession = 0;
     foreach ($blocks as $instanceName => $blockData) {
         $params = [];
         $paypalConfigMock->expects(self::at($callIndexAvailable))->method('isMethodAvailable')->with($blockData[self::PAYMENT_CODE])->willReturn($blockData[self::PAYMENT_AVAILABLE]);
         ++$callIndexAvailable;
         if (!$blockData[self::PAYMENT_AVAILABLE]) {
             continue;
         }
         ++$callIndexSession;
         $params['shortcutValidator'] = 'test-shortcut-validator';
         $shortcutFactoryMock->expects(self::at($callIndexShortcutFactory))->method('create')->with('test-checkout-session')->willReturn('test-shortcut-validator');
         ++$callIndexShortcutFactory;
         if (!$blockData[self::PAYMENT_IS_BML]) {
             $params['checkoutSession'] = 'test-checkout-session';
             ++$callIndexSession;
         }
         $blockMock = $this->getMockBuilder(Button::class)->setMethods(['setIsInCatalogProduct', 'setShowOrPosition'])->disableOriginalConstructor()->getMockForAbstractClass();
         $blockMock->expects(self::once())->method('setIsInCatalogProduct')->willReturnSelf();
         $blockMock->expects(self::once())->method('setShowOrPosition')->willReturnSelf();
         $layoutMock->expects(self::at($callIndexBlock))->method('createBlock')->with($instanceName, '', $params)->willReturn($blockMock);
         ++$callIndexBlock;
     }
     $shortcutButtonsMock->expects(self::exactly($callIndexBlock))->method('addShortcut')->with(self::isInstanceOf(ShortcutInterface::class));
     $shortcutButtonsMock->expects(self::exactly($callIndexBlock))->method('getLayout')->willReturn($layoutMock);
     $eventMock->expects(self::exactly($callIndexSession))->method('getCheckoutSession')->willReturn('test-checkout-session');
     $model->execute($observer);
 }