![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-sales/Test/Unit/Model/Order/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Sales\Test\Unit\Model\Order; use Magento\Directory\Model\Currency; use Magento\Directory\Model\PriceCurrency; use Magento\Framework\Event\Manager; use Magento\Framework\Model\Context; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Payment\Helper\Data; use Magento\Payment\Model\Method\AbstractMethod; use Magento\Payment\Model\Method\Adapter; use Magento\Sales\Api\CreditmemoManagementInterface; use Magento\Sales\Api\Data\OrderStatusHistoryInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\Order\Config; use Magento\Sales\Model\Order\Creditmemo; use Magento\Sales\Model\Order\CreditmemoFactory; use Magento\Sales\Model\Order\Invoice; use Magento\Sales\Model\Order\OrderStateResolverInterface; use Magento\Sales\Model\Order\Payment; use Magento\Sales\Model\Order\Payment\Operations\SaleOperation; use Magento\Sales\Model\Order\Payment\Processor; use Magento\Sales\Model\Order\Payment\Transaction; use Magento\Sales\Model\Order\Payment\Transaction\Builder; use Magento\Sales\Model\Order\Payment\Transaction\BuilderInterface; use Magento\Sales\Model\Order\Payment\Transaction\ManagerInterface; use Magento\Sales\Model\Order\Payment\Transaction\Repository; use Magento\Sales\Model\OrderRepository; use Magento\Sales\Model\ResourceModel\Order\Payment\Transaction\CollectionFactory; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyFields) */ class PaymentTest extends TestCase { const TRANSACTION_ID = 'ewr34fM49V0'; /** * @var Context|MockObject */ private $context; /** * @var OrderStateResolverInterface|MockObject */ private $orderStateResolver; /** * @var Payment */ private $payment; /** * @var Data|MockObject */ private $helper; /** * @var Manager|MockObject */ protected $eventManagerMock; /** * @var PriceCurrency|MockObject */ protected $priceCurrencyMock; /** * @var Currency|MockObject */ protected $currencyMock; /** * @var Order|MockObject */ private $order; /** * @var AbstractMethod|MockObject */ private $paymentMethod; /** * @var Invoice|MockObject */ private $invoice; /** * @var string */ private $transactionId; /** * @var MockObject */ protected $transactionCollectionFactory; /** * @var CreditmemoFactory|MockObject */ protected $creditmemoFactoryMock; /** * @var Creditmemo|MockObject */ protected $creditMemoMock; /** * @var Repository|MockObject */ protected $transactionRepositoryMock; /** * @var ManagerInterface|MockObject */ protected $transactionManagerMock; /** * @var BuilderInterface|MockObject */ protected $transactionBuilderMock; /** * @var Processor|MockObject */ protected $paymentProcessor; /** * @var OrderRepository|MockObject */ protected $orderRepository; /** * @var CreditmemoManagementInterface|MockObject */ private $creditmemoManagerMock; /** * @var SaleOperation|MockObject */ private $saleOperation; /** * @return void * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.TooManyFields) */ protected function setUp(): void { $this->eventManagerMock = $this->getMockBuilder(Manager::class) ->disableOriginalConstructor() ->getMock(); $this->saleOperation = $this->getMockBuilder(SaleOperation::class) ->disableOriginalConstructor() ->getMock(); $this->context = $this->getMockBuilder(Context::class) ->disableOriginalConstructor() ->getMock(); $this->context->expects($this->atLeastOnce()) ->method('getEventDispatcher') ->willReturn($this->eventManagerMock); $this->helper = $this->getMockBuilder(Data::class) ->disableOriginalConstructor() ->onlyMethods(['getMethodInstance']) ->getMock(); $this->priceCurrencyMock = $this->getMockBuilder(PriceCurrency::class) ->disableOriginalConstructor() ->onlyMethods(['format']) ->getMock(); $this->currencyMock = $this->getMockBuilder(Currency::class) ->disableOriginalConstructor() ->onlyMethods(['formatTxt']) ->getMock(); $transaction = Repository::class; $this->transactionRepositoryMock = $this->getMockBuilder($transaction) ->disableOriginalConstructor() ->onlyMethods(['get', 'getByTransactionType', 'getByTransactionId']) ->getMock(); $this->paymentProcessor = $this->createMock(Processor::class); $this->orderRepository = $this->createPartialMock(OrderRepository::class, ['get']); $this->priceCurrencyMock->expects($this->any()) ->method('format') ->willReturnCallback( function ($value) { return $value; } ); $this->paymentMethod = $this->getMockBuilder(Adapter::class) ->disableOriginalConstructor() ->getMock(); $this->invoice = $this->getMockBuilder(Invoice::class) ->disableOriginalConstructor() ->onlyMethods( [ 'getTransactionId', 'load', 'getId', 'pay', 'cancel', 'getGrandTotal', 'getBaseGrandTotal', 'getShippingAmount', 'getBaseShippingAmount', 'getBaseTotalRefunded', 'getItemsCollection', 'getOrder', 'register', 'capture' ] )->getMock(); $this->helper->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->order = $this->getMockBuilder(Order::class) ->disableOriginalConstructor() ->onlyMethods( [ 'getConfig', 'setState', 'setStatus', 'getStoreId', 'getBaseGrandTotal', 'getBaseCurrency', 'getBaseCurrencyCode', 'getTotalDue', 'getBaseTotalDue', 'getInvoiceCollection', 'addRelatedObject', 'getState', 'getStatus', 'addStatusHistoryComment', 'registerCancellation', 'getCustomerNote', 'prepareInvoice', 'getPaymentsCollection' ] )->addMethods(['setIsCustomerNotified']) ->getMock(); $this->transactionCollectionFactory = $this->getMockBuilder(CollectionFactory::class) ->onlyMethods(['create']) ->getMock(); $this->creditmemoFactoryMock = $this->createMock(CreditmemoFactory::class); $this->transactionManagerMock = $this->createMock( \Magento\Sales\Model\Order\Payment\Transaction\Manager::class ); $this->transactionBuilderMock = $this->createMock( Builder::class ); $this->orderStateResolver = $this->getMockBuilder(OrderStateResolverInterface::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); $this->creditMemoMock = $this->getMockBuilder(Creditmemo::class) ->disableOriginalConstructor() ->onlyMethods( [ 'getItemsCollection', 'getItems', 'addComment', 'save', 'getGrandTotal', 'getBaseGrandTotal', 'getInvoice', 'getOrder' ] )->addMethods( [ 'setPaymentRefundDisallowed', 'setAutomaticallyCreated', 'register', 'getDoTransaction', 'getPaymentRefundDisallowed' ] )->getMock(); $this->creditmemoManagerMock = $this->getMockBuilder(CreditmemoManagementInterface::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); $this->payment = $this->initPayment(); $helper = new ObjectManager($this); $helper->setBackwardCompatibleProperty($this->payment, 'orderStateResolver', $this->orderStateResolver); $this->payment->setMethod('any'); $this->payment->setOrder($this->order); $this->transactionId = self::TRANSACTION_ID; } /** * @inheritDoc */ protected function tearDown(): void { unset($this->payment); } /** * @return void */ public function testCancel(): void { $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); // check fix for partial refunds in Payflow Pro $this->paymentMethod->expects($this->once()) ->method('canVoid') ->willReturn(false); $this->assertEquals($this->payment, $this->payment->cancel()); } /** * @return void */ public function testPlace(): void { $newOrderStatus = 'new_status'; $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->any()) ->method('getConfigData') ->with('order_status', null) ->willReturn($newOrderStatus); $this->mockGetDefaultStatus(Order::STATE_NEW, $newOrderStatus, ['first', 'second']); $this->assertOrderUpdated(Order::STATE_NEW, $newOrderStatus); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(null); $this->mockPlaceEvents(); $this->assertEquals($this->payment, $this->payment->place()); } /** * @return void */ public function testPlaceActionOrder(): void { $newOrderStatus = 'new_status'; $customerNote = 'blabla'; $sum = 10; $this->payment->setTransactionId($this->transactionId); $this->order->expects($this->any())->method('getTotalDue')->willReturn($sum); $this->order->expects($this->any())->method('getBaseTotalDue')->willReturn($sum); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(AbstractMethod::ACTION_ORDER); $this->paymentMethod->expects($this->once())->method('isInitializeNeeded')->willReturn(false); $this->paymentMethod->expects($this->any()) ->method('getConfigData') ->with('order_status', null) ->willReturn($newOrderStatus); $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $newOrderStatus, ['first', 'second']); $this->order->expects($this->any()) ->method('setState') ->with(Order::STATE_PROCESSING) ->willReturnSelf(); $this->order->expects($this->any()) ->method('setStatus') ->with($newOrderStatus) ->willReturnSelf(); $this->paymentProcessor->expects($this->once()) ->method('order') ->with($this->payment, $sum) ->willReturnSelf(); $this->mockPlaceEvents(); $statusHistory = $this->getMockForAbstractClass( OrderStatusHistoryInterface::class ); $this->order->expects($this->any())->method('getCustomerNote')->willReturn($customerNote); $this->order->expects($this->any()) ->method('addStatusHistoryComment') ->withConsecutive( [$customerNote] ) ->willReturn($statusHistory); $this->order->expects($this->any()) ->method('setIsCustomerNotified') ->with(true) ->willReturn($statusHistory); $this->assertEquals($this->payment, $this->payment->place()); } /** * @return void */ protected function mockPlaceEvents(): void { $this->eventManagerMock ->method('dispatch') ->withConsecutive( ['sales_order_payment_place_start', ['payment' => $this->payment]], ['sales_order_payment_place_end', ['payment' => $this->payment]] ); } /** * @return void */ public function testPlaceActionAuthorizeInitializeNeeded(): void { $newOrderStatus = 'new_status'; $customerNote = 'blabla'; $sum = 10; $this->order->expects($this->any())->method('getBaseGrandTotal')->willReturn($sum); $this->order->expects($this->any())->method('getTotalDue')->willReturn($sum); $this->order->expects($this->any())->method('getBaseTotalDue')->willReturn($sum); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(AbstractMethod::ACTION_AUTHORIZE); $this->paymentMethod->expects($this->any()) ->method('getConfigData') ->withConsecutive( ['order_status'], ['payment_action'] )->willReturn($newOrderStatus); $this->paymentMethod->expects($this->once())->method('isInitializeNeeded')->willReturn(true); $this->paymentMethod->expects($this->once())->method('initialize'); $this->mockGetDefaultStatus(Order::STATE_NEW, $newOrderStatus, ['first', 'second']); $this->order->expects($this->any()) ->method('setState') ->with(Order::STATE_NEW) ->willReturnSelf(); $this->order->expects($this->any()) ->method('setStatus') ->with($newOrderStatus) ->willReturnSelf(); $this->mockPlaceEvents(); $statusHistory = $this->getMockForAbstractClass( OrderStatusHistoryInterface::class ); $this->order->expects($this->any())->method('getCustomerNote')->willReturn($customerNote); $this->order->expects($this->any()) ->method('addStatusHistoryComment') ->withConsecutive( [$customerNote], [__('Authorized amount of %1', $sum)] ) ->willReturn($statusHistory); $this->order->expects($this->any()) ->method('setIsCustomerNotified') ->with(true) ->willReturn($statusHistory); $this->assertEquals($this->payment, $this->payment->place()); } /** * @return void */ public function testPlaceActionAuthorizeFraud(): void { $newOrderStatus = 'new_status'; $customerNote = 'blabla'; $sum = 10; $this->order->expects($this->any())->method('getTotalDue')->willReturn($sum); $this->order->expects($this->any())->method('getBaseTotalDue')->willReturn($sum); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->payment->setTransactionId($this->transactionId); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(AbstractMethod::ACTION_AUTHORIZE); $this->paymentMethod->expects($this->any()) ->method('getConfigData') ->with('order_status', null) ->willReturn($newOrderStatus); $statusHistory = $this->getMockForAbstractClass( OrderStatusHistoryInterface::class ); $this->order->expects($this->any())->method('getCustomerNote')->willReturn($customerNote); $this->order->expects($this->any()) ->method('addStatusHistoryComment') ->with($customerNote) ->willReturn($statusHistory); $this->mockGetDefaultStatus(Order::STATE_PROCESSING, Order::STATUS_FRAUD, ['first', 'second']); $this->order->expects($this->any()) ->method('setState') ->with(Order::STATE_PROCESSING) ->willReturnSelf(); $this->order->expects($this->any()) ->method('setStatus') ->withConsecutive( [Order::STATUS_FRAUD] )->willReturnSelf(); $this->order->expects($this->atLeastOnce()) ->method('getStatus') ->willReturn(Order::STATUS_FRAUD); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(null); $this->assertEquals($this->payment, $this->payment->place()); //maybe we don't need write authorised sum when fraud was detected $this->assertEquals($sum, $this->payment->getAmountAuthorized()); } /** * @return void */ public function testPlaceActionAuthorizeCapture(): void { $newOrderStatus = 'new_status'; $customerNote = 'blabla'; $sum = 10; $this->order->expects($this->any())->method('getTotalDue')->willReturn($sum); $this->order->expects($this->any())->method('getBaseTotalDue')->willReturn($sum); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(AbstractMethod::ACTION_AUTHORIZE_CAPTURE); $this->paymentMethod->expects($this->any()) ->method('getConfigData') ->with('order_status', null) ->willReturn($newOrderStatus); $statusHistory = $this->getMockForAbstractClass( OrderStatusHistoryInterface::class ); $this->order->expects($this->any())->method('getCustomerNote')->willReturn($customerNote); $this->order->expects($this->any()) ->method('addStatusHistoryComment') ->with($customerNote) ->willReturn($statusHistory); $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $newOrderStatus, ['first', 'second']); $this->order->expects($this->any()) ->method('setState') ->with(Order::STATE_PROCESSING) ->willReturnSelf(); $this->order->expects($this->any()) ->method('setStatus') ->with($newOrderStatus) ->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(null); $this->assertEquals($this->payment, $this->payment->place()); $this->assertEquals($sum, $this->payment->getAmountAuthorized()); $this->assertEquals($sum, $this->payment->getBaseAmountAuthorized()); } /** * Tests place order flow with supported 'sale' payment operation. * * @return void */ public function testPlaceWithSaleOperationSupported(): void { $newOrderStatus = 'new_status'; $customerNote = 'blabla'; $sum = 10; $this->paymentMethod->method('canSale') ->willReturn(true); $this->order->method('getTotalDue') ->willReturn($sum); $this->order->method('getBaseTotalDue') ->willReturn($sum); $this->helper->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->method('getConfigPaymentAction') ->willReturn(AbstractMethod::ACTION_AUTHORIZE_CAPTURE); $this->paymentMethod->method('getConfigData') ->with('order_status', null) ->willReturn($newOrderStatus); $statusHistory = $this->getMockForAbstractClass(OrderStatusHistoryInterface::class); $this->order->method('getCustomerNote') ->willReturn($customerNote); $this->order->method('addStatusHistoryComment') ->with($customerNote) ->willReturn($statusHistory); $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $newOrderStatus, ['first', 'second']); $this->order->method('setState') ->with(Order::STATE_PROCESSING) ->willReturnSelf(); $this->order->method('setStatus') ->with($newOrderStatus) ->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('getConfigPaymentAction') ->willReturn(null); $this->saleOperation->expects($this->once()) ->method('execute'); $this->assertEquals($this->payment, $this->payment->place()); $this->assertEquals($sum, $this->payment->getAmountAuthorized()); $this->assertEquals($sum, $this->payment->getBaseAmountAuthorized()); } /** * @param bool $isOnline * @param float $amount * * @return void * @dataProvider authorizeDataProvider */ public function testAuthorize(bool $isOnline, float $amount): void { $this->paymentProcessor->expects($this->once()) ->method('authorize') ->with($this->payment, $isOnline, $amount) ->willReturn($this->payment); $this->assertEquals($this->payment, $this->payment->authorize($isOnline, $amount)); } /** * Data rpovider for testAuthorize * * @return array */ public function authorizeDataProvider(): array { return [ [false, 9.99], [true, 0.01] ]; } /** * @return void */ public function testAcceptApprovePaymentTrue(): void { $baseGrandTotal = 300.00; $message = sprintf('Approved the payment online. Transaction ID: "%s"', $this->transactionId); $acceptPayment = true; $this->payment->setLastTransId($this->transactionId); $this->mockInvoice($this->transactionId, 2); $this->invoice->setBaseGrandTotal($baseGrandTotal); $this->mockResultTrueMethods($this->transactionId, $baseGrandTotal, $message); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('acceptPayment') ->with($this->payment) ->willReturn($acceptPayment); $this->payment->accept(); self::assertEquals($baseGrandTotal, $this->payment->getBaseAmountPaidOnline()); } /** * @return array */ public function acceptPaymentFalseProvider(): array { return [ 'Fraud = 1' => [ true, Order::STATUS_FRAUD ], 'Fraud = 0' => [ false, false ], ]; } /** * @param bool $isFraudDetected * @param mixed $status * * @return void * @dataProvider acceptPaymentFalseProvider */ public function testAcceptApprovePaymentFalse(bool $isFraudDetected, $status): void { $message = sprintf('There is no need to approve this payment. Transaction ID: "%s"', $this->transactionId); $acceptPayment = false; $orderState = 'random_state'; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_fraud_detected', $isFraudDetected); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->assertOrderUpdated(Order::STATE_PAYMENT_REVIEW, $status, $message); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('acceptPayment') ->with($this->payment) ->willReturn($acceptPayment); $this->payment->accept(); $this->assertEquals($this->transactionId, $this->payment->getLastTransId()); } /** * @param bool $isFraudDetected * * @return void * @dataProvider acceptPaymentFalseProvider */ public function testAcceptApprovePaymentFalseOrderState(bool $isFraudDetected): void { $message = sprintf('There is no need to approve this payment. Transaction ID: "%s"', $this->transactionId); $acceptPayment = false; $orderState = Order::STATE_PAYMENT_REVIEW; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_fraud_detected', $isFraudDetected); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->order->expects($this->never()) ->method('setState'); $this->order->expects($this->once()) ->method('addStatusHistoryComment') ->with($message); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('acceptPayment') ->with($this->payment) ->willReturn($acceptPayment); $this->payment->accept(); $this->assertEquals($this->transactionId, $this->payment->getLastTransId()); } /** * @return void */ public function testDenyPaymentFalse(): void { $denyPayment = true; $message = sprintf('Denied the payment online Transaction ID: "%s"', $this->transactionId); $this->payment->setLastTransId($this->transactionId); $this->mockInvoice($this->transactionId); $this->mockResultFalseMethods($message); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('denyPayment') ->with($this->payment) ->willReturn($denyPayment); $this->payment->deny(); } /** * Test offline IPN calls * * @return void */ public function testDenyPaymentIpn(): void { $isOnline = false; $message = sprintf('Denied the payment online Transaction ID: "%s"', $this->transactionId); $this->payment->setTransactionId($this->transactionId); $this->payment->setNotificationResult(true); $this->mockInvoice($this->transactionId); $this->mockResultFalseMethods($message); $this->helper->expects($this->never()) ->method('getMethodInstance'); $this->payment->deny($isOnline); } /** * @param bool $isFraudDetected * @param mixed $status * * @return void * @dataProvider acceptPaymentFalseProvider */ public function testDenyPaymentNegative(bool $isFraudDetected, $status): void { $denyPayment = false; $message = sprintf('There is no need to deny this payment. Transaction ID: "%s"', $this->transactionId); $orderState = 'random_state'; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_fraud_detected', $isFraudDetected); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->assertOrderUpdated(Order::STATE_PAYMENT_REVIEW, $status, $message); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('denyPayment') ->with($this->payment) ->willReturn($denyPayment); $this->payment->deny(); } /** * @return void */ public function testDenyPaymentNegativeStateReview(): void { $denyPayment = false; $message = sprintf('There is no need to deny this payment. Transaction ID: "%s"', $this->transactionId); $orderState = Order::STATE_PAYMENT_REVIEW; $this->payment->setLastTransId($this->transactionId); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->order->expects($this->never()) ->method('setState'); $this->order->expects($this->once()) ->method('addStatusHistoryComment') ->with($message); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('denyPayment') ->with($this->payment) ->willReturn($denyPayment); $this->payment->deny(); } /** * Test offline IPN call, negative * * @return void */ public function testDenyPaymentIpnNegativeStateReview(): void { $isOnline = false; $message = sprintf('Registered notification about denied payment. Transaction ID: "%s"', $this->transactionId); $orderState = Order::STATE_PAYMENT_REVIEW; $this->payment->setTransactionId($this->transactionId); $this->payment->setNotificationResult(false); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->order->expects($this->never()) ->method('setState'); $this->order->expects($this->once()) ->method('addStatusHistoryComment') ->with($message); $this->helper->expects($this->never()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->never()) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->never()) ->method('denyPayment') ->with($this->payment); $this->payment->deny($isOnline); } /** * @param string|null $transactionId * @param int $countCall * * @return void */ private function mockInvoice(?string $transactionId, int $countCall = 1): void { $this->invoice->method('getTransactionId') ->willReturn($transactionId); $this->invoice->method('load') ->with($transactionId); $this->invoice->method('getId') ->willReturn($transactionId); $this->order->expects(self::exactly($countCall)) ->method('getInvoiceCollection') ->willReturn([$this->invoice]); } /** * @return void */ public function testUpdateOnlineTransactionApproved(): void { $message = sprintf('Registered update about approved payment. Transaction ID: "%s"', $this->transactionId); $storeId = 50; $baseGrandTotal = 299.99; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_transaction_approved', true); $this->mockInvoice($this->transactionId, 2); $this->invoice->setBaseGrandTotal($baseGrandTotal); $this->mockResultTrueMethods($this->transactionId, $baseGrandTotal, $message); $this->order->expects($this->exactly(2)) ->method('getStoreId') ->willReturn($storeId); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore') ->with($storeId) ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('fetchTransactionInfo') ->with($this->payment, $this->transactionId); $this->payment->update(); $this->assertEquals($baseGrandTotal, $this->payment->getBaseAmountPaidOnline()); } /** * Test update calls from IPN controller * * @return void */ public function testUpdateOnlineTransactionApprovedIpn(): void { $isOnline = false; $message = sprintf('Registered update about approved payment. Transaction ID: "%s"', $this->transactionId); $baseGrandTotal = 299.99; $this->payment->setTransactionId($this->transactionId); $this->payment->setData('is_transaction_approved', true); $this->mockInvoice($this->transactionId, 2); $this->invoice->setBaseGrandTotal($baseGrandTotal); $this->mockResultTrueMethods($this->transactionId, $baseGrandTotal, $message); $this->order->expects(self::never()) ->method('getStoreId'); $this->helper->expects(self::never()) ->method('getMethodInstance'); $this->paymentMethod->expects(self::never()) ->method('setStore'); $this->paymentMethod->expects(self::never()) ->method('fetchTransactionInfo'); $this->payment->update($isOnline); $this->assertEquals($baseGrandTotal, $this->payment->getBaseAmountPaidOnline()); } /** * @return void */ public function testUpdateOnlineTransactionDenied(): void { $message = sprintf('Registered update about denied payment. Transaction ID: "%s"', $this->transactionId); $storeId = 50; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_transaction_denied', true); $this->mockInvoice($this->transactionId); $this->mockResultFalseMethods($message); $this->order->expects($this->exactly(2)) ->method('getStoreId') ->willReturn($storeId); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore') ->with($storeId) ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('fetchTransactionInfo') ->with($this->payment, $this->transactionId); $this->payment->update(); } /** * @param bool $isFraudDetected * @param mixed $status * * @return void * @dataProvider acceptPaymentFalseProvider */ public function testUpdateOnlineTransactionDeniedFalse(bool $isFraudDetected, $status): void { $message = sprintf('There is no update for the payment. Transaction ID: "%s"', $this->transactionId); $storeId = 50; $orderState = 'random_state'; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_transaction_denied', false); $this->payment->setData('is_transaction_approved', false); $this->payment->setData('is_fraud_detected', $isFraudDetected); $this->mockInvoice($this->transactionId); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->assertOrderUpdated(Order::STATE_PAYMENT_REVIEW, $status, $message); $this->order->expects($this->exactly(2)) ->method('getStoreId') ->willReturn($storeId); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore') ->with($storeId) ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('fetchTransactionInfo') ->with($this->payment, $this->transactionId); $this->payment->update(); $this->assertEquals($this->transactionId, $this->payment->getLastTransId()); } /** * @return void */ public function testUpdateOnlineTransactionDeniedFalseHistoryComment(): void { $message = sprintf('There is no update for the payment. Transaction ID: "%s"', $this->transactionId); $storeId = 50; $orderState = Order::STATE_PAYMENT_REVIEW; $this->payment->setLastTransId($this->transactionId); $this->payment->setData('is_transaction_denied', false); $this->payment->setData('is_transaction_approved', false); $this->mockInvoice($this->transactionId); $this->order->expects($this->once()) ->method('getState') ->willReturn($orderState); $this->order->expects($this->never()) ->method('setState'); $this->order->expects($this->once()) ->method('addStatusHistoryComment') ->with($message); $this->order->expects($this->exactly(2)) ->method('getStoreId') ->willReturn($storeId); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore') ->with($storeId) ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->once()) ->method('fetchTransactionInfo') ->with($this->payment, $this->transactionId); $this->payment->update(); $this->assertEquals($this->transactionId, $this->payment->getLastTransId()); } /** * @param string $transactionId * @param float $baseGrandTotal * @param string $message * * @return void */ protected function mockResultTrueMethods( string $transactionId, float $baseGrandTotal, string $message ): void { $status = 'status'; $this->invoice->expects($this->once()) ->method('pay') ->willReturn($transactionId); $this->invoice->method('getBaseGrandTotal') ->willReturn($baseGrandTotal); //acceptPayment = true $this->order->expects($this->once()) ->method('addRelatedObject') ->with($this->invoice); $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $status); $this->assertOrderUpdated(Order::STATE_PROCESSING, $status, $message); } /** * @param string $message * * @return void */ protected function mockResultFalseMethods(string $message): void { $this->invoice->expects($this->once()) ->method('cancel'); $this->order->expects($this->once()) ->method('addRelatedObject') ->with($this->invoice); $this->order->expects($this->once()) ->method('registerCancellation') ->with($message, false); } /** * @return void */ public function testAcceptWithoutInvoiceResultTrue(): void { $baseGrandTotal = null; $acceptPayment = true; $this->payment->setData('transaction_id', $this->transactionId); $this->invoice->expects($this->never()) ->method('pay'); $this->order->expects($this->any()) ->method('getInvoiceCollection') ->willReturn([]); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('acceptPayment') ->with($this->payment) ->willReturn($acceptPayment); $status = 'status'; $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $status); $this->assertOrderUpdated(Order::STATE_PROCESSING, $status, __('Approved the payment online.')); $this->payment->accept(); $this->assertEquals($baseGrandTotal, $this->payment->getBaseAmountPaidOnline()); } /** * @return void */ public function testDenyWithoutInvoiceResultFalse(): void { $baseGrandTotal = null; $denyPayment = true; $this->payment->setData('transaction_id', $this->transactionId); $this->invoice->expects($this->never()) ->method('cancel'); $this->order->expects($this->any()) ->method('getInvoiceCollection') ->willReturn([]); $this->helper->expects($this->once()) ->method('getMethodInstance') ->willReturn($this->paymentMethod); $this->paymentMethod->expects($this->exactly(2)) ->method('setStore')->willReturnSelf(); $this->paymentMethod->expects($this->once()) ->method('denyPayment') ->with($this->payment) ->willReturn($denyPayment); $status = 'status'; $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $status); $this->assertOrderUpdated(Order::STATE_PROCESSING, $status, __('Denied the payment online')); $this->payment->deny(); $this->assertEquals($baseGrandTotal, $this->payment->getBaseAmountPaidOnline()); } /** * @return void */ public function testCanCaptureNoAuthorizationTransaction(): void { $this->paymentMethod->expects($this->once()) ->method('canCapture') ->willReturn(true); $this->assertTrue($this->payment->canCapture()); } /** * @return void */ public function testCanCaptureCreateTransaction(): void { $this->paymentMethod->expects($this->once()) ->method('canCapture') ->willReturn(true); $parentTransactionId = 1; $paymentId = 22; $this->payment->setId($paymentId); $this->payment->setParentTransactionId($parentTransactionId); $transaction = $this->createMock(Transaction::class); $transaction->expects($this->once()) ->method('getIsClosed') ->willReturn(false); $this->transactionManagerMock->expects($this->once()) ->method('getAuthorizationTransaction') ->with($parentTransactionId, $paymentId) ->willReturn($transaction); $this->assertTrue($this->payment->canCapture()); } /** * @return void */ public function testCanCaptureAuthorizationTransaction(): void { $paymentId = 1; $parentTransactionId = 1; $this->payment->setParentTransactionId($parentTransactionId); $this->payment->setId($paymentId); $this->paymentMethod->expects($this->once()) ->method('canCapture') ->willReturn(true); $transaction = $this->createMock(Transaction::class); $this->transactionManagerMock->expects($this->once()) ->method('getAuthorizationTransaction') ->with($parentTransactionId, $paymentId) ->willReturn($transaction); $transaction->expects($this->once())->method('getIsClosed')->willReturn(true); $this->transactionRepositoryMock->expects($this->once()) ->method('getByTransactionType') ->with(Transaction::TYPE_ORDER, $paymentId) ->willReturn($transaction); $this->assertTrue($this->payment->canCapture()); } /** * @return void */ public function testCannotCapture(): void { $this->paymentMethod->expects($this->once())->method('canCapture')->willReturn(false); $this->assertFalse($this->payment->canCapture()); } /** * Tests pay method and perform assertions for payment amount * * @return void */ public function testPay(): void { $amountPaid = 10; $shippingCaptured = 5; self::assertNull($this->payment->getAmountPaid()); $this->mockInvoice(null); $this->invoice->setGrandTotal($amountPaid); $this->invoice->setBaseGrandTotal($amountPaid); $this->invoice->setShippingAmount($shippingCaptured); $this->invoice->setBaseShippingAmount($shippingCaptured); self::assertSame($this->payment, $this->payment->pay($this->invoice)); self::assertEquals($amountPaid, $this->payment->getAmountPaid()); self::assertEquals($amountPaid, $this->payment->getBaseAmountPaid()); self::assertEquals($shippingCaptured, $this->payment->getShippingCaptured()); self::assertEquals($shippingCaptured, $this->payment->getBaseShippingCaptured()); } /** * Checks if total paid amount correctly calculated for multiple order invoices. * * @return void */ public function testPayWithMultipleInvoices(): void { $this->invoice->setGrandTotal(5); $this->invoice->setShippingAmount(5); /** @var Invoice|MockObject $invoice */ $invoice = $this->getMockBuilder(Invoice::class) ->disableOriginalConstructor() ->onlyMethods(['getGrandTotal']) ->getMock(); $invoice->setGrandTotal(5); $this->order->method('getInvoiceCollection') ->willReturn([$this->invoice, $invoice]); $this->payment->pay($this->invoice); self::assertEquals(10, $this->payment->getAmountPaid()); self::assertEquals(5, $this->payment->getShippingCaptured()); } /** * @return void */ public function testGetOrder(): void { $payment = $this->initPayment(); $this->orderRepository->expects($this->once())->method('get')->willReturn($this->order); $payment->setParentId(1211); $this->assertSame($this->order, $payment->getOrder()); } /** * @return void */ public function testGetOrderDefault(): void { $this->orderRepository->expects($this->never())->method('get'); $this->assertSame($this->order, $this->payment->getOrder()); } /** * @return void */ public function testGetOrderNull(): void { $payment = $this->initPayment(); $this->orderRepository->expects($this->never())->method('get'); $this->assertNull($payment->getOrder()); } /** * @return void */ public function testCancelInvoice(): void { $expects = [ 'amount_paid' => 10, 'base_amount_paid' => 10, 'shipping_captured' => 5, 'base_shipping_captured' => 5 ]; $this->assertNull($this->payment->getData('amount_paid')); $this->invoice->expects($this->once())->method('getGrandTotal')->willReturn($expects['amount_paid']); $this->invoice->expects($this->once())->method('getBaseGrandTotal')->willReturn( $expects['base_amount_paid'] ); $this->invoice->expects($this->once())->method('getShippingAmount')->willReturn( $expects['shipping_captured'] ); $this->invoice->expects($this->once())->method('getBaseShippingAmount')->willReturn( $expects['base_shipping_captured'] ); $this->eventManagerMock->expects($this->once())->method('dispatch')->with( 'sales_order_payment_cancel_invoice', ['payment' => $this->payment, 'invoice' => $this->invoice] ); $this->assertSame($this->payment, $this->payment->cancelInvoice($this->invoice)); $this->assertEquals(-1 * $expects['amount_paid'], $this->payment->getData('amount_paid')); $this->assertEquals(-1 * $expects['base_amount_paid'], $this->payment->getData('base_amount_paid')); $this->assertEquals(-1 * $expects['shipping_captured'], $this->payment->getData('shipping_captured')); $this->assertEquals( -1 * $expects['base_shipping_captured'], $this->payment->getData('base_shipping_captured') ); } /** * @return void */ public function testRegisterRefundNotificationTransactionExists(): void { $amount = 10; $paymentId = 1; $orderId = 9; $this->payment->setParentTransactionId($this->transactionId); $this->payment->setId($paymentId); $this->order->setId($orderId); $transaction = $this->createMock(\Magento\Sales\Model\ResourceModel\Order\Payment\Transaction::class); $newTransactionId = $this->transactionId . '-' . Transaction::TYPE_REFUND; $this->transactionRepositoryMock->expects($this->once()) ->method('getByTransactionId') ->with($this->transactionId) ->willReturn($transaction); $this->transactionManagerMock->expects($this->once()) ->method('isTransactionExists') ->with($newTransactionId, $paymentId, $orderId) ->willReturn(true); $this->transactionManagerMock->expects($this->once()) ->method('generateTransactionId') ->with($this->payment, Transaction::TYPE_REFUND, $transaction) ->willReturn($newTransactionId); $this->assertSame($this->payment, $this->payment->registerRefundNotification($amount)); } /** * @return void * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testRegisterRefundNotification(): void { $message = 'Registered notification about refunded amount of . Transaction ID: "' . self::TRANSACTION_ID . '-refund"'; $amount = 50; $grandTotalCreditMemo = 50; $invoiceBaseGrandTotal = 50; $invoiceBaseTotalRefunded = 0; $this->invoice->expects($this->any())->method('getBaseGrandTotal')->willReturn($invoiceBaseGrandTotal); $this->invoice->expects($this->any())->method('getBaseTotalRefunded')->willReturn( $invoiceBaseTotalRefunded ); $this->creditMemoMock->expects($this->any())->method('getGrandTotal')->willReturn($grandTotalCreditMemo); $this->payment->setParentTransactionId($this->transactionId); $this->mockInvoice($this->transactionId, 1); $this->creditmemoFactoryMock->expects($this->once()) ->method('createByInvoice') ->with($this->invoice, ['adjustment_negative' => $invoiceBaseGrandTotal - $amount]) ->willReturn($this->creditMemoMock); $this->creditMemoMock->expects($this->once())->method('setPaymentRefundDisallowed')->willReturnSelf(); $this->creditMemoMock->expects($this->once())->method('setAutomaticallyCreated')->willReturnSelf(); $this->creditMemoMock->expects($this->once())->method('addComment')->willReturnSelf(); $this->creditmemoManagerMock->expects($this->once()) ->method('refund') ->with($this->creditMemoMock, false) ->willReturn($this->creditMemoMock); $this->order->expects($this->once())->method('getBaseCurrency')->willReturn($this->currencyMock); $parentTransaction = $this->getMockBuilder(Transaction::class) ->addMethods(['loadByTxnId']) ->onlyMethods(['setOrderId', 'setPaymentId', 'getId', 'getTxnId', 'setTxnId', 'getTxnType']) ->disableOriginalConstructor() ->getMock(); $newTransactionId = $this->transactionId . '-' . Transaction::TYPE_REFUND; $this->transactionRepositoryMock->expects($this->once()) ->method('getByTransactionId') ->with($this->transactionId) ->willReturn($parentTransaction); $this->transactionManagerMock->expects($this->once()) ->method('isTransactionExists') ->with($newTransactionId) ->willReturn(false); $this->transactionManagerMock->expects($this->once()) ->method('generateTransactionId') ->with($this->payment, Transaction::TYPE_REFUND, $parentTransaction) ->willReturn($newTransactionId); $status = 'status'; $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $status); $this->assertOrderUpdated(Order::STATE_PROCESSING, $status, $message); $additionalInformation = []; $failSafe = false; $transactionType = Transaction::TYPE_REFUND; $this->getTransactionBuilderMock( $additionalInformation, $failSafe, $transactionType, $this->transactionId . '-' . Transaction::TYPE_REFUND ); $this->assertSame($this->payment, $this->payment->registerRefundNotification($amount)); $this->assertSame($this->creditMemoMock, $this->payment->getData('created_creditmemo')); $this->assertEquals($grandTotalCreditMemo, $this->payment->getData('amount_refunded')); } /** * @return void */ public function testRegisterRefundNotificationWrongAmount(): void { $amount = 30; $grandTotalCreditMemo = 50; $invoiceBaseGrandTotal = 50; $invoiceBaseTotalRefunded = 0; $this->invoice->expects($this->any())->method('getBaseGrandTotal')->willReturn($invoiceBaseGrandTotal); $this->invoice->expects($this->any())->method('getBaseTotalRefunded')->willReturn( $invoiceBaseTotalRefunded ); $this->creditMemoMock->expects($this->any())->method('getGrandTotal')->willReturn($grandTotalCreditMemo); $this->payment->setParentTransactionId($this->transactionId); $this->mockInvoice($this->transactionId, 1); $this->order->expects($this->once())->method('getBaseCurrency')->willReturn($this->currencyMock); $parentTransaction = $this->getMockBuilder(Transaction::class) ->addMethods(['loadByTxnId']) ->onlyMethods(['setOrderId', 'setPaymentId', 'getId', 'getTxnId', 'getTxnType']) ->disableOriginalConstructor() ->getMock(); //generate new transaction and check if not exists $this->transactionRepositoryMock->expects($this->once()) ->method('getByTransactionId') ->with($this->transactionId) ->willReturn($parentTransaction); $newTransactionId = $this->transactionId . '-refund'; $this->transactionManagerMock->expects($this->once()) ->method('isTransactionExists') ->with($newTransactionId) ->willReturn(false); $this->transactionManagerMock->expects($this->once()) ->method('generateTransactionId') ->with($this->payment, Transaction::TYPE_REFUND, $parentTransaction) ->willReturn($newTransactionId); $this->assertSame($this->payment, $this->payment->registerRefundNotification($amount)); } /** * @return void * @dataProvider boolProvider */ public function testCanRefund($canRefund): void { $this->paymentMethod->expects($this->once()) ->method('canRefund') ->willReturn($canRefund); $this->assertEquals($canRefund, $this->payment->canRefund()); } /** * @return void */ public function testRefund(): void { $amount = 204.04; $this->creditMemoMock->expects(static::once()) ->method('getBaseGrandTotal') ->willReturn($amount); $this->creditMemoMock->expects(static::once()) ->method('getGrandTotal') ->willReturn($amount); $this->creditMemoMock->expects(static::once()) ->method('getDoTransaction') ->willReturn(true); $this->paymentMethod->expects(static::once()) ->method('canRefund') ->willReturn(true); $this->mockInvoice(self::TRANSACTION_ID, 0); $this->creditMemoMock->expects(static::once()) ->method('getInvoice') ->willReturn($this->invoice); $this->creditMemoMock->expects(static::once()) ->method('getOrder') ->willReturn($this->order); $captureTranId = self::TRANSACTION_ID . '-' . Transaction::TYPE_CAPTURE; $captureTransaction = $this->getMockBuilder(Transaction::class) ->disableOriginalConstructor() ->onlyMethods(['getTxnId']) ->getMock(); $refundTranId = $captureTranId . '-' . Transaction::TYPE_REFUND; $this->transactionManagerMock->expects(static::once()) ->method('generateTransactionId') ->willReturn($refundTranId); $captureTransaction->expects(static::once()) ->method('getTxnId') ->willReturn($captureTranId); $this->transactionRepositoryMock->expects(static::once()) ->method('getByTransactionId') ->willReturn($captureTransaction); $this->paymentMethod->expects(static::once()) ->method('refund') ->with($this->payment, $amount); $isOnline = true; $this->getTransactionBuilderMock([], $isOnline, Transaction::TYPE_REFUND, $refundTranId); $this->currencyMock->expects(static::once()) ->method('formatTxt') ->willReturn($amount); $this->order->expects(static::once()) ->method('getBaseCurrency') ->willReturn($this->currencyMock); $status = 'status'; $message = 'We refunded ' . $amount . ' online. Transaction ID: "' . $refundTranId . '"'; $this->orderStateResolver->expects($this->once())->method('getStateForOrder') ->with($this->order) ->willReturn(Order::STATE_CLOSED); $this->mockGetDefaultStatus(Order::STATE_CLOSED, $status, ['first, second']); $this->assertOrderUpdated(Order::STATE_PROCESSING, $status, $message); static::assertSame($this->payment, $this->payment->refund($this->creditMemoMock)); static::assertEquals($amount, $this->payment->getData('amount_refunded')); static::assertEquals($amount, $this->payment->getData('base_amount_refunded_online')); static::assertEquals($amount, $this->payment->getData('base_amount_refunded')); } /** * @return array */ public function boolProvider(): array { return [ [true], [false] ]; } /** * @covers \Magento\Sales\Model\Order\Payment::isCaptureFinal() * @return void */ public function testIsCaptureFinal(): void { $amount = 23.02; $partialAmount = 12.00; $this->order->expects(static::exactly(2)) ->method('getBaseTotalDue') ->willReturn($amount); static::assertFalse($this->payment->isCaptureFinal($partialAmount)); static::assertTrue($this->payment->isCaptureFinal($amount)); } /** * @covers \Magento\Sales\Model\Order\Payment::getShouldCloseParentTransaction() * @return void */ public function testGetShouldCloseParentTransaction(): void { $this->payment->setShouldCloseParentTransaction(1); static::assertTrue($this->payment->getShouldCloseParentTransaction()); $this->payment->setShouldCloseParentTransaction(0); static::assertFalse($this->payment->getShouldCloseParentTransaction()); } /** * @return object */ protected function initPayment(): object { return (new ObjectManager($this))->getObject( Payment::class, [ 'context' => $this->context, 'creditmemoFactory' => $this->creditmemoFactoryMock, 'paymentData' => $this->helper, 'priceCurrency' => $this->priceCurrencyMock, 'transactionRepository' => $this->transactionRepositoryMock, 'transactionManager' => $this->transactionManagerMock, 'transactionBuilder' => $this->transactionBuilderMock, 'paymentProcessor' => $this->paymentProcessor, 'orderRepository' => $this->orderRepository, 'creditmemoManager' => $this->creditmemoManagerMock, 'saleOperation' => $this->saleOperation ] ); } /** * @param string $state * @param mixed $status * @param mixed $message * @param bool|null $isCustomerNotified */ protected function assertOrderUpdated( string $state, $status = null, $message = null, bool $isCustomerNotified = null ): void { $this->order->expects($this->any()) ->method('setState') ->with($state) ->willReturnSelf(); $this->order->expects($this->any()) ->method('setStatus') ->with($status) ->willReturnSelf(); $statusHistory = $this->getMockForAbstractClass( OrderStatusHistoryInterface::class ); $this->order->expects($this->any()) ->method('addStatusHistoryComment') ->with($message) ->willReturn($statusHistory); $this->order->expects($this->any()) ->method('setIsCustomerNotified') ->with($isCustomerNotified) ->willReturn($statusHistory); } /** * @param string $state * @param mixed $status * @param array $allStatuses */ protected function mockGetDefaultStatus(string $state, $status, array $allStatuses = []): void { /** @var Config|MockObject $orderConfigMock */ $orderConfigMock = $this->getMockBuilder(Config::class) ->disableOriginalConstructor() ->onlyMethods(['getStateStatuses', 'getStateDefaultStatus']) ->getMock(); if (!empty($allStatuses)) { $orderConfigMock->expects($this->any()) ->method('getStateStatuses') ->with($state) ->willReturn($allStatuses); } $orderConfigMock->expects($this->any()) ->method('getStateDefaultStatus') ->with($state) ->willReturn($status); $this->order->expects($this->any()) ->method('getConfig') ->willReturn($orderConfigMock); } /** * @param string $transactionId * @return MockObject */ protected function getTransactionMock(string $transactionId): MockObject { $transaction = $this->getMockBuilder(Transaction::class) ->addMethods(['loadByTxnId']) ->onlyMethods( [ 'getId', 'setOrderId', 'setPaymentId', 'setTxnId', 'getTransactionId', 'setTxnType', 'isFailsafe', 'getTxnId', 'getHtmlTxnId', 'getTxnType' ] ) ->disableOriginalConstructor() ->getMock(); $transaction->expects($this->any())->method('getId')->willReturn($transactionId); $transaction->expects($this->any())->method('getTxnId')->willReturn($transactionId); $transaction->expects($this->any())->method('getHtmlTxnId')->willReturn($transactionId); return $transaction; } /** * @param array $additionalInformation * @param bool $failSafe * @param mixed $transactionType * @param mixed $transactionId * * @return void */ protected function getTransactionBuilderMock( array $additionalInformation, bool $failSafe, $transactionType, $transactionId = false ): void { if (!$transactionId) { $transactionId = $this->transactionId; } $this->transactionBuilderMock->expects($this->once()) ->method('setPayment') ->with($this->payment) ->willReturnSelf(); $this->transactionBuilderMock->expects($this->once()) ->method('setOrder') ->with($this->order) ->willReturnSelf(); $this->transactionBuilderMock->expects($this->once()) ->method('setTransactionId') ->with($transactionId) ->willReturnSelf(); $this->transactionBuilderMock->expects($this->once()) ->method('setAdditionalInformation') ->with($additionalInformation) ->willReturnSelf(); $this->transactionBuilderMock->expects($this->once()) ->method('setFailSafe') ->with($failSafe) ->willReturnSelf(); $transaction = $this->getTransactionMock($transactionId); $this->transactionBuilderMock->expects($this->once()) ->method('build') ->with($transactionType) ->willReturn($transaction); } }