/** * @covers \Magento\SalesRule\Model\Rule\Action\Discount\CartFixed::calculate */ public function testCalculate() { $this->rule->setData(['id' => 1, 'discount_amount' => 10.0]); $this->address->expects($this->any())->method('getCartFixedRules')->will($this->returnValue([])); $store = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false); $this->priceCurrency->expects($this->atLeastOnce())->method('convert')->will($this->returnArgument(0)); $this->priceCurrency->expects($this->atLeastOnce())->method('round')->will($this->returnArgument(0)); $this->quote->expects($this->any())->method('getStore')->will($this->returnValue($store)); /** validators data */ $this->validator->expects($this->once())->method('getItemPrice')->with($this->item)->will($this->returnValue(100)); $this->validator->expects($this->once())->method('getItemBasePrice')->with($this->item)->will($this->returnValue(100)); $this->validator->expects($this->once())->method('getItemOriginalPrice')->with($this->item)->will($this->returnValue(100)); $this->validator->expects($this->once())->method('getItemBaseOriginalPrice')->with($this->item)->will($this->returnValue(100)); $this->address->expects($this->once())->method('setCartFixedRules')->with([1 => 0.0]); $this->model->calculate($this->rule, $this->item, 1); $this->assertEquals($this->data->getAmount(), 10); $this->assertEquals($this->data->getBaseAmount(), 10); $this->assertEquals($this->data->getOriginalAmount(), 10); $this->assertEquals($this->data->getBaseOriginalAmount(), 100); }
public function testProcessFreeShipping() { $item = $this->getMock('Magento\\Quote\\Model\\Quote\\Item', ['getAddress', '__wakeup'], [], '', false); $item->expects($this->once())->method('getAddress')->will($this->returnValue(true)); $this->assertInstanceOf('Magento\\OfflineShipping\\Model\\SalesRule\\Calculator', $this->_model->processFreeShipping($item)); return true; }
/** * Collect address discount amount * * @param Address $address * @return $this */ public function collect(Address $address) { parent::collect($address); $quote = $address->getQuote(); $store = $this->_storeManager->getStore($quote->getStoreId()); $this->_calculator->reset($address); $items = $this->_getAddressItems($address); if (!count($items)) { return $this; } $eventArgs = array('website_id' => $store->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode()); $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode()); $this->_calculator->initTotals($items, $address); $address->setDiscountDescription(array()); $items = $this->_calculator->sortItemsByPriority($items); foreach ($items as $item) { if ($item->getNoDiscount()) { $item->setDiscountAmount(0); $item->setBaseDiscountAmount(0); continue; } /** * Child item discount we calculate for parent */ if ($item->getParentItemId()) { continue; } $eventArgs['item'] = $item; $this->_eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); if ($item->getHasChildren() && $item->isChildrenCalculated()) { $isMatchedParent = $this->_calculator->canApplyRules($item); $this->_calculator->setSkipActionsValidation($isMatchedParent); foreach ($item->getChildren() as $child) { $this->_calculator->process($child); if ($isMatchedParent) { $this->_recalculateChildDiscount($child); } $eventArgs['item'] = $child; $this->_eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); $this->_aggregateItemDiscount($child); } $this->_calculator->setSkipActionsValidation(false); } else { $this->_calculator->process($item); $this->_aggregateItemDiscount($item); } } /** * Process shipping amount discount */ $address->setShippingDiscountAmount(0); $address->setBaseShippingDiscountAmount(0); if ($address->getShippingAmount()) { $this->_calculator->processShippingAmount($address); $this->_addAmount(-$address->getShippingDiscountAmount()); $this->_addBaseAmount(-$address->getBaseShippingDiscountAmount()); } $this->_calculator->prepareDescription($address); return $this; }
public function testCanApplyRules() { $item = $this->getQuoteItemMock(); $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 testReset() { $this->utility->expects($this->once())->method('resetRoundingDeltas'); $quoteMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote')->disableOriginalConstructor()->getMock(); $addressMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote\\Address')->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', $this->model->reset($addressMock)); }
/** * @param $qty * @param $ruleData * @param $itemData * @param $validItemData * @param $expectedRuleDiscountQty * @param $expectedDiscountData * @dataProvider calculateDataProvider * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCalculate($qty, $ruleData, $itemData, $validItemData, $expectedRuleDiscountQty, $expectedDiscountData) { $discountData = $this->getMockBuilder('Magento\\SalesRule\\Model\\Rule\\Action\\Discount\\Data')->disableOriginalConstructor()->setMethods(['setAmount', 'setBaseAmount', 'setOriginalAmount', 'setBaseOriginalAmount'])->getMock(); $this->discountDataFactory->expects($this->once())->method('create')->will($this->returnValue($discountData)); $rule = $this->getMockBuilder('Magento\\SalesRule\\Model\\Rule')->disableOriginalConstructor()->setMethods(['getDiscountAmount', 'getDiscountQty', '__wakeup'])->getMock(); $item = $this->getMockBuilder('Magento\\Quote\\Model\\Quote\\Item\\AbstractItem')->disableOriginalConstructor()->setMethods(['getDiscountAmount', 'getBaseDiscountAmount', 'getDiscountPercent', 'setDiscountPercent', '__wakeup', 'getQuote', 'getAddress', 'getOptionByCode'])->getMock(); $this->validator->expects($this->atLeastOnce())->method('getItemPrice')->with($item)->will($this->returnValue($validItemData['price'])); $this->validator->expects($this->atLeastOnce())->method('getItemBasePrice')->with($item)->will($this->returnValue($validItemData['basePrice'])); $this->validator->expects($this->atLeastOnce())->method('getItemOriginalPrice')->with($item)->will($this->returnValue($validItemData['originalPrice'])); $this->validator->expects($this->atLeastOnce())->method('getItemBaseOriginalPrice')->with($item)->will($this->returnValue($validItemData['baseOriginalPrice'])); $rule->expects($this->atLeastOnce())->method('getDiscountAmount')->will($this->returnValue($ruleData['discountAmount'])); $rule->expects($this->atLeastOnce())->method('getDiscountQty')->will($this->returnValue($ruleData['discountQty'])); $item->expects($this->atLeastOnce())->method('getDiscountAmount')->will($this->returnValue($itemData['discountAmount'])); $item->expects($this->atLeastOnce())->method('getBaseDiscountAmount')->will($this->returnValue($itemData['baseDiscountAmount'])); if (!$ruleData['discountQty'] || $ruleData['discountQty'] > $qty) { $item->expects($this->atLeastOnce())->method('getDiscountPercent')->will($this->returnValue($itemData['discountPercent'])); $item->expects($this->atLeastOnce())->method('setDiscountPercent')->with($expectedRuleDiscountQty); } $discountData->expects($this->once())->method('setAmount')->with($expectedDiscountData['amount']); $discountData->expects($this->once())->method('setBaseAmount')->with($expectedDiscountData['baseAmount']); $discountData->expects($this->once())->method('setOriginalAmount')->with($expectedDiscountData['originalAmount']); $discountData->expects($this->once())->method('setBaseOriginalAmount')->with($expectedDiscountData['baseOriginalAmount']); $this->assertEquals($discountData, $this->model->calculate($rule, $item, $qty)); }
/** * Collect address discount amount * * @param \Magento\Quote\Model\Quote $quote * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment * @param \Magento\Quote\Model\Quote\Address\Total $total * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function collect(\Magento\Quote\Model\Quote $quote, \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment, \Magento\Quote\Model\Quote\Address\Total $total) { parent::collect($quote, $shippingAssignment, $total); $store = $this->storeManager->getStore($quote->getStoreId()); $address = $shippingAssignment->getShipping()->getAddress(); $this->calculator->reset($address); $items = $shippingAssignment->getItems(); if (!count($items)) { return $this; } $eventArgs = ['website_id' => $store->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode()]; $this->calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode()); $this->calculator->initTotals($items, $address); $address->setDiscountDescription([]); $items = $this->calculator->sortItemsByPriority($items); /** @var \Magento\Quote\Model\Quote\Item $item */ foreach ($items as $item) { if ($item->getNoDiscount() || !$this->calculator->canApplyDiscount($item)) { $item->setDiscountAmount(0); $item->setBaseDiscountAmount(0); // ensure my children are zeroed out if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $child->setDiscountAmount(0); $child->setBaseDiscountAmount(0); } } continue; } // to determine the child item discount, we calculate the parent if ($item->getParentItem()) { continue; } $eventArgs['item'] = $item; $this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); if ($item->getHasChildren() && $item->isChildrenCalculated()) { $this->calculator->process($item); $this->distributeDiscount($item); foreach ($item->getChildren() as $child) { $eventArgs['item'] = $child; $this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); $this->aggregateItemDiscount($child, $total); } } else { $this->calculator->process($item); $this->aggregateItemDiscount($item, $total); } } /** Process shipping amount discount */ $address->setShippingDiscountAmount(0); $address->setBaseShippingDiscountAmount(0); if ($address->getShippingAmount()) { $this->calculator->processShippingAmount($address); $total->addTotalAmount($this->getCode(), -$address->getShippingDiscountAmount()); $total->addBaseTotalAmount($this->getCode(), -$address->getBaseShippingDiscountAmount()); } $this->calculator->prepareDescription($address); $total->setDiscountDescription($address->getDiscountDescription()); $total->setSubtotalWithDiscount($total->getSubtotal() + $total->getDiscountAmount()); $total->setBaseSubtotalWithDiscount($total->getBaseSubtotal() + $total->getBaseDiscountAmount()); return $this; }