diff --git a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php index 7fa674505461e..49212202b5f62 100644 --- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php +++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php @@ -1262,7 +1262,7 @@ private function searchQuoteAddressId(OrderInterface $order, array $addresses): } } - throw new NotFoundException(__('Quote address for failed order not found.')); + throw new NotFoundException(__('Quote address for failed order ID "%1" not found.', $order->getEntityId())); } /** diff --git a/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php b/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php index fba3245bec68d..747d88353f022 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php @@ -3,34 +3,40 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Multishipping\Test\Unit\Model\Checkout\Type; +use Magento\Catalog\Model\Product\Type; +use Magento\Catalog\Model\Product\Type\Simple; use Magento\Checkout\Model\Session; use Magento\Customer\Api\AddressRepositoryInterface; use Magento\Customer\Api\Data\AddressInterface; use Magento\Customer\Api\Data\AddressSearchResultsInterface; use Magento\Customer\Api\Data\CustomerInterface; -use Magento\Directory\Model\Currency; -use Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderDefault; -use Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderFactory; -use Magento\Quote\Model\Quote\Address; use Magento\Customer\Model\Session as CustomerSession; +use Magento\Directory\Model\AllowedCountries; +use Magento\Directory\Model\Currency; use Magento\Framework\Api\FilterBuilder; use Magento\Framework\Api\SearchCriteria; use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\Event\ManagerInterface; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Pricing\PriceCurrencyInterface; use Magento\Framework\Session\Generic; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Multishipping\Helper\Data; use Magento\Multishipping\Model\Checkout\Type\Multishipping; +use Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderDefault; +use Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderFactory; +use Magento\Payment\Model\Method\AbstractMethod; use Magento\Payment\Model\Method\SpecificationInterface; use Magento\Quote\Api\CartRepositoryInterface; use Magento\Quote\Api\Data\CartExtension; use Magento\Quote\Api\Data\CartExtensionFactory; use Magento\Quote\Model\Quote; +use Magento\Quote\Model\Quote\Address; use Magento\Quote\Model\Quote\Address as QuoteAddress; use Magento\Quote\Model\Quote\Address\Item as AddressItem; use Magento\Quote\Model\Quote\Address\ToOrder; @@ -38,22 +44,24 @@ use Magento\Quote\Model\Quote\AddressFactory; use Magento\Quote\Model\Quote\Item; use Magento\Quote\Model\Quote\Item\ToOrderItem; +use Magento\Quote\Model\Quote\Payment; use Magento\Quote\Model\Quote\Payment\ToOrderPayment; use Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentProcessor; use Magento\Quote\Model\Quote\TotalsCollector; use Magento\Quote\Model\Shipping; use Magento\Quote\Model\ShippingAssignment; +use Magento\Sales\Api\Data\OrderAddressInterface; +use Magento\Sales\Api\Data\OrderInterface; +use Magento\Sales\Api\Data\OrderPaymentInterface; use Magento\Sales\Model\Order\Email\Sender\OrderSender; use Magento\Sales\Model\OrderFactory; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; -use PHPUnit_Framework_MockObject_MockObject; -use \PHPUnit\Framework\TestCase; -use Magento\Quote\Model\Quote\Payment; -use Magento\Payment\Model\Method\AbstractMethod; -use Magento\Directory\Model\AllowedCountries; +use PHPUnit_Framework_MockObject_MockObject as MockObject; /** + * Test class Multishipping + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyFields) */ @@ -65,115 +73,118 @@ class MultishippingTest extends \PHPUnit\Framework\TestCase protected $model; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $checkoutSessionMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $customerSessionMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $customerMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $quoteMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $helperMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $filterBuilderMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $addressRepositoryMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $searchCriteriaBuilderMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ protected $totalsCollectorMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ private $cartExtensionFactoryMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ private $shippingAssignmentProcessorMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ private $quoteRepositoryMock; /** - * @var OrderFactory|PHPUnit_Framework_MockObject_MockObject + * @var OrderFactory|MockObject */ private $orderFactoryMock; /** - * @var \Magento\Framework\Api\DataObjectHelper|PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Api\DataObjectHelper|MockObject */ private $dataObjectHelperMock; /** - * @var ToOrder|PHPUnit_Framework_MockObject_MockObject + * @var ToOrder|MockObject */ private $toOrderMock; /** - * @var ToOrderAddress|PHPUnit_Framework_MockObject_MockObject + * @var ToOrderAddress|MockObject */ private $toOrderAddressMock; /** - * @var ToOrderPayment|PHPUnit_Framework_MockObject_MockObject + * @var ToOrderPayment|MockObject */ private $toOrderPaymentMock; /** - * @var PriceCurrencyInterface|PHPUnit_Framework_MockObject_MockObject + * @var PriceCurrencyInterface|MockObject */ private $priceMock; /** - * @var ToOrderItem|PHPUnit_Framework_MockObject_MockObject + * @var ToOrderItem|MockObject */ private $toOrderItemMock; /** - * @var PlaceOrderFactory|PHPUnit_Framework_MockObject_MockObject + * @var PlaceOrderFactory|MockObject */ private $placeOrderFactoryMock; /** - * @var Generic|PHPUnit_Framework_MockObject_MockObject + * @var Generic|MockObject */ private $sessionMock; /** - * @var PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ private $scopeConfigMock; + /** + * @inheritDoc + */ protected function setUp() { $this->checkoutSessionMock = $this->createSimpleMock(Session::class); @@ -265,7 +276,13 @@ protected function setUp() ); } - public function testSetShippingItemsInformation() + /** + * Verify set shipping items information. + * + * @return void + * @throws LocalizedException + */ + public function testSetShippingItemsInformation(): void { $info = [ [ @@ -313,10 +330,12 @@ public function testSetShippingItemsInformation() } /** - * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Verify the shipping address information and continue. + * Verify set shipping items information for address leak + * + * @return void + * @throws LocalizedException */ - public function testSetShippingItemsInformationForAddressLeak() + public function testSetShippingItemsInformationForAddressLeak(): void { $info = [ [ @@ -340,10 +359,18 @@ public function testSetShippingItemsInformationForAddressLeak() $this->helperMock->expects($this->once())->method('getMaximumQty')->willReturn(500); $this->customerMock->expects($this->once())->method('getAddresses')->willReturn($customerAddresses); + $this->expectExceptionMessage('Verify the shipping address information and continue.'); + $this->assertEquals($this->model, $this->model->setShippingItemsInformation($info)); } - public function testUpdateQuoteCustomerShippingAddress() + /** + * Verify update quote customer shipping address. + * + * @return void + * @throws LocalizedException + */ + public function testUpdateQuoteCustomerShippingAddress(): void { $addressId = 42; $customerAddressId = 42; @@ -359,10 +386,12 @@ public function testUpdateQuoteCustomerShippingAddress() } /** - * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Verify the shipping address information and continue. + * Verify update quote customer shipping address for address leak + * + * @return void + * @throws LocalizedException */ - public function testUpdateQuoteCustomerShippingAddressForAddressLeak() + public function testUpdateQuoteCustomerShippingAddressForAddressLeak(): void { $addressId = 43; $customerAddressId = 42; @@ -371,11 +400,18 @@ public function testUpdateQuoteCustomerShippingAddressForAddressLeak() $this->getCustomerAddressMock($customerAddressId) ]; $this->customerMock->expects($this->once())->method('getAddresses')->willReturn($customerAddresses); + $this->expectExceptionMessage('Verify the shipping address information and continue.'); $this->assertEquals($this->model, $this->model->updateQuoteCustomerShippingAddress($addressId)); } - public function testSetQuoteCustomerBillingAddress() + /** + * Verify set quote customer billing address. + * + * @return void + * @throws LocalizedException + */ + public function testSetQuoteCustomerBillingAddress(): void { $addressId = 42; $customerAddressId = 42; @@ -389,10 +425,12 @@ public function testSetQuoteCustomerBillingAddress() } /** - * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Verify the billing address information and continue. + * Verify set quote customer billing address for address leak. + * + * @return void + * @throws LocalizedException */ - public function testSetQuoteCustomerBillingAddressForAddressLeak() + public function testSetQuoteCustomerBillingAddressForAddressLeak(): void { $addressId = 43; $customerAddressId = 42; @@ -401,11 +439,17 @@ public function testSetQuoteCustomerBillingAddressForAddressLeak() $this->getCustomerAddressMock($customerAddressId) ]; $this->customerMock->expects($this->once())->method('getAddresses')->willReturn($customerAddresses); + $this->expectExceptionMessage('Verify the billing address information and continue.'); $this->assertEquals($this->model, $this->model->setQuoteCustomerBillingAddress($addressId)); } - public function testGetQuoteShippingAddressesItems() + /** + * Verify get quote shipping addresses items. + * + * @return void + */ + public function testGetQuoteShippingAddressesItems(): void { $quoteItem = $this->getMockBuilder(AddressItem::class) ->disableOriginalConstructor() @@ -415,7 +459,13 @@ public function testGetQuoteShippingAddressesItems() $this->model->getQuoteShippingAddressesItems(); } - public function testSetShippingMethods() + /** + * Verify set shipping methods + * + * @return void + * @throws LocalizedException + */ + public function testSetShippingMethods(): void { $methodsArray = [1 => 'flatrate_flatrate', 2 => 'tablerate_bestway']; $addressId = 1; @@ -444,12 +494,15 @@ public function testSetShippingMethods() } /** + * Verify create orders + * * @return void + * @throws \Exception */ public function testCreateOrders(): void { $addressTotal = 5; - $productType = \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE; + $productType = Type::TYPE_SIMPLE; $infoBuyRequest = [ 'info_buyRequest' => [ 'product' => '1', @@ -460,7 +513,7 @@ public function testCreateOrders(): void $paymentProviderCode = 'checkmo'; $shippingPrice = '0.00'; $currencyCode = 'USD'; - $simpleProductTypeMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\Type\Simple::class) + $simpleProductTypeMock = $this->getMockBuilder(Simple::class) ->disableOriginalConstructor() ->setMethods(['getOrderOptions']) ->getMock(); @@ -484,8 +537,8 @@ public function testCreateOrders(): void ->getMock(); $storeMock->method('getBaseCurrency')->willReturn($currencyMock); $storeMock->method('getCurrentCurrencyCode')->willReturn($currencyCode); - $orderAddressMock = $this->createSimpleMock(\Magento\Sales\Api\Data\OrderAddressInterface::class); - $orderPaymentMock = $this->createSimpleMock(\Magento\Sales\Api\Data\OrderPaymentInterface::class); + $orderAddressMock = $this->createSimpleMock(OrderAddressInterface::class); + $orderPaymentMock = $this->createSimpleMock(OrderPaymentInterface::class); $orderItemMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Item::class) ->disableOriginalConstructor() ->setMethods(['getQuoteItemId']) @@ -499,7 +552,7 @@ public function testCreateOrders(): void $this->orderFactoryMock->expects($this->once())->method('create')->willReturn($orderMock); $this->dataObjectHelperMock->expects($this->once())->method('mergeDataObjects') ->with( - \Magento\Sales\Api\Data\OrderInterface::class, + OrderInterface::class, $orderMock, $orderMock )->willReturnSelf(); @@ -517,6 +570,7 @@ public function testCreateOrders(): void )->willReturn($orderAddressMock); $this->toOrderPaymentMock->method('convert')->willReturn($orderPaymentMock); $this->toOrderItemMock->method('convert')->with($quoteAddressItemMock)->willReturn($orderItemMock); + $this->quoteMock->expects($this->once())->method('collectTotals')->willReturnSelf(); $placeOrderServiceMock = $this->getMockBuilder(PlaceOrderDefault::class) ->disableOriginalConstructor() @@ -530,10 +584,155 @@ public function testCreateOrders(): void } /** + * Create orders verify exception message + * + * @param array $config + * + * @return void + * @dataProvider getConfigCreateOrders + * @throws \Exception + */ + public function testCreateOrdersWithThrowsException(array $config): void + { + $simpleProductTypeMock = $this->getMockBuilder(Simple::class) + ->disableOriginalConstructor() + ->setMethods(['getOrderOptions']) + ->getMock(); + $orderAddressMock = $this->createSimpleMock(OrderAddressInterface::class); + $orderPaymentMock = $this->createSimpleMock(OrderPaymentInterface::class); + $orderItemMock = $this->createMock(\Magento\Sales\Model\Order\Item::class); + $productMock = $this->getProductMock($simpleProductTypeMock); + $orderMock = $this->getOrderMock( + $orderAddressMock, + $orderPaymentMock, + $orderItemMock + ); + $quoteItemMock = $this->getQuoteItemMock($config['productType'], $productMock); + $quoteAddressItemMock = $this->getQuoteAddressItemMock( + $quoteItemMock, + $config['productType'], + $config['infoBuyRequest'] + ); + list($shippingAddressMock, $billingAddressMock) = $this->getQuoteAddressesMock( + $quoteAddressItemMock, + $config['addressTotal'] + ); + $this->setQuoteMockData( + $config['paymentProviderCode'], + $shippingAddressMock, + $billingAddressMock + ); + $currencyMock = $this->getCurrencyMock($config['shippingPrice']); + $storeMock = $this->getStoreMock($currencyMock, $config['currencyCode']); + $placeOrderServiceMock = $this->getMockBuilder(PlaceOrderDefault::class) + ->disableOriginalConstructor() + ->setMethods(['place']) + ->getMock(); + + $orderItemMock->method('getQuoteItemId')->willReturn($config['quoteItemId']); + $simpleProductTypeMock->method('getOrderOptions') + ->with($productMock) + ->willReturn($config['infoBuyRequest']); + $this->getOrderMockData($orderMock, $storeMock, $config['shippingPrice']); + $this->orderFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($orderMock); + $this->dataObjectHelperMock->expects($this->once()) + ->method('mergeDataObjects') + ->with(OrderInterface::class, $orderMock, $orderMock) + ->willReturnSelf(); + $this->priceMock->expects($this->once()) + ->method('round') + ->with($config['addressTotal']) + ->willReturn($config['addressTotal']); + $this->toOrderMock->expects($this->once()) + ->method('convert') + ->with($shippingAddressMock) + ->willReturn($orderMock); + $this->toOrderAddressMock->expects($this->exactly(2)) + ->method('convert') + ->withConsecutive([$billingAddressMock, []], [$shippingAddressMock, []]) + ->willReturn($orderAddressMock); + $this->toOrderPaymentMock->method('convert') + ->willReturn($orderPaymentMock); + $this->toOrderItemMock->method('convert') + ->with($quoteAddressItemMock) + ->willReturn($orderItemMock); + $placeOrderServiceMock->method('place') + ->with([$orderMock]) + ->willReturn([$config['quoteId'] => new \Exception()]); + $this->quoteMock->expects($this->any()) + ->method('__call') + ->willReturnSelf(); + $this->placeOrderFactoryMock->method('create') + ->with($config['paymentProviderCode']) + ->willReturn($placeOrderServiceMock); + $this->quoteMock->expects($this->exactly(2)) + ->method('collectTotals') + ->willReturnSelf(); + $this->quoteRepositoryMock->expects($this->once()) + ->method('save') + ->with($this->quoteMock); + + $this->expectExceptionMessage('Quote address for failed order ID "1" not found.'); + + $this->model->createOrders(); + } + + /** + * Return Store Mock. + * + * @param MockObject $currencyMock + * @param string $currencyCode + * @return MockObject + */ + private function getStoreMock($currencyMock, string $currencyCode): MockObject + { + $storeMock = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->setMethods(['getBaseCurrency','getCurrentCurrencyCode' ]) + ->getMock(); + $storeMock->method('getBaseCurrency') + ->willReturn($currencyMock); + $storeMock->method('getCurrentCurrencyCode') + ->willReturn($currencyCode); + + return $storeMock; + } + + /** + * Return Order Mock with data + * + * @param MockObject $orderMock + * @param MockObject $storeMock + * @param string $shippingPrice + * @return void + */ + private function getOrderMockData( + MockObject $orderMock, + MockObject $storeMock, + string $shippingPrice + ): void { + $orderMock->expects($this->once()) + ->method('getStore') + ->willReturn($storeMock); + $orderMock->expects($this->once()) + ->method('setBaseShippingAmount') + ->with($shippingPrice) + ->willReturnSelf(); + $orderMock->expects($this->once()) + ->method('setShippingAmount') + ->with($shippingPrice) + ->willReturnSelf(); + } + + /** + * Return Payment Mock. + * * @param string $paymentProviderCode - * @return PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ - private function getPaymentMock(string $paymentProviderCode): PHPUnit_Framework_MockObject_MockObject + private function getPaymentMock(string $paymentProviderCode): MockObject { $abstractMethod = $this->getMockBuilder(AbstractMethod::class) ->disableOriginalConstructor() @@ -552,10 +751,12 @@ private function getPaymentMock(string $paymentProviderCode): PHPUnit_Framework_ } /** - * @param \Magento\Catalog\Model\Product\Type\Simple|PHPUnit_Framework_MockObject_MockObject $simpleProductTypeMock - * @return PHPUnit_Framework_MockObject_MockObject + * Return Product Mock. + * + * @param Simple|MockObject $simpleProductTypeMock + * @return MockObject */ - private function getProductMock($simpleProductTypeMock): PHPUnit_Framework_MockObject_MockObject + private function getProductMock($simpleProductTypeMock): MockObject { $productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class) ->disableOriginalConstructor() @@ -567,11 +768,13 @@ private function getProductMock($simpleProductTypeMock): PHPUnit_Framework_MockO } /** + * Return Quote Item Mock. + * * @param string $productType - * @param \Magento\Catalog\Model\Product|PHPUnit_Framework_MockObject_MockObject $productMock - * @return PHPUnit_Framework_MockObject_MockObject + * @param \Magento\Catalog\Model\Product|MockObject $productMock + * @return MockObject */ - private function getQuoteItemMock($productType, $productMock): PHPUnit_Framework_MockObject_MockObject + private function getQuoteItemMock($productType, $productMock): MockObject { $quoteItemMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Item::class) ->disableOriginalConstructor() @@ -584,16 +787,15 @@ private function getQuoteItemMock($productType, $productMock): PHPUnit_Framework } /** - * @param \Magento\Quote\Model\Quote\Item|PHPUnit_Framework_MockObject_MockObject $quoteItemMock + * Return Quote Address Item Mock + * + * @param \Magento\Quote\Model\Quote\Item|MockObject $quoteItemMock * @param string $productType * @param array $infoBuyRequest - * @return PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ - private function getQuoteAddressItemMock( - $quoteItemMock, - string $productType, - array $infoBuyRequest - ): PHPUnit_Framework_MockObject_MockObject { + private function getQuoteAddressItemMock($quoteItemMock, string $productType, array $infoBuyRequest): MockObject + { $quoteAddressItemMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Address\Item::class) ->disableOriginalConstructor() ->setMethods(['getQuoteItem', 'setProductType', 'setProductOptions', 'getParentItem']) @@ -607,7 +809,8 @@ private function getQuoteAddressItemMock( } /** - * @param \Magento\Quote\Model\Quote\Address\Item|PHPUnit_Framework_MockObject_MockObject $quoteAddressItemMock + * Return Quote Addresses Mock + * @param \Magento\Quote\Model\Quote\Address\Item|MockObject $quoteAddressItemMock * @param int $addressTotal * @return array */ @@ -650,9 +853,11 @@ private function getQuoteAddressesMock($quoteAddressItemMock, int $addressTotal) } /** + * Set data for Quote Mock. + * * @param string $paymentProviderCode - * @param Address|PHPUnit_Framework_MockObject_MockObject $shippingAddressMock - * @param Address|PHPUnit_Framework_MockObject_MockObject $billingAddressMock + * @param Address|MockObject $shippingAddressMock + * @param Address|MockObject $billingAddressMock * * @return void */ @@ -669,22 +874,20 @@ private function setQuoteMockData(string $paymentProviderCode, $shippingAddressM $this->quoteMock->method('hasVirtualItems') ->willReturn(false); $this->quoteMock->expects($this->once())->method('reserveOrderId')->willReturnSelf(); - $this->quoteMock->expects($this->once())->method('collectTotals')->willReturnSelf(); $this->quoteMock->method('getId')->willReturn($quoteId); $this->quoteMock->method('setIsActive')->with(false)->willReturnSelf(); } /** - * @param \Magento\Sales\Api\Data\OrderAddressInterface|PHPUnit_Framework_MockObject_MockObject $orderAddressMock - * @param \Magento\Sales\Api\Data\OrderPaymentInterface|PHPUnit_Framework_MockObject_MockObject $orderPaymentMock - * @param \Magento\Sales\Model\Order\Item|PHPUnit_Framework_MockObject_MockObject $orderItemMock - * @return PHPUnit_Framework_MockObject_MockObject + * Return Order Mock. + * + * @param OrderAddressInterface|MockObject $orderAddressMock + * @param OrderPaymentInterface|MockObject $orderPaymentMock + * @param \Magento\Sales\Model\Order\Item|MockObject $orderItemMock + * @return MockObject */ - private function getOrderMock( - $orderAddressMock, - $orderPaymentMock, - $orderItemMock - ): PHPUnit_Framework_MockObject_MockObject { + private function getOrderMock($orderAddressMock, $orderPaymentMock, $orderItemMock): MockObject + { $orderMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class) ->disableOriginalConstructor() ->setMethods( @@ -696,6 +899,7 @@ private function getOrderMock( 'addItem', 'getIncrementId', 'getId', + 'getEntityId', 'getCanSendNewEmailFlag', 'getItems', 'setShippingMethod', @@ -712,6 +916,7 @@ private function getOrderMock( $orderMock->method('addItem')->with($orderItemMock)->willReturnSelf(); $orderMock->method('getIncrementId')->willReturn('1'); $orderMock->method('getId')->willReturn('1'); + $orderMock->method('getEntityId')->willReturn('1'); $orderMock->method('getCanSendNewEmailFlag')->willReturn(false); $orderMock->method('getItems')->willReturn([$orderItemMock]); @@ -721,11 +926,13 @@ private function getOrderMock( /** * Tests exception for addresses with country id not in the allowed countries list. * - * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Some addresses can't be used due to the configurations for specific countries. + * @return void + * @throws \Exception */ - public function testCreateOrdersCountryNotPresentInAllowedListException() + public function testCreateOrdersCountryNotPresentInAllowedListException(): void { + $exceptionMessage = 'Some addresses can\'t be used due to the configurations for specific countries.'; + $abstractMethod = $this->getMockBuilder(AbstractMethod::class) ->disableOriginalConstructor() ->setMethods(['isAvailable']) @@ -757,15 +964,81 @@ public function testCreateOrdersCountryNotPresentInAllowedListException() ->willReturn($paymentMock); $this->quoteMock->method('getAllShippingAddresses') ->willReturn([$shippingAddressMock]); + $this->expectExceptionMessage($exceptionMessage); $this->model->createOrders(); } /** + * Verify validate minimum amount multi address is false. + * + * @return void + */ + public function testValidateMinimumAmountMultiAddressFalse(): void + { + $addressMock = $this->createMock(\Magento\Quote\Model\Quote\Address::class); + + $this->scopeConfigMock->expects($this->exactly(2)) + ->method('isSetFlag') + ->withConsecutive( + ['sales/minimum_order/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE], + ['sales/minimum_order/multi_address', \Magento\Store\Model\ScopeInterface::SCOPE_STORE] + )->willReturnOnConsecutiveCalls(true, false); + + $this->scopeConfigMock->expects($this->exactly(2)) + ->method('getValue') + ->withConsecutive( + ['sales/minimum_order/amount', \Magento\Store\Model\ScopeInterface::SCOPE_STORE], + ['sales/minimum_order/tax_including', \Magento\Store\Model\ScopeInterface::SCOPE_STORE] + )->willReturnOnConsecutiveCalls(100, false); + + $this->checkoutSessionMock->expects($this->atLeastOnce()) + ->method('getQuote') + ->willReturn($this->quoteMock); + $this->quoteMock->expects($this->once()) + ->method('getStoreId') + ->willReturn(1); + $this->quoteMock->expects($this->once()) + ->method('getAllAddresses') + ->willReturn([$addressMock]); + $addressMock->expects($this->once()) + ->method('getBaseSubtotalWithDiscount') + ->willReturn(101); + + $this->assertTrue($this->model->validateMinimumAmount()); + } + + /** + * Verify validate minimum amount multi address is true. + * + * @return void + */ + public function testValidateMinimumAmountMultiAddressTrue(): void + { + $this->scopeConfigMock->expects($this->exactly(2)) + ->method('isSetFlag') + ->withConsecutive( + ['sales/minimum_order/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE], + ['sales/minimum_order/multi_address', \Magento\Store\Model\ScopeInterface::SCOPE_STORE] + )->willReturnOnConsecutiveCalls(true, true); + + $this->checkoutSessionMock->expects($this->atLeastOnce()) + ->method('getQuote') + ->willReturn($this->quoteMock); + $this->quoteMock->expects($this->once()) + ->method('validateMinimumAmount') + ->willReturn(false); + + $this->assertFalse($this->model->validateMinimumAmount()); + } + + /** + * Return Extension Attributes Mock. + * * @param ShippingAssignment $shippingAssignmentMock - * @return CartExtension|PHPUnit_Framework_MockObject_MockObject + * @return CartExtension|MockObject */ - private function getExtensionAttributesMock(ShippingAssignment $shippingAssignmentMock) + private function getExtensionAttributesMock(ShippingAssignment $shippingAssignmentMock): MockObject { $extensionAttributesMock = $this->getMockBuilder(CartExtension::class) ->setMethods(['setShippingAssignments']) @@ -781,9 +1054,11 @@ private function getExtensionAttributesMock(ShippingAssignment $shippingAssignme } /** - * @return ShippingAssignment | PHPUnit_Framework_MockObject_MockObject + * Return Shipping Assignment Mock. + * + * @return ShippingAssignment | MockObject */ - private function getShippingAssignmentMock() + private function getShippingAssignmentMock(): MockObject { $shippingAssignmentMock = $this->getMockBuilder(ShippingAssignment::class) ->disableOriginalConstructor() @@ -801,7 +1076,12 @@ private function getShippingAssignmentMock() return $shippingAssignmentMock; } - private function mockShippingAssignment() + /** + * Expected shipping assignment + * + * @return void + */ + private function mockShippingAssignment(): void { $shippingAssignmentMock = $this->getShippingAssignmentMock(); @@ -825,10 +1105,12 @@ private function mockShippingAssignment() } /** + * Return Customer Address Mock + * * @param $customerAddressId - * @return Address | PHPUnit_Framework_MockObject_MockObject + * @return Address | MockObject */ - private function getCustomerAddressMock($customerAddressId) + private function getCustomerAddressMock($customerAddressId): MockObject { $customerAddressMock = $this->getMockBuilder(Address::class) ->setMethods(['getId']) @@ -842,46 +1124,59 @@ private function getCustomerAddressMock($customerAddressId) } /** + * Return Simple Mock. + * * @param string $className - * @return PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ - private function createSimpleMock($className) + private function createSimpleMock($className): MockObject { return $this->getMockBuilder($className) ->disableOriginalConstructor() ->getMock(); } - public function testValidateMinimumAmountMultiAddressTrue() + /** + * Return Currency Mock. + * + * @param $shippingPrice + * @return MockObject + */ + private function getCurrencyMock($shippingPrice): MockObject { - $this->scopeConfigMock->expects($this->exactly(2))->method('isSetFlag')->withConsecutive( - ['sales/minimum_order/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE], - ['sales/minimum_order/multi_address', \Magento\Store\Model\ScopeInterface::SCOPE_STORE] - )->willReturnOnConsecutiveCalls(true, true); - - $this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuote')->willReturn($this->quoteMock); - $this->quoteMock->expects($this->once())->method('validateMinimumAmount')->willReturn(false); - $this->assertFalse($this->model->validateMinimumAmount()); + $currencyMock = $this->getMockBuilder(Currency::class) + ->disableOriginalConstructor() + ->setMethods([ 'convert' ]) + ->getMock(); + $currencyMock->method('convert')->willReturn($shippingPrice); + return $currencyMock; } - public function testValidateMinimumAmountMultiAddressFalse() + /** + * Data provider + * + * @return array + */ + public function getConfigCreateOrders(): array { - $addressMock = $this->createMock(\Magento\Quote\Model\Quote\Address::class); - $this->scopeConfigMock->expects($this->exactly(2))->method('isSetFlag')->withConsecutive( - ['sales/minimum_order/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE], - ['sales/minimum_order/multi_address', \Magento\Store\Model\ScopeInterface::SCOPE_STORE] - )->willReturnOnConsecutiveCalls(true, false); - - $this->scopeConfigMock->expects($this->exactly(2))->method('getValue')->withConsecutive( - ['sales/minimum_order/amount', \Magento\Store\Model\ScopeInterface::SCOPE_STORE], - ['sales/minimum_order/tax_including', \Magento\Store\Model\ScopeInterface::SCOPE_STORE] - )->willReturnOnConsecutiveCalls(100, false); - - $this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuote')->willReturn($this->quoteMock); - $this->quoteMock->expects($this->once())->method('getStoreId')->willReturn(1); - $this->quoteMock->expects($this->once())->method('getAllAddresses')->willReturn([$addressMock]); - $addressMock->expects($this->once())->method('getBaseSubtotalWithDiscount')->willReturn(101); - - $this->assertTrue($this->model->validateMinimumAmount()); + return [ + [ + [ + 'quoteId' => 1, + 'addressTotal' => 5, + 'productType' => Type::TYPE_SIMPLE, + 'infoBuyRequest'=> [ + 'info_buyRequest' => [ + 'product' => '1', + 'qty' => 1, + ], + ], + 'quoteItemId' => 1, + 'paymentProviderCode' => 'checkmo', + 'shippingPrice' => '0.00', + 'currencyCode' => 'USD', + ] + ] + ]; } } diff --git a/app/code/Magento/Multishipping/i18n/en_US.csv b/app/code/Magento/Multishipping/i18n/en_US.csv index 43615e697b931..f9ab587c65fa3 100644 --- a/app/code/Magento/Multishipping/i18n/en_US.csv +++ b/app/code/Magento/Multishipping/i18n/en_US.csv @@ -91,3 +91,4 @@ Options,Options "Ship to:","Ship to:" "Error:","Error:" "We are unable to process your request. Please, try again later.","We are unable to process your request. Please, try again later." +"Quote address for failed order ID "%1" not found.","Quote address for failed order ID "%1" not found."