1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Checkout\Api;
use Magento\Checkout\Api\Data\ShippingInformationInterface;
use Magento\Checkout\Api\Data\ShippingInformationInterfaceFactory;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Api\Data\ShippingAssignmentInterface;
use Magento\TestFramework\Helper\Bootstrap;
use PHPUnit\Framework\TestCase;
use Magento\Quote\Model\QuoteIdMask;
use Magento\Quote\Model\QuoteIdMaskFactory;
/**
* Test GuestShippingInformationManagement API.
*/
class GuestShippingInformationManagementTest extends TestCase
{
/**
* @var GuestShippingInformationManagementInterface
*/
private $management;
/**
* @var CartRepositoryInterface
*/
private $cartRepo;
/**
* @var CustomerRepositoryInterface
*/
private $customerRepo;
/**
* @var ShippingInformationInterfaceFactory
*/
private $shippingFactory;
/**
* @var SearchCriteriaBuilder
*/
private $searchCriteria;
/**
* @var QuoteIdMaskFactory
*/
private $maskFactory;
protected function setUp()
{
$objectManager = Bootstrap::getObjectManager();
$this->management = $objectManager->get(GuestShippingInformationManagementInterface::class);
$this->cartRepo = $objectManager->get(CartRepositoryInterface::class);
$this->customerRepo = $objectManager->get(CustomerRepositoryInterface::class);
$this->shippingFactory = $objectManager->get(ShippingInformationInterfaceFactory::class);
$this->searchCriteria = $objectManager->get(SearchCriteriaBuilder::class);
$this->maskFactory = $objectManager->get(QuoteIdMaskFactory::class);
}
/**
* Test using another address for quote.
*
* @param bool $swapShipping Whether to swap shipping or billing addresses.
* @return void
*
* @magentoDataFixture Magento/Sales/_files/quote.php
* @magentoDataFixture Magento/Customer/_files/customer_with_addresses.php
* @dataProvider getAddressesVariation
* @expectedException \Magento\Framework\Exception\InputException
* @expectedExceptionMessage The shipping information was unable to be saved. Verify the input data and try again.
*/
public function testDifferentAddresses(bool $swapShipping)
{
$carts = $this->cartRepo->getList(
$this->searchCriteria->addFilter('reserved_order_id', 'test01')->create()
)->getItems();
$cart = array_pop($carts);
$otherCustomer = $this->customerRepo->get('customer_with_addresses@test.com');
$otherAddresses = $otherCustomer->getAddresses();
$otherAddress = array_pop($otherAddresses);
//Setting invalid IDs.
/** @var ShippingAssignmentInterface $shippingAssignment */
$shippingAssignment = $cart->getExtensionAttributes()->getShippingAssignments()[0];
$shippingAddress = $shippingAssignment->getShipping()->getAddress();
$billingAddress = $cart->getBillingAddress();
if ($swapShipping) {
$address = $shippingAddress;
} else {
$address = $billingAddress;
}
$address->setCustomerAddressId($otherAddress->getId());
$address->setCustomerId($otherCustomer->getId());
$address->setId(null);
/** @var ShippingInformationInterface $shippingInformation */
$shippingInformation = $this->shippingFactory->create();
$shippingInformation->setBillingAddress($billingAddress);
$shippingInformation->setShippingAddress($shippingAddress);
$shippingInformation->setShippingMethodCode('flatrate');
/** @var QuoteIdMask $idMask */
$idMask = $this->maskFactory->create();
$idMask->load($cart->getId(), 'quote_id');
$this->management->saveAddressInformation($idMask->getMaskedId(), $shippingInformation);
}
/**
* Different variations for addresses test.
*
* @return array
*/
public function getAddressesVariation(): array
{
return [
'Shipping address swap' => [true],
'Billing address swap' => [false]
];
}
}