379 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\GraphQl\Weee;
 | 
						|
 | 
						|
use Magento\Framework\App\Config\ReinitableConfigInterface;
 | 
						|
use Magento\Framework\App\Config\ScopeConfigInterface;
 | 
						|
use Magento\Framework\App\Config\Storage\WriterInterface;
 | 
						|
use Magento\Framework\ObjectManager\ObjectManager;
 | 
						|
use Magento\GraphQl\Quote\GetMaskedQuoteIdByReservedOrderId;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\TestFramework\TestCase\GraphQlAbstract;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test for cart item fixed product tax
 | 
						|
 *
 | 
						|
 * @SuppressWarnings(PHPMD.TooManyPublicMethods)
 | 
						|
 */
 | 
						|
class CartItemPricesWithFPTTest extends GraphQlAbstract
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var ObjectManager $objectManager
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var string[]
 | 
						|
     */
 | 
						|
    private $initialConfig;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ScopeConfigInterface
 | 
						|
     */
 | 
						|
    private $scopeConfig;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var GetMaskedQuoteIdByReservedOrderId
 | 
						|
     */
 | 
						|
    private $getMaskedQuoteIdByReservedOrderId;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->scopeConfig = $this->objectManager->get(ScopeConfigInterface::class);
 | 
						|
        $this->getMaskedQuoteIdByReservedOrderId = $this->objectManager->get(GetMaskedQuoteIdByReservedOrderId::class);
 | 
						|
 | 
						|
        $currentSettingsArray = [
 | 
						|
            'tax/display/type',
 | 
						|
            'tax/weee/enable',
 | 
						|
            'tax/weee/display',
 | 
						|
            'tax/defaults/region',
 | 
						|
            'tax/weee/apply_vat',
 | 
						|
            'tax/calculation/price_includes_tax'
 | 
						|
        ];
 | 
						|
 | 
						|
        foreach ($currentSettingsArray as $configPath) {
 | 
						|
            $this->initialConfig[$configPath] = $this->scopeConfig->getValue(
 | 
						|
                $configPath
 | 
						|
            );
 | 
						|
        }
 | 
						|
        /** @var ReinitableConfigInterface $config */
 | 
						|
        $config = $this->objectManager->get(ReinitableConfigInterface::class);
 | 
						|
        $config->reinit();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        $this->writeConfig($this->initialConfig);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Write configuration for weee
 | 
						|
     *
 | 
						|
     * @param array $settings
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    private function writeConfig(array $settings): void
 | 
						|
    {
 | 
						|
        /** @var WriterInterface $configWriter */
 | 
						|
        $configWriter = $this->objectManager->get(WriterInterface::class);
 | 
						|
 | 
						|
        foreach ($settings as $path => $value) {
 | 
						|
            $configWriter->save($path, $value);
 | 
						|
        }
 | 
						|
        $this->scopeConfig->clean();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array $taxSettings
 | 
						|
     * @param array $expectedFtps
 | 
						|
     * @return void
 | 
						|
     *
 | 
						|
     * @throws \Magento\Framework\Exception\NoSuchEntityException
 | 
						|
     * @dataProvider cartItemFixedProductTaxDataProvider
 | 
						|
     * @magentoApiDataFixture Magento/GraphQl/Tax/_files/tax_rule_for_region_1.php
 | 
						|
     * @magentoApiDataFixture Magento/Weee/_files/product_with_two_fpt.php
 | 
						|
     * @magentoApiDataFixture Magento/GraphQl/Weee/_files/add_fpt_for_region_1.php
 | 
						|
     * @magentoApiDataFixture Magento/GraphQl/Weee/_files/apply_tax_for_simple_product_with_fpt.php
 | 
						|
     * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
 | 
						|
     * @magentoApiDataFixture Magento/GraphQl/Weee/_files/add_simple_product_with_fpt_to_cart.php
 | 
						|
     * @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
 | 
						|
     */
 | 
						|
    public function testCartItemFixedProductTax(array $taxSettings, array $expectedFtps): void
 | 
						|
    {
 | 
						|
        $this->writeConfig($taxSettings);
 | 
						|
        $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
 | 
						|
        $query = $this->getQuery($maskedQuoteId);
 | 
						|
        $result = $this->graphQlQuery($query);
 | 
						|
        $this->assertArrayNotHasKey('errors', $result);
 | 
						|
        $this->assertNotEmpty($result['cart']['items']);
 | 
						|
        $actualFtps = $result['cart']['items'][0]['prices']['fixed_product_taxes'];
 | 
						|
        $this->assertEqualsCanonicalizing($expectedFtps, $actualFtps);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function cartItemFixedProductTaxDataProvider(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '1',
 | 
						|
                    'tax/weee/apply_vat' => '0',
 | 
						|
                    'tax/calculation/price_includes_tax' => '0',
 | 
						|
                    'tax/display/type' => '1',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => [
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 10.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fpt_for_all_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 12.7
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 5.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '1',
 | 
						|
                    'tax/weee/apply_vat' => '0',
 | 
						|
                    'tax/calculation/price_includes_tax' => '1',
 | 
						|
                    'tax/display/type' => '1',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => [
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 10.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fpt_for_all_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 12.7
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 5.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '1',
 | 
						|
                    'tax/weee/apply_vat' => '1',
 | 
						|
                    'tax/calculation/price_includes_tax' => '0',
 | 
						|
                    'tax/display/type' => '1',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => [
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 10.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fpt_for_all_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 12.7
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 5.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '1',
 | 
						|
                    'tax/weee/apply_vat' => '1',
 | 
						|
                    'tax/calculation/price_includes_tax' => '0',
 | 
						|
                    'tax/display/type' => '2',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => [
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 10.75
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fpt_for_all_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 13.66
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 5.38
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '1',
 | 
						|
                    'tax/weee/apply_vat' => '1',
 | 
						|
                    'tax/calculation/price_includes_tax' => '1',
 | 
						|
                    'tax/display/type' => '1',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => [
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 10.0
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fpt_for_all_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 12.7
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 5.01
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '1',
 | 
						|
                    'tax/weee/apply_vat' => '1',
 | 
						|
                    'tax/calculation/price_includes_tax' => '1',
 | 
						|
                    'tax/display/type' => '2',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => [
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 10.75
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fpt_for_all_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 13.65
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'label' => 'fixed_product_attribute_front_label',
 | 
						|
                        'amount' => [
 | 
						|
                            'value' => 5.38
 | 
						|
                        ]
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'taxSettings' => [
 | 
						|
                    'tax/weee/enable' => '0',
 | 
						|
                    'tax/weee/apply_vat' => '1',
 | 
						|
                    'tax/calculation/price_includes_tax' => '1',
 | 
						|
                    'tax/display/type' => '1',
 | 
						|
                ],
 | 
						|
                'expectedFtps' => []
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Generates GraphQl query for retrieving cart totals
 | 
						|
     *
 | 
						|
     * @param string $maskedQuoteId
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    private function getQuery(string $maskedQuoteId): string
 | 
						|
    {
 | 
						|
        return <<<QUERY
 | 
						|
{
 | 
						|
  cart(cart_id: "$maskedQuoteId") {
 | 
						|
    items {
 | 
						|
      prices {
 | 
						|
        price {
 | 
						|
          value
 | 
						|
          currency
 | 
						|
        }
 | 
						|
        price_including_tax {
 | 
						|
            value
 | 
						|
            currency
 | 
						|
          }
 | 
						|
        row_total {
 | 
						|
          value
 | 
						|
          currency
 | 
						|
        }
 | 
						|
        row_total_including_tax {
 | 
						|
          value
 | 
						|
          currency
 | 
						|
        }
 | 
						|
        fixed_product_taxes {
 | 
						|
          label
 | 
						|
          amount {
 | 
						|
            value
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    prices {
 | 
						|
      grand_total {
 | 
						|
        value
 | 
						|
        currency
 | 
						|
      }
 | 
						|
      subtotal_including_tax {
 | 
						|
        value
 | 
						|
        currency
 | 
						|
      }
 | 
						|
      subtotal_excluding_tax {
 | 
						|
        value
 | 
						|
        currency
 | 
						|
      }
 | 
						|
      subtotal_with_discount_excluding_tax {
 | 
						|
        value
 | 
						|
        currency
 | 
						|
      }
 | 
						|
      applied_taxes {
 | 
						|
        label
 | 
						|
        amount {
 | 
						|
          value
 | 
						|
          currency
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
QUERY;
 | 
						|
    }
 | 
						|
}
 |