468 lines
18 KiB
PHP
Executable File
468 lines
18 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
namespace Magento\Customer\Api;
|
|
|
|
use Magento\Framework\Exception\InputException;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
|
|
/**
|
|
* Integration test for service layer \Magento\Customer\Model\ResourceModel\AddressRepository
|
|
*
|
|
* @SuppressWarnings(PHPMD.TooManyMethods)
|
|
* @SuppressWarnings(PHPMD.ExcessivePublicCount)
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class AddressRepositoryTest extends \PHPUnit\Framework\TestCase
|
|
{
|
|
/** @var AddressRepositoryInterface */
|
|
private $repository;
|
|
|
|
/** @var \Magento\Framework\ObjectManagerInterface */
|
|
private $_objectManager;
|
|
|
|
/** @var \Magento\Customer\Model\Data\Address[] */
|
|
private $_expectedAddresses;
|
|
|
|
/** @var \Magento\Customer\Api\Data\AddressInterfaceFactory */
|
|
private $_addressFactory;
|
|
|
|
/** @var \Magento\Framework\Api\DataObjectHelper */
|
|
protected $dataObjectHelper;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
|
|
$this->repository = $this->_objectManager->create(\Magento\Customer\Api\AddressRepositoryInterface::class);
|
|
$this->_addressFactory = $this->_objectManager->create(
|
|
\Magento\Customer\Api\Data\AddressInterfaceFactory::class
|
|
);
|
|
$this->dataObjectHelper = $this->_objectManager->create(\Magento\Framework\Api\DataObjectHelper::class);
|
|
|
|
$regionFactory = $this->_objectManager->create(\Magento\Customer\Api\Data\RegionInterfaceFactory::class);
|
|
$region = $regionFactory->create();
|
|
$region->setRegionCode('AL')
|
|
->setRegion('Alabama')
|
|
->setRegionId(1);
|
|
$address = $this->_addressFactory->create()
|
|
->setId('1')
|
|
->setCountryId('US')
|
|
->setCustomerId(1)
|
|
->setPostcode('75477')
|
|
->setRegion($region)
|
|
->setStreet(['Green str, 67'])
|
|
->setTelephone('3468676')
|
|
->setCity('CityM')
|
|
->setFirstname('John')
|
|
->setLastname('Smith')
|
|
->setCompany('CompanyName')
|
|
->setRegionId(1);
|
|
|
|
/* XXX: would it be better to have a clear method for this? */
|
|
$address2 = $this->_addressFactory->create()
|
|
->setId('2')
|
|
->setCountryId('US')
|
|
->setCustomerId(1)
|
|
->setPostcode('47676')
|
|
->setRegion($region)
|
|
->setStreet(['Black str, 48'])
|
|
->setCity('CityX')
|
|
->setTelephone('3234676')
|
|
->setFirstname('John')
|
|
->setLastname('Smith')
|
|
->setRegionId(1);
|
|
|
|
$this->_expectedAddresses = [$address, $address2];
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
|
|
/** @var \Magento\Customer\Model\CustomerRegistry $customerRegistry */
|
|
$customerRegistry = $objectManager->get(\Magento\Customer\Model\CustomerRegistry::class);
|
|
$customerRegistry->remove(1);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testSaveAddressChanges()
|
|
{
|
|
$address = $this->repository->getById(2);
|
|
|
|
$address->setRegion($address->getRegion());
|
|
// change phone #
|
|
$address->setTelephone('555' . $address->getTelephone());
|
|
$address = $this->repository->save($address);
|
|
$this->assertEquals(2, $address->getId());
|
|
|
|
$savedAddress = $this->repository->getById(2);
|
|
$this->assertNotEquals($this->_expectedAddresses[1]->getTelephone(), $savedAddress->getTelephone());
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testSaveAddressesIdSetButNotAlreadyExisting()
|
|
{
|
|
$this->expectException(\Magento\Framework\Exception\NoSuchEntityException::class);
|
|
$this->expectExceptionMessage('No such entity with addressId = 4200');
|
|
|
|
$proposedAddress = $this->_createSecondAddress()->setId(4200);
|
|
$this->repository->save($proposedAddress);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testGetAddressById()
|
|
{
|
|
$addressId = 2;
|
|
$address = $this->repository->getById($addressId);
|
|
$this->assertEquals($this->_expectedAddresses[1], $address);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*/
|
|
public function testGetAddressByIdBadAddressId()
|
|
{
|
|
$this->expectException(\Magento\Framework\Exception\NoSuchEntityException::class);
|
|
$this->expectExceptionMessage('No such entity with addressId = 12345');
|
|
|
|
$this->repository->getById(12345);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testSaveNewAddress()
|
|
{
|
|
$proposedAddress = $this->_createSecondAddress()->setCustomerId(1);
|
|
|
|
$returnedAddress = $this->repository->save($proposedAddress);
|
|
$this->assertNotNull($returnedAddress->getId());
|
|
|
|
$savedAddress = $this->repository->getById($returnedAddress->getId());
|
|
|
|
$expectedNewAddress = $this->_expectedAddresses[1];
|
|
$expectedNewAddress->setId($savedAddress->getId());
|
|
$expectedNewAddress->setRegion($this->_expectedAddresses[1]->getRegion());
|
|
|
|
$this->assertEquals($expectedNewAddress->getExtensionAttributes(), $savedAddress->getExtensionAttributes());
|
|
$this->assertEquals(
|
|
$expectedNewAddress->getRegion()->getExtensionAttributes(),
|
|
$savedAddress->getRegion()->getExtensionAttributes()
|
|
);
|
|
|
|
$this->assertEquals($expectedNewAddress, $savedAddress);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testSaveNewAddressWithAttributes()
|
|
{
|
|
$proposedAddress = $this->_createFirstAddress()
|
|
->setCustomAttribute('firstname', 'Jane')
|
|
->setCustomAttribute('id', 4200)
|
|
->setCustomAttribute('weird', 'something_strange_with_hair')
|
|
->setId(null)
|
|
->setCustomerId(1);
|
|
|
|
$returnedAddress = $this->repository->save($proposedAddress);
|
|
|
|
$savedAddress = $this->repository->getById($returnedAddress->getId());
|
|
$this->assertNotEquals($proposedAddress, $savedAddress);
|
|
$this->assertArrayNotHasKey(
|
|
'weird',
|
|
$savedAddress->getCustomAttributes(),
|
|
'Only valid attributes should be available.'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testSaveNewInvalidAddress()
|
|
{
|
|
$address = $this->_createFirstAddress()
|
|
->setCustomAttribute('firstname', null)
|
|
->setId(null)
|
|
->setFirstname(null)
|
|
->setLastname(null)
|
|
->setCustomerId(1)
|
|
->setRegionId($invalidRegion = 10354);
|
|
try {
|
|
$this->repository->save($address);
|
|
} catch (InputException $exception) {
|
|
$this->assertEquals('One or more input exceptions have occurred.', $exception->getMessage());
|
|
$errors = $exception->getErrors();
|
|
$this->assertCount(3, $errors);
|
|
$this->assertEquals('"firstname" is required. Enter and try again.', $errors[0]->getLogMessage());
|
|
$this->assertEquals('"lastname" is required. Enter and try again.', $errors[1]->getLogMessage());
|
|
$this->assertEquals(
|
|
__(
|
|
'Invalid value of "%value" provided for the %fieldName field.',
|
|
['fieldName' => 'regionId', 'value' => $invalidRegion]
|
|
),
|
|
$errors[2]->getLogMessage()
|
|
);
|
|
}
|
|
|
|
$address->setCountryId($invalidCountry = 'invalid_id');
|
|
try {
|
|
$this->repository->save($address);
|
|
} catch (InputException $exception) {
|
|
$this->assertEquals(
|
|
'One or more input exceptions have occurred.',
|
|
$exception->getMessage()
|
|
);
|
|
$errors = $exception->getErrors();
|
|
$this->assertCount(3, $errors);
|
|
$this->assertEquals(
|
|
'"firstname" is required. Enter and try again.',
|
|
$errors[0]->getLogMessage()
|
|
);
|
|
$this->assertEquals(
|
|
'"lastname" is required. Enter and try again.',
|
|
$errors[1]->getLogMessage()
|
|
);
|
|
$this->assertEquals(
|
|
__(
|
|
'Invalid value of "%value" provided for the %fieldName field.',
|
|
['fieldName' => 'countryId', 'value' => $invalidCountry]
|
|
),
|
|
$errors[2]->getLogMessage()
|
|
);
|
|
}
|
|
}
|
|
|
|
public function testSaveAddressesCustomerIdNotExist()
|
|
{
|
|
$proposedAddress = $this->_createSecondAddress()->setCustomerId(4200);
|
|
try {
|
|
$this->repository->save($proposedAddress);
|
|
$this->fail('Expected exception not thrown');
|
|
} catch (NoSuchEntityException $nsee) {
|
|
$this->assertEquals('No such entity with customerId = 4200', $nsee->getMessage());
|
|
}
|
|
}
|
|
|
|
public function testSaveAddressesCustomerIdInvalid()
|
|
{
|
|
$proposedAddress = $this->_createSecondAddress()->setCustomerId('this_is_not_a_valid_id');
|
|
try {
|
|
$this->repository->save($proposedAddress);
|
|
$this->fail('Expected exception not thrown');
|
|
} catch (NoSuchEntityException $nsee) {
|
|
$this->assertEquals('No such entity with customerId = this_is_not_a_valid_id', $nsee->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
*/
|
|
public function testDeleteAddress()
|
|
{
|
|
$addressId = 1;
|
|
// See that customer already has an address with expected addressId
|
|
$addressDataObject = $this->repository->getById($addressId);
|
|
$this->assertEquals($addressDataObject->getId(), $addressId);
|
|
|
|
// Delete the address from the customer
|
|
$this->repository->delete($addressDataObject);
|
|
|
|
// See that address is deleted
|
|
try {
|
|
$addressDataObject = $this->repository->getById($addressId);
|
|
$this->fail("Expected NoSuchEntityException not caught");
|
|
} catch (NoSuchEntityException $exception) {
|
|
$this->assertEquals('No such entity with addressId = 1', $exception->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_address.php
|
|
*/
|
|
public function testDeleteAddressById()
|
|
{
|
|
$addressId = 1;
|
|
// See that customer already has an address with expected addressId
|
|
$addressDataObject = $this->repository->getById($addressId);
|
|
$this->assertEquals($addressDataObject->getId(), $addressId);
|
|
|
|
// Delete the address from the customer
|
|
$this->repository->deleteById($addressId);
|
|
|
|
// See that address is deleted
|
|
try {
|
|
$addressDataObject = $this->repository->getById($addressId);
|
|
$this->fail("Expected NoSuchEntityException not caught");
|
|
} catch (NoSuchEntityException $exception) {
|
|
$this->assertEquals('No such entity with addressId = 1', $exception->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*/
|
|
public function testDeleteAddressFromCustomerBadAddressId()
|
|
{
|
|
try {
|
|
$this->repository->deleteById(12345);
|
|
$this->fail("Expected NoSuchEntityException not caught");
|
|
} catch (NoSuchEntityException $exception) {
|
|
$this->assertEquals('No such entity with addressId = 12345', $exception->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param \Magento\Framework\Api\Filter[] $filters
|
|
* @param \Magento\Framework\Api\Filter[] $filterGroup
|
|
* @param array $expectedResult array of expected results indexed by ID
|
|
*
|
|
* @dataProvider searchAddressDataProvider
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
|
|
* @magentoAppIsolation enabled
|
|
*/
|
|
public function testSearchAddresses($filters, $filterGroup, $expectedResult)
|
|
{
|
|
/** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchBuilder */
|
|
$searchBuilder = $this->_objectManager->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
|
|
foreach ($filters as $filter) {
|
|
$searchBuilder->addFilters([$filter]);
|
|
}
|
|
if ($filterGroup !== null) {
|
|
$searchBuilder->addFilters($filterGroup);
|
|
}
|
|
|
|
$searchResults = $this->repository->getList($searchBuilder->create());
|
|
|
|
$this->assertEquals(count($expectedResult), $searchResults->getTotalCount());
|
|
|
|
/** @var \Magento\Customer\Api\Data\AddressInterface $item */
|
|
foreach ($searchResults->getItems() as $item) {
|
|
$this->assertEquals(
|
|
$expectedResult[$item->getId()]['city'],
|
|
$item->getCity()
|
|
);
|
|
$this->assertEquals(
|
|
$expectedResult[$item->getId()]['postcode'],
|
|
$item->getPostcode()
|
|
);
|
|
$this->assertEquals(
|
|
$expectedResult[$item->getId()]['firstname'],
|
|
$item->getFirstname()
|
|
);
|
|
unset($expectedResult[$item->getId()]);
|
|
}
|
|
}
|
|
|
|
public function searchAddressDataProvider()
|
|
{
|
|
/**
|
|
* @var \Magento\Framework\Api\FilterBuilder $filterBuilder
|
|
*/
|
|
$filterBuilder = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
|
|
->create(\Magento\Framework\Api\FilterBuilder::class);
|
|
return [
|
|
'Address with postcode 75477' => [
|
|
[$filterBuilder->setField('postcode')->setValue('75477')->create()],
|
|
null,
|
|
[1 => ['city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John']],
|
|
],
|
|
'Address with city CityM' => [
|
|
[$filterBuilder->setField('city')->setValue('CityM')->create()],
|
|
null,
|
|
[1 => ['city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John']],
|
|
],
|
|
'Addresses with firstname John' => [
|
|
[$filterBuilder->setField('firstname')->setValue('John')->create()],
|
|
null,
|
|
[
|
|
1 => ['city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John'],
|
|
2 => ['city' => 'CityX', 'postcode' => 47676, 'firstname' => 'John']
|
|
],
|
|
],
|
|
'Addresses with postcode of either 75477 or 47676' => [
|
|
[],
|
|
[
|
|
$filterBuilder->setField('postcode')->setValue('75477')->create(),
|
|
$filterBuilder->setField('postcode')->setValue('47676')->create()
|
|
],
|
|
[
|
|
1 => ['city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John'],
|
|
2 => ['city' => 'CityX', 'postcode' => 47676, 'firstname' => 'John']
|
|
],
|
|
],
|
|
'Addresses with postcode greater than 0' => [
|
|
[$filterBuilder->setField('postcode')->setValue('0')->setConditionType('gt')->create()],
|
|
null,
|
|
[
|
|
1 => ['city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John'],
|
|
2 => ['city' => 'CityX', 'postcode' => 47676, 'firstname' => 'John']
|
|
],
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Helper function that returns an Address Data Object that matches the data from customer_address fixture
|
|
*
|
|
* @return \Magento\Customer\Api\Data\AddressInterface
|
|
*/
|
|
private function _createFirstAddress()
|
|
{
|
|
$address = $this->_addressFactory->create();
|
|
$this->dataObjectHelper->mergeDataObjects(
|
|
\Magento\Customer\Api\Data\AddressInterface::class,
|
|
$address,
|
|
$this->_expectedAddresses[0]
|
|
);
|
|
$address->setId(null);
|
|
$address->setRegion($this->_expectedAddresses[0]->getRegion());
|
|
return $address;
|
|
}
|
|
|
|
/**
|
|
* Helper function that returns an Address Data Object that matches the data from customer_two_address fixture
|
|
*
|
|
* @return \Magento\Customer\Api\Data\AddressInterface
|
|
*/
|
|
private function _createSecondAddress()
|
|
{
|
|
$address = $this->_addressFactory->create();
|
|
$this->dataObjectHelper->mergeDataObjects(
|
|
\Magento\Customer\Api\Data\AddressInterface::class,
|
|
$address,
|
|
$this->_expectedAddresses[1]
|
|
);
|
|
$address->setId(null);
|
|
$address->setRegion($this->_expectedAddresses[1]->getRegion());
|
|
return $address;
|
|
}
|
|
}
|