295 lines
10 KiB
PHP
Executable File
295 lines
10 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Customer\Model\Address;
|
|
|
|
use Magento\Customer\Api\AddressRepositoryInterface;
|
|
use Magento\Customer\Api\CustomerRepositoryInterface;
|
|
use Magento\Customer\Api\Data\AddressInterface;
|
|
use Magento\Customer\Model\AddressRegistry;
|
|
use Magento\Customer\Model\CustomerRegistry;
|
|
use Magento\Customer\Model\ResourceModel\Address;
|
|
use Magento\Framework\Exception\InputException;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\TestFramework\ObjectManager;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Assert that address was updated as expected or address update throws expected error.
|
|
*
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
class UpdateAddressTest extends TestCase
|
|
{
|
|
/**
|
|
* @var ObjectManager
|
|
*/
|
|
private $objectManager;
|
|
|
|
/**
|
|
* @var AddressRegistry
|
|
*/
|
|
protected $addressRegistry;
|
|
|
|
/**
|
|
* @var Address
|
|
*/
|
|
protected $addressResource;
|
|
|
|
/**
|
|
* @var CustomerRegistry
|
|
*/
|
|
protected $customerRegistry;
|
|
|
|
/**
|
|
* @var AddressRepositoryInterface
|
|
*/
|
|
protected $addressRepository;
|
|
|
|
/**
|
|
* @var CustomerRepositoryInterface
|
|
*/
|
|
protected $customerRepository;
|
|
|
|
/**
|
|
* @var int[]
|
|
*/
|
|
protected $processedAddressesIds = [];
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
$this->objectManager = Bootstrap::getObjectManager();
|
|
$this->addressRegistry = $this->objectManager->get(AddressRegistry::class);
|
|
$this->addressResource = $this->objectManager->get(Address::class);
|
|
$this->customerRegistry = $this->objectManager->get(CustomerRegistry::class);
|
|
$this->addressRepository = $this->objectManager->get(AddressRepositoryInterface::class);
|
|
$this->customerRepository = $this->objectManager->get(CustomerRepositoryInterface::class);
|
|
parent::setUp();
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function tearDown(): void
|
|
{
|
|
foreach ($this->processedAddressesIds as $createdAddressesId) {
|
|
$this->addressRegistry->remove($createdAddressesId);
|
|
}
|
|
parent::tearDown();
|
|
}
|
|
|
|
/**
|
|
* Assert that default addresses properly updated for customer.
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
*
|
|
* @dataProvider updateAddressIsDefaultDataProvider
|
|
*
|
|
* @param bool $isShippingDefault
|
|
* @param bool $isBillingDefault
|
|
* @param int|null $expectedShipping
|
|
* @param int|null $expectedBilling
|
|
* @return void
|
|
*/
|
|
public function testUpdateAddressIsDefault(
|
|
bool $isShippingDefault,
|
|
bool $isBillingDefault,
|
|
?int $expectedShipping,
|
|
?int $expectedBilling
|
|
): void {
|
|
$customer = $this->customerRepository->get('customer@example.com');
|
|
$this->assertEquals(1, $customer->getDefaultShipping());
|
|
$this->assertEquals(1, $customer->getDefaultBilling());
|
|
$this->processedAddressesIds[] = 1;
|
|
$address = $this->addressRepository->getById(1);
|
|
$address->setIsDefaultShipping($isShippingDefault);
|
|
$address->setIsDefaultBilling($isBillingDefault);
|
|
$this->addressRepository->save($address);
|
|
$this->customerRegistry->remove(1);
|
|
$customer = $this->customerRepository->get('customer@example.com');
|
|
$this->assertEquals($customer->getDefaultShipping(), $expectedShipping);
|
|
$this->assertEquals($customer->getDefaultBilling(), $expectedBilling);
|
|
}
|
|
|
|
/**
|
|
* Data provider for update address as default billing or default shipping.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function updateAddressIsDefaultDataProvider(): array
|
|
{
|
|
return [
|
|
'update_shipping_address_default' => [true, false, 1, null],
|
|
'update_billing_address_default' => [false, true, null, 1],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Assert that address updated successfully.
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
*
|
|
* @dataProvider updateAddressesDataProvider
|
|
*
|
|
* @param array $updateData
|
|
* @param array $expectedData
|
|
* @return void
|
|
*/
|
|
public function testUpdateAddress(array $updateData, array $expectedData): void
|
|
{
|
|
$this->processedAddressesIds[] = 1;
|
|
$address = $this->addressRepository->getById(1);
|
|
foreach ($updateData as $setFieldName => $setValue) {
|
|
$address->setData($setFieldName, $setValue);
|
|
}
|
|
$updatedAddressData = $this->addressRepository->save($address)->__toArray();
|
|
foreach ($expectedData as $getFieldName => $getValue) {
|
|
$this->assertTrue(isset($updatedAddressData[$getFieldName]), "Field $getFieldName wasn't found.");
|
|
$this->assertEquals($getValue, $updatedAddressData[$getFieldName]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Data provider for update address with proper data.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function updateAddressesDataProvider(): array
|
|
{
|
|
return [
|
|
'required_field_telephone' => [
|
|
[AddressInterface::TELEPHONE => 251512979595],
|
|
[AddressInterface::TELEPHONE => 251512979595],
|
|
],
|
|
'required_field_postcode' => [
|
|
[AddressInterface::POSTCODE => 55425],
|
|
[AddressInterface::POSTCODE => 55425],
|
|
],
|
|
'required_field_empty_postcode_for_uk' => [
|
|
[AddressInterface::COUNTRY_ID => 'GB', AddressInterface::POSTCODE => ''],
|
|
[AddressInterface::COUNTRY_ID => 'GB', AddressInterface::POSTCODE => null],
|
|
],
|
|
'required_field_empty_region_id_for_ua' => [
|
|
[AddressInterface::COUNTRY_ID => 'UA', AddressInterface::REGION_ID => ''],
|
|
[
|
|
AddressInterface::COUNTRY_ID => 'UA',
|
|
AddressInterface::REGION_ID => 0,
|
|
],
|
|
],
|
|
'required_field_firstname' => [
|
|
[AddressInterface::FIRSTNAME => 'Test firstname'],
|
|
[AddressInterface::FIRSTNAME => 'Test firstname'],
|
|
],
|
|
'required_field_lastname' => [
|
|
[AddressInterface::LASTNAME => 'Test lastname'],
|
|
[AddressInterface::LASTNAME => 'Test lastname'],
|
|
],
|
|
'required_field_street_as_array' => [
|
|
[AddressInterface::STREET => ['', 'Test str, 55']],
|
|
[AddressInterface::STREET => ['Test str, 55']],
|
|
],
|
|
'required_field_city' => [
|
|
[AddressInterface::CITY => 'Test city'],
|
|
[AddressInterface::CITY => 'Test city'],
|
|
],
|
|
'field_name_prefix' => [
|
|
[AddressInterface::PREFIX => 'My prefix'],
|
|
[AddressInterface::PREFIX => 'My prefix'],
|
|
],
|
|
'field_middle_name_initial' => [
|
|
[AddressInterface::MIDDLENAME => 'My middle name'],
|
|
[AddressInterface::MIDDLENAME => 'My middle name'],
|
|
],
|
|
'field_name_suffix' => [
|
|
[AddressInterface::SUFFIX => 'My suffix'],
|
|
[AddressInterface::SUFFIX => 'My suffix'],
|
|
],
|
|
'field_company_name' => [
|
|
[AddressInterface::COMPANY => 'My company'],
|
|
[AddressInterface::COMPANY => 'My company'],
|
|
],
|
|
'field_vat_number' => [
|
|
[AddressInterface::VAT_ID => 'My VAT number'],
|
|
[AddressInterface::VAT_ID => 'My VAT number'],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Assert that error message has thrown during process address update.
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
*
|
|
* @dataProvider updateWrongAddressesDataProvider
|
|
*
|
|
* @param array $updateData
|
|
* @param \Exception $expectException
|
|
* @return void
|
|
*/
|
|
public function testExceptionThrownDuringUpdateAddress(array $updateData, \Exception $expectException): void
|
|
{
|
|
$this->processedAddressesIds[] = 1;
|
|
$address = $this->addressRepository->getById(1);
|
|
foreach ($updateData as $setFieldName => $setValue) {
|
|
$address->setData($setFieldName, $setValue);
|
|
}
|
|
$this->expectExceptionObject($expectException);
|
|
$this->addressRepository->save($address);
|
|
}
|
|
|
|
/**
|
|
* Data provider for update address with proper data or with error.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function updateWrongAddressesDataProvider(): array
|
|
{
|
|
return [
|
|
'required_field_empty_telephone' => [
|
|
[AddressInterface::TELEPHONE => ''],
|
|
InputException::requiredField('telephone'),
|
|
],
|
|
'required_field_empty_postcode_for_us' => [
|
|
[AddressInterface::POSTCODE => ''],
|
|
InputException::requiredField('postcode'),
|
|
],
|
|
// TODO: Uncomment this variation after fix issue https://jira.corp.magento.com/browse/MC-31031
|
|
// 'required_field_empty_region_id_for_us' => [
|
|
// [AddressInterface::REGION_ID => ''],
|
|
// InputException::requiredField('regionId'),
|
|
// ],
|
|
'required_field_empty_firstname' => [
|
|
[AddressInterface::FIRSTNAME => ''],
|
|
InputException::requiredField('firstname'),
|
|
],
|
|
'required_field_empty_lastname' => [
|
|
[AddressInterface::LASTNAME => ''],
|
|
InputException::requiredField('lastname'),
|
|
],
|
|
'required_field_empty_street_as_array' => [
|
|
[AddressInterface::STREET => []],
|
|
InputException::requiredField('street'),
|
|
],
|
|
'required_field_empty_city' => [
|
|
[AddressInterface::CITY => ''],
|
|
InputException::requiredField('city'),
|
|
],
|
|
// TODO: Uncomment this variation after fix issue https://jira.corp.magento.com/browse/MC-31031
|
|
// 'field_invalid_vat_number' => [
|
|
// [AddressInterface::VAT_ID => '/>.<*'],
|
|
// null// It need to create some error but currently magento doesn't has validation for this field.,
|
|
// ],
|
|
];
|
|
}
|
|
}
|