123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\SalesRule\Test\Unit\Model;
- /**
- * Class ValidatorTest
- * @@SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class ValidatorTest extends \PHPUnit\Framework\TestCase
- {
- /**
- * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
- */
- protected $helper;
- /**
- * @var \Magento\SalesRule\Model\Validator
- */
- protected $model;
- /**
- * @var \Magento\Quote\Model\Quote\Item|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $item;
- /**
- * @var \Magento\Quote\Model\Quote\Address|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $addressMock;
- /**
- * @var \Magento\SalesRule\Model\RulesApplier|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $rulesApplier;
- /**
- * @var \Magento\SalesRule\Model\Validator\Pool|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $validators;
- /**
- * @var \Magento\SalesRule\Model\Utility|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $utility;
- /**
- * @var \Magento\SalesRule\Model\ResourceModel\Rule\Collection|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $ruleCollection;
- /**
- * @var \Magento\Catalog\Helper\Data|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $catalogData;
- /**
- * @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
- */
- protected $messageManager;
- protected function setUp()
- {
- $this->helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
- $this->rulesApplier = $this->createPartialMock(
- \Magento\SalesRule\Model\RulesApplier::class,
- ['setAppliedRuleIds', 'applyRules', 'addDiscountDescription', '__wakeup']
- );
- $this->addressMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Address::class)
- ->disableOriginalConstructor()
- ->setMethods(
- [
- 'getShippingAmountForDiscount',
- 'getQuote',
- 'getCustomAttributesCodes',
- 'setCartFixedRules'
- ]
- )
- ->getMock();
- /** @var \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $item */
- $this->item = $this->createPartialMock(
- \Magento\Quote\Model\Quote\Item::class,
- ['__wakeup', 'getAddress', 'getParentItemId']
- );
- $this->item->expects($this->any())
- ->method('getAddress')
- ->willReturn($this->addressMock);
- $context = $this->createMock(\Magento\Framework\Model\Context::class);
- $registry = $this->createMock(\Magento\Framework\Registry::class);
- $this->catalogData = $this->createMock(\Magento\Catalog\Helper\Data::class);
- $this->utility = $this->createMock(\Magento\SalesRule\Model\Utility::class);
- $this->validators = $this->createPartialMock(\Magento\SalesRule\Model\Validator\Pool::class, ['getValidators']);
- $this->messageManager = $this->createMock(\Magento\Framework\Message\Manager::class);
- $this->ruleCollection = $this->getMockBuilder(\Magento\SalesRule\Model\ResourceModel\Rule\Collection::class)
- ->disableOriginalConstructor()
- ->getMock();
- $ruleCollectionFactoryMock = $this->prepareRuleCollectionMock($this->ruleCollection);
- /** @var \Magento\SalesRule\Model\Validator|\PHPUnit_Framework_MockObject_MockObject $validator */
- $this->model = $this->helper->getObject(
- \Magento\SalesRule\Model\Validator::class,
- [
- 'context' => $context,
- 'registry' => $registry,
- 'collectionFactory' => $ruleCollectionFactoryMock,
- 'catalogData' => $this->catalogData,
- 'utility' => $this->utility,
- 'rulesApplier' => $this->rulesApplier,
- 'validators' => $this->validators,
- 'messageManager' => $this->messageManager
- ]
- );
- $this->model->setWebsiteId(1);
- $this->model->setCustomerGroupId(2);
- $this->model->setCouponCode('code');
- $this->ruleCollection->expects($this->any())
- ->method('setValidationFilter')
- ->with(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode(),
- null,
- $this->addressMock
- )
- ->willReturnSelf();
- }
- /**
- * @return \Magento\Quote\Model\Quote\Item|\PHPUnit_Framework_MockObject_MockObject
- */
- protected function getQuoteItemMock()
- {
- $fixturePath = __DIR__ . '/_files/';
- $itemDownloadable = $this->createPartialMock(
- \Magento\Quote\Model\Quote\Item::class,
- ['getAddress', '__wakeup']
- );
- $itemDownloadable->expects($this->any())->method('getAddress')->will($this->returnValue($this->addressMock));
- $itemSimple = $this->createPartialMock(\Magento\Quote\Model\Quote\Item::class, ['getAddress', '__wakeup']);
- $itemSimple->expects($this->any())->method('getAddress')->will($this->returnValue($this->addressMock));
- /** @var $quote \Magento\Quote\Model\Quote */
- $quote = $this->createPartialMock(\Magento\Quote\Model\Quote::class, ['getStoreId', '__wakeup']);
- $quote->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
- $itemData = include $fixturePath . 'quote_item_downloadable.php';
- $itemDownloadable->addData($itemData);
- $quote->addItem($itemDownloadable);
- $itemData = include $fixturePath . 'quote_item_simple.php';
- $itemSimple->addData($itemData);
- $quote->addItem($itemSimple);
- return $itemDownloadable;
- }
- public function testCanApplyRules()
- {
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $item = $this->getQuoteItemMock();
- $rule = $this->createMock(\Magento\SalesRule\Model\Rule::class);
- $actionsCollection = $this->createPartialMock(\Magento\Rule\Model\Action\Collection::class, ['validate']);
- $actionsCollection->expects($this->any())
- ->method('validate')
- ->with($item)
- ->willReturn(true);
- $rule->expects($this->any())
- ->method('getActions')
- ->willReturn($actionsCollection);
- $iterator = new \ArrayIterator([$rule]);
- $this->ruleCollection->expects($this->any())
- ->method('getIterator')
- ->willReturn($iterator);
- $this->utility->expects($this->any())
- ->method('canProcessRule')
- ->with($rule, $this->anything())
- ->willReturn(true);
- $quote = $item->getQuote();
- $quote->setItemsQty(2);
- $quote->setVirtualItemsQty(1);
- $this->assertTrue($this->model->canApplyRules($item));
- $quote->setItemsQty(2);
- $quote->setVirtualItemsQty(2);
- $this->assertTrue($this->model->canApplyRules($item));
- }
- public function testProcess()
- {
- $negativePrice = -1;
- $this->item->setDiscountCalculationPrice($negativePrice);
- $this->item->setData('calculation_price', $negativePrice);
- $this->rulesApplier->expects($this->never())->method('applyRules');
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->model->process($this->item);
- }
- public function testProcessWhenItemPriceIsNegativeDiscountsAreZeroed()
- {
- $negativePrice = -1;
- $nonZeroDiscount = 123;
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->item->setDiscountCalculationPrice($negativePrice);
- $this->item->setData('calculation_price', $negativePrice);
- $this->item->setDiscountAmount($nonZeroDiscount);
- $this->item->setBaseDiscountAmount($nonZeroDiscount);
- $this->item->setDiscountPercent($nonZeroDiscount);
- $this->model->process($this->item);
- $this->assertEquals(0, $this->item->getDiscountAmount());
- $this->assertEquals(0, $this->item->getBaseDiscountAmount());
- $this->assertEquals(0, $this->item->getDiscountPercent());
- }
- public function testApplyRulesThatAppliedRuleIdsAreCollected()
- {
- $positivePrice = 1;
- $ruleId1 = 123;
- $ruleId2 = 234;
- $expectedRuleIds = [$ruleId1 => $ruleId1, $ruleId2 => $ruleId2];
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->item->setDiscountCalculationPrice($positivePrice);
- $this->item->setData('calculation_price', $positivePrice);
- $this->model->setSkipActionsValidation(true);
- $this->rulesApplier->expects($this->once())
- ->method('applyRules')
- ->with(
- $this->equalTo($this->item),
- $this->equalTo($this->ruleCollection),
- $this->anything(),
- $this->anything()
- )
- ->will($this->returnValue($expectedRuleIds));
- $this->rulesApplier->expects($this->once())
- ->method('setAppliedRuleIds')
- ->with(
- $this->anything(),
- $expectedRuleIds
- );
- $this->model->process($this->item);
- }
- public function testInit()
- {
- $this->assertInstanceOf(
- \Magento\SalesRule\Model\Validator::class,
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- )
- );
- }
- public function testCanApplyDiscount()
- {
- $validator = $this->getMockBuilder(\Magento\Framework\Validator\AbstractValidator::class)
- ->setMethods(['isValid'])
- ->disableOriginalConstructor()
- ->getMockForAbstractClass();
- $this->validators->expects($this->any())
- ->method('getValidators')
- ->with('discount')
- ->willReturn([$validator]);
- $validator->expects($this->any())
- ->method('isValid')
- ->with($this->item)
- ->willReturn(false);
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->assertFalse($this->model->canApplyDiscount($this->item));
- }
- public function testInitTotalsCanApplyDiscount()
- {
- $rule = $this->createPartialMock(
- \Magento\SalesRule\Model\Rule::class,
- ['getSimpleAction', 'getActions', 'getId']
- );
- $item1 = $this->getMockForAbstractClass(
- \Magento\Quote\Model\Quote\Item\AbstractItem::class,
- [],
- '',
- false,
- true,
- true,
- [
- '__clone',
- 'getDiscountCalculationPrice',
- 'getBaseDiscountCalculationPrice',
- 'getCalculationPrice',
- 'getParentItemId'
- ]
- );
- $item2 = clone $item1;
- $items = [$item1, $item2];
- $rule->expects($this->any())
- ->method('getSimpleAction')
- ->willReturn(\Magento\SalesRule\Model\Rule::CART_FIXED_ACTION);
- $iterator = new \ArrayIterator([$rule]);
- $this->ruleCollection->expects($this->once())->method('getIterator')->willReturn($iterator);
- $validator = $this->getMockBuilder(\Magento\Framework\Validator\AbstractValidator::class)
- ->setMethods(['isValid'])
- ->disableOriginalConstructor()
- ->getMockForAbstractClass();
- $this->validators->expects($this->atLeastOnce())->method('getValidators')->with('discount')
- ->willReturn([$validator]);
- $validator->expects($this->at(0))->method('isValid')->with($item1)->willReturn(false);
- $validator->expects($this->at(1))->method('isValid')->with($item2)->willReturn(true);
- $item1->expects($this->any())->method('getParentItemId')->willReturn(false);
- $item1->expects($this->never())->method('getDiscountCalculationPrice');
- $item1->expects($this->never())->method('getBaseDiscountCalculationPrice');
- $item2->expects($this->any())->method('getParentItemId')->willReturn(false);
- $item2->expects($this->any())->method('getDiscountCalculationPrice')->willReturn(50);
- $item2->expects($this->once())->method('getBaseDiscountCalculationPrice')->willReturn(50);
- $this->utility->expects($this->once())->method('getItemQty')->willReturn(1);
- $this->utility->expects($this->any())->method('canProcessRule')->willReturn(true);
- $actionsCollection = $this->createPartialMock(\Magento\Rule\Model\Action\Collection::class, ['validate']);
- $actionsCollection->expects($this->at(0))->method('validate')->with($item1)->willReturn(true);
- $actionsCollection->expects($this->at(1))->method('validate')->with($item2)->willReturn(true);
- $rule->expects($this->any())->method('getActions')->willReturn($actionsCollection);
- $rule->expects($this->any())->method('getId')->willReturn(1);
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->model->initTotals($items, $this->addressMock);
- $this->assertArrayHasKey('items_price', $this->model->getRuleItemTotalsInfo($rule->getId()));
- $this->assertArrayHasKey('base_items_price', $this->model->getRuleItemTotalsInfo($rule->getId()));
- $this->assertArrayHasKey('items_count', $this->model->getRuleItemTotalsInfo($rule->getId()));
- $this->assertEquals(1, $this->model->getRuleItemTotalsInfo($rule->getId())['items_count']);
- }
- public function testInitTotalsNoItems()
- {
- $address = $this->createMock(\Magento\Quote\Model\Quote\Address::class);
- $this->item->expects($this->never())
- ->method('getParentItemId');
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->model->initTotals([], $address);
- }
- /**
- * @param $ruleCollection
- * @return \PHPUnit_Framework_MockObject_MockObject
- */
- protected function prepareRuleCollectionMock($ruleCollection)
- {
- $this->ruleCollection->expects($this->any())
- ->method('addFieldToFilter')
- ->with('is_active', 1)
- ->will($this->returnSelf());
- $this->ruleCollection->expects($this->any())
- ->method('load')
- ->will($this->returnSelf());
- $ruleCollectionFactoryMock =
- $this->getMockBuilder(\Magento\SalesRule\Model\ResourceModel\Rule\CollectionFactory::class)
- ->disableOriginalConstructor()
- ->setMethods(['create'])
- ->getMock();
- $ruleCollectionFactoryMock->expects($this->any())
- ->method('create')
- ->will($this->returnValue($ruleCollection));
- return $ruleCollectionFactoryMock;
- }
- public function testProcessShippingAmountNoRules()
- {
- $iterator = new \ArrayIterator([]);
- $this->ruleCollection->expects($this->any())
- ->method('getIterator')
- ->willReturn($iterator);
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->assertInstanceOf(
- \Magento\SalesRule\Model\Validator::class,
- $this->model->processShippingAmount($this->setupAddressMock())
- );
- }
- public function testProcessShippingAmountProcessDisabled()
- {
- $ruleMock = $this->getMockBuilder(\Magento\SalesRule\Model\Rule::class)
- ->disableOriginalConstructor()
- ->setMethods([])
- ->getMock();
- $iterator = new \ArrayIterator([$ruleMock]);
- $this->ruleCollection->expects($this->any())
- ->method('getIterator')
- ->willReturn($iterator);
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->assertInstanceOf(
- \Magento\SalesRule\Model\Validator::class,
- $this->model->processShippingAmount($this->setupAddressMock())
- );
- }
- /**
- * @param string $action
- * @dataProvider dataProviderActions
- */
- public function testProcessShippingAmountActions($action)
- {
- $discountAmount = 50;
- $ruleMock = $this->getMockBuilder(\Magento\SalesRule\Model\Rule::class)
- ->disableOriginalConstructor()
- ->setMethods(['getApplyToShipping', 'getSimpleAction', 'getDiscountAmount'])
- ->getMock();
- $ruleMock->expects($this->any())
- ->method('getApplyToShipping')
- ->willReturn(true);
- $ruleMock->expects($this->any())
- ->method('getDiscountAmount')
- ->willReturn($discountAmount);
- $ruleMock->expects($this->any())
- ->method('getSimpleAction')
- ->willReturn($action);
- $iterator = new \ArrayIterator([$ruleMock]);
- $this->ruleCollection->expects($this->any())
- ->method('getIterator')
- ->willReturn($iterator);
- $this->utility->expects($this->any())
- ->method('canProcessRule')
- ->willReturn(true);
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->assertInstanceOf(
- \Magento\SalesRule\Model\Validator::class,
- $this->model->processShippingAmount($this->setupAddressMock(5))
- );
- }
- /**
- * @return array
- */
- public static function dataProviderActions()
- {
- return [
- [\Magento\SalesRule\Model\Rule::TO_PERCENT_ACTION],
- [\Magento\SalesRule\Model\Rule::BY_PERCENT_ACTION],
- [\Magento\SalesRule\Model\Rule::TO_FIXED_ACTION],
- [\Magento\SalesRule\Model\Rule::BY_FIXED_ACTION],
- [\Magento\SalesRule\Model\Rule::CART_FIXED_ACTION],
- ];
- }
- /**
- * @param null|int $shippingAmount
- * @return \PHPUnit_Framework_MockObject_MockObject
- */
- protected function setupAddressMock($shippingAmount = null)
- {
- $storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
- ->disableOriginalConstructor()
- ->setMethods([])
- ->getMock();
- $quoteMock = $this->getMockBuilder(\Magento\Quote\Model\Quote::class)
- ->disableOriginalConstructor()
- ->setMethods(['setAppliedRuleIds', 'getStore'])
- ->getMock();
- $quoteMock->expects($this->any())
- ->method('getStore')
- ->willReturn($storeMock);
- $quoteMock->expects($this->any())
- ->method('setAppliedRuleIds')
- ->willReturnSelf();
- $this->addressMock->expects($this->any())
- ->method('getShippingAmountForDiscount')
- ->willReturn($shippingAmount);
- $this->addressMock->expects($this->any())
- ->method('getQuote')
- ->willReturn($quoteMock);
- $this->addressMock->expects($this->any())
- ->method('getCustomAttributesCodes')
- ->willReturn([]);
- return $this->addressMock;
- }
- public function testReset()
- {
- $this->utility->expects($this->once())
- ->method('resetRoundingDeltas');
- $quoteMock = $this->getMockBuilder(\Magento\Quote\Model\Quote::class)
- ->disableOriginalConstructor()
- ->getMock();
- $addressMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Address::class)
- ->disableOriginalConstructor()
- ->getMock();
- $addressMock->expects($this->once())
- ->method('getQuote')
- ->willReturn($quoteMock);
- $this->model->init(
- $this->model->getWebsiteId(),
- $this->model->getCustomerGroupId(),
- $this->model->getCouponCode()
- );
- $this->assertInstanceOf(\Magento\SalesRule\Model\Validator::class, $this->model->reset($addressMock));
- }
- }
|