public function testInitTotalsCanApplyDiscount()
 {
     $address = $this->getMock('Magento\\Sales\\Model\\Quote\\Address', [], [], '', false);
     $rule = $this->getMock('Magento\\SalesRule\\Model\\Rule', ['getSimpleAction', 'getActions', 'getId'], [], '', false);
     $item1 = $this->getMockForAbstractClass('Magento\\Sales\\Model\\Quote\\Item\\AbstractItem', [], '', false, true, true, ['__clone', 'getDiscountCalculationPrice', 'getBaseDiscountCalculationPrice', 'getCalculationPrice']);
     $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')->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->getMock('Magento\\Rule\\Model\\Action\\Collection', ['validate'], [], '', false);
     $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, $address);
     $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']);
 }
 /**
  * Check if we can apply discount to current QuoteItem
  *
  * @param AbstractItem $item
  * @return bool
  */
 public function canApplyDiscount(AbstractItem $item)
 {
     $result = true;
     /** @var \Zend_Validate_Interface $validator */
     foreach ($this->validators->getValidators('discount') as $validator) {
         $result = $validator->isValid($item);
         if (!$result) {
             break;
         }
     }
     return $result;
 }