300 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Paypal\Block\PayLater;
 | 
						|
 | 
						|
use Magento\Framework\App\Config\MutableScopeConfigInterface;
 | 
						|
use Magento\Framework\App\MutableScopeConfig;
 | 
						|
use Magento\Framework\View\LayoutInterface;
 | 
						|
use Magento\Paypal\Model\Config;
 | 
						|
use Magento\Store\Model\ScopeInterface;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
 | 
						|
class BannerTest extends TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @dataProvider getJsLayoutDataProvider
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @covers       \Magento\Paypal\Block\PayLater\Banner::getJsLayout()
 | 
						|
     * @covers       \Magento\Paypal\Block\PayLater\Banner::getStyleAttributesConfig()
 | 
						|
     */
 | 
						|
    public function testGetJsLayout($systemConfig, $blockConfig, $expectedConfig)
 | 
						|
    {
 | 
						|
        $this->setConfig($systemConfig);
 | 
						|
 | 
						|
        /** @var LayoutInterface $layout */
 | 
						|
        $layout = Bootstrap::getObjectManager()->get(LayoutInterface::class);
 | 
						|
        $block = $layout->createBlock(Banner::class, '', ['data' => $blockConfig]);
 | 
						|
 | 
						|
        $jsConfig = json_decode($block->getJsLayout(), true);
 | 
						|
        $this->assertArrayHasKey('config', $jsConfig['components']['payLater']);
 | 
						|
        $this->assertArrayHasKey('component', $jsConfig['components']['payLater']);
 | 
						|
 | 
						|
        $optionsConfig = $jsConfig['components']['payLater']['config'];
 | 
						|
        $this->assertEquals($expectedConfig, array_intersect_key($optionsConfig, $expectedConfig));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getJsLayoutDataProvider()
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            [
 | 
						|
                'systemConfig' => [
 | 
						|
                    'payment/paypal_paylater/test1page_stylelayout' => 'flex',
 | 
						|
                    'payment/paypal_paylater/test1page_ratio' => '20x1',
 | 
						|
                    'payment/paypal_paylater/test1page_color' => 'blue'
 | 
						|
                ],
 | 
						|
                'blockConfig' => [
 | 
						|
                    'placement' => 'test1',
 | 
						|
                    'jsLayout' => [
 | 
						|
                        'components' => [
 | 
						|
                            'payLater' => [
 | 
						|
                                'config' => [
 | 
						|
                                    'attributes' => [
 | 
						|
                                        'data-pp-style-ratio' => '1x1'
 | 
						|
                                    ]
 | 
						|
                                ]
 | 
						|
                            ]
 | 
						|
                        ]
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                 'expectedConfig' => [
 | 
						|
                    'attributes' => [
 | 
						|
                        'data-pp-style-layout' => 'flex',
 | 
						|
                        'data-pp-style-logo-type' => null,
 | 
						|
                        'data-pp-style-logo-position' => null,
 | 
						|
                        'data-pp-style-text-color' => null,
 | 
						|
                        'data-pp-style-text-size' => null,
 | 
						|
                        'data-pp-style-color' => 'blue',
 | 
						|
                        'data-pp-style-ratio' => '1x1',
 | 
						|
                        'data-pp-placement' => 'test1'
 | 
						|
                    ]
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'systemConfig' => [
 | 
						|
                    'payment/paypal_paylater/test2page_stylelayout' => 'text',
 | 
						|
                    'payment/paypal_paylater/test2page_logotype' => 'primary',
 | 
						|
                    'payment/paypal_paylater/test2page_logoposition' => 'left',
 | 
						|
                    'payment/paypal_paylater/test2page_textcolor' => 'white',
 | 
						|
                    'payment/paypal_paylater/test2page_textsize' => '10'
 | 
						|
 | 
						|
                ],
 | 
						|
                'blockConfig' => [
 | 
						|
                    'placement' => 'test2',
 | 
						|
                    'jsLayout' => [
 | 
						|
                        'components' => [
 | 
						|
                            'payLater' => [
 | 
						|
                                'config' => [
 | 
						|
                                    'attributes' => [
 | 
						|
                                        'data-pp-style-text-color' => 'black'
 | 
						|
                                    ]
 | 
						|
                                ]
 | 
						|
                            ]
 | 
						|
                        ]
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'expectedConfig' => [
 | 
						|
                    'attributes' => [
 | 
						|
                        'data-pp-style-layout' => 'text',
 | 
						|
                        'data-pp-style-logo-type' => 'primary',
 | 
						|
                        'data-pp-style-logo-position' => 'left',
 | 
						|
                        'data-pp-style-text-color' => 'black',
 | 
						|
                        'data-pp-style-text-size' => '10',
 | 
						|
                        'data-pp-style-color' => null,
 | 
						|
                        'data-pp-style-ratio' => null,
 | 
						|
                        'data-pp-placement' => 'test2'
 | 
						|
                    ]
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @dataProvider sdkUrlDataProvider
 | 
						|
     * @covers \Magento\Paypal\Block\PayLater\Banner::getJsLayout()
 | 
						|
     * @covers \Magento\Paypal\Block\PayLater\Banner::getPayPalSdkUrl()
 | 
						|
     */
 | 
						|
    public function testSdkUrl($blockConfig, $expectedUrl)
 | 
						|
    {
 | 
						|
        $layout = Bootstrap::getObjectManager()->get(LayoutInterface::class);
 | 
						|
        $block = $layout->createBlock(Banner::class, '', ['data' => $blockConfig]);
 | 
						|
 | 
						|
        $jsConfig = json_decode($block->getJsLayout(), true);
 | 
						|
        $this->assertArrayHasKey('config', $jsConfig['components']['payLater']);
 | 
						|
        $this->assertArrayHasKey('sdkUrl', $jsConfig['components']['payLater']['config']);
 | 
						|
        $this->assertStringContainsString($expectedUrl, $jsConfig['components']['payLater']['config']['sdkUrl']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function sdkUrlDataProvider()
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            [
 | 
						|
                'blockConfig' => [
 | 
						|
                    'jsLayout' => [
 | 
						|
                        'components' => [
 | 
						|
                            'payLater' => [
 | 
						|
                                'config' => [
 | 
						|
                                ]
 | 
						|
                            ]
 | 
						|
                        ]
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'expectedUrl' => 'paypal.com/sdk'
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'blockConfig' => [
 | 
						|
                    'jsLayout' => [
 | 
						|
                        'components' => [
 | 
						|
                            'payLater' => [
 | 
						|
                                'config' => [
 | 
						|
                                    'attributes' => ['test1' => 'value1']
 | 
						|
                                ]
 | 
						|
                            ]
 | 
						|
                        ]
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'expectedUrl' => 'paypal.com/sdk'
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'blockConfig' => [
 | 
						|
                    'jsLayout' => [
 | 
						|
                        'components' => [
 | 
						|
                            'payLater' => [
 | 
						|
                                'config' => [
 | 
						|
                                    'sdkUrl' => 'http://mock.url'
 | 
						|
                                ]
 | 
						|
                            ]
 | 
						|
                        ]
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'expectedUrl' => 'mock.url'
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     */
 | 
						|
    public function testToHtml()
 | 
						|
    {
 | 
						|
        $paymentMethod = sprintf('payment/%s/active', Config::METHOD_EXPRESS);
 | 
						|
        $systemConfig = [
 | 
						|
                $paymentMethod => 1,
 | 
						|
                'payment/paypal_paylater/experience_active' => 1,
 | 
						|
                'payment/paypal_paylater/enabled' => 1,
 | 
						|
                'payment/paypal_paylater/test3page_display' => 1,
 | 
						|
                'payment/paypal_paylater/test3page_position' => 'header'
 | 
						|
        ];
 | 
						|
        $blockConfig = [
 | 
						|
            'placement' => 'test3',
 | 
						|
            'position' => 'header'
 | 
						|
        ];
 | 
						|
        $this->setConfig($systemConfig);
 | 
						|
        $layout = Bootstrap::getObjectManager()->get(LayoutInterface::class);
 | 
						|
 | 
						|
        /** @var Banner $block */
 | 
						|
        $block = $layout->createBlock(Banner::class, '', ['data' => $blockConfig]);
 | 
						|
        $block->setTemplate('Magento_Paypal::paylater/banner.phtml');
 | 
						|
 | 
						|
        $this->assertNotEmpty($block->toHtml());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check display configuration
 | 
						|
     *
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @dataProvider toHtmlEmptyDataProvider
 | 
						|
     * @param $systemConfig
 | 
						|
     * @param $blockConfig
 | 
						|
     */
 | 
						|
    public function testToHtmlEmpty($systemConfig, $blockConfig)
 | 
						|
    {
 | 
						|
        //Enable all required options
 | 
						|
        $paymentMethod = sprintf('payment/%s/active', Config::METHOD_EXPRESS);
 | 
						|
        $enableSystemConfig = [
 | 
						|
            $paymentMethod => 1,
 | 
						|
            'payment/paypal_paylater/experience_active' => 1,
 | 
						|
            'payment/paypal_paylater/enabled' => 1,
 | 
						|
            'payment/paypal_paylater/test4page_display' => 1,
 | 
						|
            'payment/paypal_paylater/test4page_position' => 'near_pp_button'
 | 
						|
        ];
 | 
						|
        $enableBlockConfig = [
 | 
						|
            'placement' => 'test4',
 | 
						|
            'position' => 'near_pp_button'
 | 
						|
        ];
 | 
						|
        //Disable specific system configuration option
 | 
						|
        $systemConfig = array_replace($enableSystemConfig, $systemConfig);
 | 
						|
        // Update block config
 | 
						|
        $blockConfig = array_replace($enableBlockConfig, $blockConfig);
 | 
						|
        $this->setConfig($systemConfig);
 | 
						|
        $layout = Bootstrap::getObjectManager()->get(LayoutInterface::class);
 | 
						|
        /** @var Banner $block */
 | 
						|
        $block = $layout->createBlock(Banner::class, '', ['data' => $blockConfig]);
 | 
						|
        $block->setTemplate('Magento_Paypal::paylater/banner.phtml');
 | 
						|
 | 
						|
        $this->assertEmpty($block->toHtml());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array[]
 | 
						|
     */
 | 
						|
    public function toHtmlEmptyDataProvider()
 | 
						|
    {
 | 
						|
        $paymentPath = 'payment/%s/active';
 | 
						|
        return [
 | 
						|
            [
 | 
						|
                'systemConfig' => ['payment/paypal_paylater/experience_active' => 0],
 | 
						|
                'blockConfig' => []
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'systemConfig' => ['payment/paypal_paylater/enabled' => 0],
 | 
						|
                'blockConfig' => []
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'systemConfig' => ['payment/paypal_paylater/test4page_display' => 0],
 | 
						|
                'blockConfig' => []
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'systemConfig' => [],
 | 
						|
                'blockConfig' => ['position' => 'header']
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'systemConfig' => [sprintf($paymentPath, Config::METHOD_EXPRESS) => 0],
 | 
						|
                'blockConfig' => []
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'systemConfig' => ['paypal/style/disable_funding_options' => 'CREDIT'],
 | 
						|
                'blockConfig' => []
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set system configuration value for test
 | 
						|
     *
 | 
						|
     * @param $config
 | 
						|
     */
 | 
						|
    private function setConfig($config)
 | 
						|
    {
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
        /** @var $scopeConfig MutableScopeConfig */
 | 
						|
        $scopeConfig = $objectManager->get(MutableScopeConfigInterface::class);
 | 
						|
        foreach ($config as $path => $value) {
 | 
						|
            $scopeConfig->setValue($path, $value, ScopeInterface::SCOPE_STORE);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |