magento2-docker/dev/tests/integration/testsuite/Magento/Customer/Api/AddressRepositoryTest.php

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;
}
}