123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Tax\Test\Unit\Model\Plugin;
- use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
- class OrderSaveTest extends \PHPUnit\Framework\TestCase
- {
- const ORDERID = 123;
- const ITEMID = 151;
- const ORDER_ITEM_ID = 116;
- /**
- * @var \Magento\Tax\Model\Sales\Order\TaxFactory|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $orderTaxFactoryMock;
- /**
- * @var \Magento\Sales\Model\Order\Tax\ItemFactory|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $taxItemFactoryMock;
- /**
- * @var \Magento\Sales\Api\OrderRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $subjectMock;
- /**
- * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
- */
- protected $objectManagerHelper;
- /**
- * @var \Magento\Tax\Model\Plugin\OrderSave
- */
- protected $model;
- protected function setUp()
- {
- $this->orderTaxFactoryMock = $this->getMockBuilder(
- \Magento\Tax\Model\Sales\Order\TaxFactory::class
- )->disableOriginalConstructor()
- ->setMethods(['create'])
- ->getMock();
- $this->taxItemFactoryMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Tax\ItemFactory::class)
- ->disableOriginalConstructor()
- ->setMethods(['create'])
- ->getMock();
- $this->subjectMock = $this->getMockForAbstractClass(\Magento\Sales\Api\OrderRepositoryInterface::class);
- $this->objectManagerHelper = new ObjectManager($this);
- $this->model = $this->objectManagerHelper->getObject(
- \Magento\Tax\Model\Plugin\OrderSave::class,
- [
- 'orderTaxFactory' => $this->orderTaxFactoryMock,
- 'taxItemFactory' => $this->taxItemFactoryMock,
- ]
- );
- }
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject
- */
- protected function setupOrderMock()
- {
- $orderMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
- ->disableOriginalConstructor()
- ->setMethods(
- [
- 'getExtensionAttributes',
- 'getAppliedTaxIsSaved',
- 'getItemByQuoteItemId',
- 'setAppliedTaxIsSaved',
- 'getEntityId',
- ]
- )->getMock();
- return $orderMock;
- }
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject
- */
- protected function setupExtensionAttributeMock()
- {
- $orderExtensionAttributeMock = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderExtensionInterface::class)
- ->disableOriginalConstructor()
- ->setMethods(
- [
- 'getAppliedTaxes',
- 'getConvertingFromQuote',
- 'getItemAppliedTaxes',
- ]
- )->getMockForAbstractClass();
- return $orderExtensionAttributeMock;
- }
- /**
- * @param $expectedTaxes
- */
- protected function verifyOrderTaxes($expectedTaxes)
- {
- $index = 0;
- foreach ($expectedTaxes as $orderTaxId => $orderTaxData) {
- $orderTaxMock = $this->getMockBuilder(\Magento\Tax\Model\Sales\Order\Tax::class)
- ->disableOriginalConstructor()
- ->setMethods(
- [
- 'getTaxId',
- 'setData',
- 'save',
- ]
- )->getMock();
- $orderTaxMock->expects($this->once())
- ->method('setData')
- ->with($orderTaxData)
- ->willReturnSelf();
- $orderTaxMock->expects($this->once())
- ->method('save')
- ->willReturnSelf();
- $orderTaxMock->expects($this->atLeastOnce())
- ->method('getTaxId')
- ->willReturn($orderTaxId);
- $this->orderTaxFactoryMock->expects($this->at($index))
- ->method('create')
- ->willReturn($orderTaxMock);
- $index++;
- }
- }
- /**
- * @param $expectedItemTaxes
- */
- public function verifyItemTaxes($expectedItemTaxes)
- {
- $index = 0;
- foreach ($expectedItemTaxes as $itemTax) {
- $itemTaxMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Tax\Item::class)
- ->disableOriginalConstructor()
- ->setMethods(
- [
- 'setData',
- 'save',
- ]
- )->getMock();
- $itemTaxMock->expects($this->once())
- ->method('setData')
- ->with($itemTax)
- ->willReturnSelf();
- $itemTaxMock->expects($this->once())
- ->method('save')
- ->willReturnSelf();
- $this->taxItemFactoryMock->expects($this->at($index))
- ->method('create')
- ->willReturn($itemTaxMock);
- $index++;
- }
- }
- /**
- * @dataProvider afterSaveDataProvider
- */
- public function testAfterSave(
- $appliedTaxes,
- $itemAppliedTaxes,
- $expectedTaxes,
- $expectedItemTaxes
- ) {
- $orderMock = $this->setupOrderMock();
- $extensionAttributeMock = $this->setupExtensionAttributeMock();
- $extensionAttributeMock->expects($this->any())
- ->method('getConvertingFromQuote')
- ->willReturn(true);
- $extensionAttributeMock->expects($this->any())
- ->method('getAppliedTaxes')
- ->willReturn($appliedTaxes);
- $extensionAttributeMock->expects($this->any())
- ->method('getItemAppliedTaxes')
- ->willReturn($itemAppliedTaxes);
- $orderItemMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Item::class)
- ->disableOriginalConstructor()
- ->setMethods(['getId'])
- ->getMock();
- $orderItemMock->expects($this->atLeastOnce())
- ->method('getId')
- ->willReturn(self::ORDER_ITEM_ID);
- $orderMock->expects($this->once())
- ->method('getAppliedTaxIsSaved')
- ->willReturn(false);
- $orderMock->expects($this->once())
- ->method('getExtensionAttributes')
- ->willReturn($extensionAttributeMock);
- $orderMock->expects($this->atLeastOnce())
- ->method('getItemByQuoteItemId')
- ->with(self::ITEMID)
- ->willReturn($orderItemMock);
- $orderMock->expects($this->atLeastOnce())
- ->method('getEntityId')
- ->willReturn(self::ORDERID);
- $orderMock->expects($this->once())
- ->method('setAppliedTaxIsSaved')
- ->with(true);
- $this->verifyOrderTaxes($expectedTaxes);
- $this->verifyItemTaxes($expectedItemTaxes);
- $this->assertEquals($orderMock, $this->model->afterSave($this->subjectMock, $orderMock));
- }
- /**
- * @return array
- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
- */
- public function afterSaveDataProvider()
- {
- return [
- //one item with shipping
- //three tax rates: state and national tax rates of 6 and 5 percent with priority 0
- //city tax rate of 3 percent with priority 1
- 'item_with_shipping_three_tax' => [
- 'applied_taxes' => [
- [
- 'amount' => 0.66,
- 'base_amount' => 0.66,
- 'percent' => 11,
- 'id' => 'ILUS',
- 'extension_attributes' => [
- 'rates' => [
- [
- 'percent' => 6,
- 'code' => 'IL',
- 'title' => 'IL',
- ],
- [
- 'percent' => 5,
- 'code' => 'US',
- 'title' => 'US',
- ],
- ]
- ],
- ],
- [
- 'amount' => 0.2,
- 'base_amount' => 0.2,
- 'percent' => 3.33,
- 'id' => 'CityTax',
- 'extension_attributes' => [
- 'rates' => [
- [
- 'percent' => 3,
- 'code' => 'CityTax',
- 'title' => 'CityTax',
- ],
- ]
- ],
- ],
- ],
- 'item_applied_taxes' => [
- //item tax, three tax rates
- [
- //first two taxes are combined
- 'item_id' => self::ITEMID,
- 'type' => 'product',
- 'associated_item_id' => null,
- 'applied_taxes' => [
- [
- 'amount' => 0.11,
- 'base_amount' => 0.11,
- 'percent' => 11,
- 'id' => 'ILUS',
- 'extension_attributes' => [
- 'rates' => [
- [
- 'percent' => 6,
- 'code' => 'IL',
- 'title' => 'IL',
- ],
- [
- 'percent' => 5,
- 'code' => 'US',
- 'title' => 'US',
- ],
- ]
- ],
- ],
- //city tax
- [
- 'amount' => 0.03,
- 'base_amount' => 0.03,
- 'percent' => 3.33,
- 'id' => 'CityTax',
- 'extension_attributes' => [
- 'rates' => [
- [
- 'percent' => 3,
- 'code' => 'CityTax',
- 'title' => 'CityTax',
- ],
- ]
- ],
- ],
- ],
- ],
- //shipping tax
- [
- //first two taxes are combined
- 'item_id' => null,
- 'type' => 'shipping',
- 'associated_item_id' => null,
- 'applied_taxes' => [
- [
- 'amount' => 0.55,
- 'base_amount' => 0.55,
- 'percent' => 11,
- 'id' => 'ILUS',
- 'extension_attributes' => [
- 'rates' => [
- [
- 'percent' => 6,
- 'code' => 'IL',
- 'title' => 'IL',
- ],
- [
- 'percent' => 5,
- 'code' => 'US',
- 'title' => 'US',
- ],
- ]
- ],
- ],
- //city tax
- [
- 'amount' => 0.17,
- 'base_amount' => 0.17,
- 'percent' => 3.33,
- 'id' => 'CityTax',
- 'extension_attributes' => [
- 'rates' => [
- [
- 'percent' => 3,
- 'code' => 'CityTax',
- 'title' => 'CityTax',
- ],
- ]
- ],
- ],
- ],
- ],
- ],
- 'expected_order_taxes' => [
- //state tax
- '35' => [
- 'order_id' => self::ORDERID,
- 'code' => 'IL',
- 'title' => 'IL',
- 'hidden' => 0,
- 'percent' => 6,
- 'priority' => 0,
- 'position' => 0,
- 'amount' => 0.66,
- 'base_amount' => 0.66,
- 'process' => 0,
- 'base_real_amount' => 0.36,
- ],
- //federal tax
- '36' => [
- 'order_id' => self::ORDERID,
- 'code' => 'US',
- 'title' => 'US',
- 'hidden' => 0,
- 'percent' => 5,
- 'priority' => 0,
- 'position' => 0,
- 'amount' => 0.66, //combined amount
- 'base_amount' => 0.66,
- 'process' => 0,
- 'base_real_amount' => 0.3, //portion for specific rate
- ],
- //city tax
- '37' => [
- 'order_id' => self::ORDERID,
- 'code' => 'CityTax',
- 'title' => 'CityTax',
- 'hidden' => 0,
- 'percent' => 3,
- 'priority' => 0,
- 'position' => 0,
- 'amount' => 0.2, //combined amount
- 'base_amount' => 0.2,
- 'process' => 0,
- 'base_real_amount' => 0.18018018018018, //this number is meaningless since this is single rate
- ],
- ],
- 'expected_item_taxes' => [
- [
- //state tax for item
- 'item_id' => self::ORDER_ITEM_ID,
- 'tax_id' => '35',
- 'tax_percent' => 6,
- 'associated_item_id' => null,
- 'amount' => 0.11,
- 'base_amount' => 0.11,
- 'real_amount' => 0.06,
- 'real_base_amount' => 0.06,
- 'taxable_item_type' => 'product',
- ],
- [
- //state tax for shipping
- 'item_id' => null,
- 'tax_id' => '35',
- 'tax_percent' => 6,
- 'associated_item_id' => null,
- 'amount' => 0.55,
- 'base_amount' => 0.55,
- 'real_amount' => 0.3,
- 'real_base_amount' => 0.3,
- 'taxable_item_type' => 'shipping',
- ],
- [
- //federal tax for item
- 'item_id' => self::ORDER_ITEM_ID,
- 'tax_id' => '36',
- 'tax_percent' => 5,
- 'associated_item_id' => null,
- 'amount' => 0.11,
- 'base_amount' => 0.11,
- 'real_amount' => 0.05,
- 'real_base_amount' => 0.05,
- 'taxable_item_type' => 'product',
- ],
- [
- //federal tax for shipping
- 'item_id' => null,
- 'tax_id' => '36',
- 'tax_percent' => 5,
- 'associated_item_id' => null,
- 'amount' => 0.55,
- 'base_amount' => 0.55,
- 'real_amount' => 0.25,
- 'real_base_amount' => 0.25,
- 'taxable_item_type' => 'shipping',
- ],
- [
- //city tax for item
- 'item_id' => self::ORDER_ITEM_ID,
- 'tax_id' => '37',
- 'tax_percent' => 3.33,
- 'associated_item_id' => null,
- 'amount' => 0.03,
- 'base_amount' => 0.03,
- 'real_amount' => 0.03,
- 'real_base_amount' => 0.03,
- 'taxable_item_type' => 'product',
- ],
- [
- //city tax for shipping
- 'item_id' => null,
- 'tax_id' => '37',
- 'tax_percent' => 3.33,
- 'associated_item_id' => null,
- 'amount' => 0.17,
- 'base_amount' => 0.17,
- 'real_amount' => 0.17,
- 'real_base_amount' => 0.17,
- 'taxable_item_type' => 'shipping',
- ],
- ],
- ],
- ];
- }
- }
|