magento2-docker/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementMeTest.php

416 lines
14 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Customer\Api;
use Magento\Customer\Api\Data\CustomerInterface;
use Magento\Customer\Model\CustomerRegistry;
use Magento\Integration\Api\CustomerTokenServiceInterface;
use Magento\Integration\Model\Oauth\Token as TokenModel;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\Helper\Customer as CustomerHelper;
/**
* Class AccountManagementMeTest
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @magentoApiDataFixture Magento/Customer/_files/customer.php
* @magentoApiDataFixture Magento/Customer/_files/customer_two_addresses.php
*/
class AccountManagementMeTest extends \Magento\TestFramework\TestCase\WebapiAbstract
{
const RESOURCE_PATH = '/V1/customers/me';
const RESOURCE_PATH_CUSTOMER_TOKEN = "/V1/integration/customer/token";
const REPO_SERVICE = 'customerCustomerRepositoryV1';
const ACCOUNT_SERVICE = 'customerAccountManagementV1';
const SERVICE_VERSION = 'V1';
/**
* @var CustomerRepositoryInterface
*/
private $customerRepository;
/**
* @var AccountManagementInterface
*/
private $customerAccountManagement;
/**
* @var CustomerRegistry
*/
private $customerRegistry;
/**
* @var CustomerHelper
*/
private $customerHelper;
/**
* @var TokenModel
*/
private $token;
/**
* @var CustomerInterface
*/
private $customerData;
/**
* @var \Magento\Framework\Reflection\DataObjectProcessor
*/
private $dataObjectProcessor;
/**
* @var CustomerTokenServiceInterface
*/
private $tokenService;
/**
* Execute per test initialization.
*/
protected function setUp(): void
{
$this->customerRegistry = Bootstrap::getObjectManager()->get(
\Magento\Customer\Model\CustomerRegistry::class
);
$this->customerRepository = Bootstrap::getObjectManager()->get(
\Magento\Customer\Api\CustomerRepositoryInterface::class,
['customerRegistry' => $this->customerRegistry]
);
$this->customerAccountManagement = Bootstrap::getObjectManager()
->get(\Magento\Customer\Api\AccountManagementInterface::class);
$this->customerHelper = new CustomerHelper();
$this->customerData = $this->customerHelper->createSampleCustomer();
$this->tokenService = Bootstrap::getObjectManager()->get(CustomerTokenServiceInterface::class);
// get token
$this->resetTokenForCustomerSampleData();
$this->dataObjectProcessor = Bootstrap::getObjectManager()->create(
\Magento\Framework\Reflection\DataObjectProcessor::class
);
}
/**
* Ensure that fixture customer and his addresses are deleted.
*/
protected function tearDown(): void
{
$this->customerRepository = null;
/** @var \Magento\Framework\Registry $registry */
$registry = Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', true);
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
parent::tearDown();
}
public function testChangePassword()
{
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . '/password',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
'token' => $this->token,
],
'soap' => [
'service' => self::ACCOUNT_SERVICE,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::ACCOUNT_SERVICE .'ChangePasswordById',
'token' => $this->token
]
];
$requestData = ['currentPassword' => 'test@123', 'newPassword' => '123@test'];
if (TESTS_WEB_API_ADAPTER === 'soap') {
$requestData['customerId'] = 0;
}
$this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
$customerResponseData = $this->customerAccountManagement
->authenticate($this->customerData[CustomerInterface::EMAIL], '123@test');
$this->assertEquals($this->customerData[CustomerInterface::ID], $customerResponseData->getId());
}
public function testUpdateCustomer()
{
$customerData = $this->_getCustomerData($this->customerData[CustomerInterface::ID]);
$lastName = $customerData->getLastname();
$updatedCustomerData = $this->dataObjectProcessor->buildOutputDataArray(
$customerData,
\Magento\Customer\Api\Data\CustomerInterface::class
);
$updatedCustomerData[CustomerInterface::LASTNAME] = $lastName . 'Updated';
$updatedCustomerData[CustomerInterface::ID] = 25;
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
'token' => $this->token,
],
'soap' => [
'service' => self::REPO_SERVICE,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::REPO_SERVICE .'SaveSelf',
'token' => $this->token
]
];
$requestData = ['customer' => $updatedCustomerData];
$response = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals($lastName . "Updated", $response[CustomerInterface::LASTNAME]);
$customerData = $this->_getCustomerData($this->customerData[CustomerInterface::ID]);
$this->assertEquals($lastName . "Updated", $customerData->getLastname());
}
public function testGetCustomerData()
{
//Get expected details from the Service directly
$customerData = $this->_getCustomerData($this->customerData[CustomerInterface::ID]);
$expectedCustomerDetails = $this->dataObjectProcessor->buildOutputDataArray(
$customerData,
\Magento\Customer\Api\Data\CustomerInterface::class
);
$expectedCustomerDetails['addresses'][0]['id'] =
(int)$expectedCustomerDetails['addresses'][0]['id'];
$expectedCustomerDetails['addresses'][1]['id'] =
(int)$expectedCustomerDetails['addresses'][1]['id'];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
'token' => $this->token,
],
'soap' => [
'service' => self::REPO_SERVICE,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::REPO_SERVICE .'GetSelf',
'token' => $this->token
]
];
$arguments = [];
if (TESTS_WEB_API_ADAPTER === 'soap') {
$arguments['customerId'] = 0;
}
$customerDetailsResponse = $this->_webApiCall($serviceInfo, $arguments);
unset($expectedCustomerDetails['custom_attributes']);
unset($customerDetailsResponse['custom_attributes']); //for REST
$this->assertEquals($expectedCustomerDetails, $customerDetailsResponse);
}
public function testGetCustomerActivateCustomer()
{
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . '/activate',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
'token' => $this->token,
],
'soap' => [
'service' => self::ACCOUNT_SERVICE,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::ACCOUNT_SERVICE .'ActivateById',
'token' => $this->token
]
];
$requestData = ['confirmationKey' => CustomerHelper::CONFIRMATION];
if (TESTS_WEB_API_ADAPTER === 'soap') {
$requestData['customerId'] = 0;
}
try {
$customerResponseData = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(
$this->customerData[CustomerInterface::ID],
$customerResponseData[CustomerInterface::ID]
);
} catch (\Exception $e) {
$this->fail('Customer is not activated.');
}
}
/**
* Return the customer details.
*
* @param int $customerId
* @return \Magento\Customer\Api\Data\CustomerInterface
*/
protected function _getCustomerData($customerId)
{
$data = $this->customerRepository->getById($customerId);
$this->customerRegistry->remove($customerId);
return $data;
}
public function testGetDefaultBillingAddress()
{
$this->resetTokenForCustomerFixture();
$fixtureCustomerId = 1;
$serviceInfo = [
'rest' => [
'resourcePath' => "/V1/customers/me/billingAddress",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
'token' => $this->token,
],
'soap' => [
'service' => self::ACCOUNT_SERVICE,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::ACCOUNT_SERVICE .'GetMyDefaultBillingAddress',
'token' => $this->token
]
];
$requestData = ['customerId' => $fixtureCustomerId];
$addressData = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(
$this->getFirstFixtureAddressData(),
$addressData,
"Default billing address data is invalid."
);
}
public function testGetDefaultShippingAddress()
{
$this->resetTokenForCustomerFixture();
$fixtureCustomerId = 1;
$serviceInfo = [
'rest' => [
'resourcePath' => "/V1/customers/me/shippingAddress",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
'token' => $this->token,
],
'soap' => [
'service' => self::ACCOUNT_SERVICE,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::ACCOUNT_SERVICE .'GetMyDefaultShippingAddress',
'token' => $this->token
]
];
$requestData = ['customerId' => $fixtureCustomerId];
$addressData = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(
$this->getFirstFixtureAddressData(),
$addressData,
"Default shipping address data is invalid."
);
}
/**
* Retrieve data of the first fixture address.
*
* @return array
*/
protected function getFirstFixtureAddressData()
{
return [
'firstname' => 'John',
'lastname' => 'Smith',
'city' => 'CityM',
'country_id' => 'US',
'company' => 'CompanyName',
'postcode' => '75477',
'telephone' => '3468676',
'street' => ['Green str, 67'],
'id' => 1,
'default_billing' => true,
'default_shipping' => true,
'customer_id' => '1',
'region' => ['region' => 'Alabama', 'region_id' => 1, 'region_code' => 'AL'],
'region_id' => 1,
];
}
/**
* Retrieve data of the second fixture address.
*
* @return array
*/
protected function getSecondFixtureAddressData()
{
return [
'firstname' => 'John',
'lastname' => 'Smith',
'city' => 'CityX',
'country_id' => 'US',
'postcode' => '47676',
'telephone' => '3234676',
'street' => ['Black str, 48'],
'id' => 2,
'default_billing' => false,
'default_shipping' => false,
'customer_id' => '1',
'region' => ['region' => 'Alabama', 'region_id' => 1, 'region_code' => 'AL'],
'region_id' => 1,
];
}
/**
* Sets the test's access token for the customer fixture
*/
protected function resetTokenForCustomerFixture()
{
$this->resetTokenForCustomer('customer@example.com', 'password');
}
/**
* Sets the test's access token for the created customer sample data
*/
protected function resetTokenForCustomerSampleData()
{
$this->resetTokenForCustomer($this->customerData[CustomerInterface::EMAIL], 'test@123');
}
/**
* Sets the test's access token for a particular username and password.
*
* @param string $username
* @param string $password
*/
protected function resetTokenForCustomer($username, $password)
{
$this->token = $this->tokenService->createCustomerAccessToken($username, $password);
$this->customerRegistry->remove($this->customerRepository->get($username)->getId());
}
/**
* @magentoApiDataFixture Magento/Customer/_files/customer_one_address.php
*/
public function testGetOtherCustomerInfo()
{
$this->_markTestAsRestOnly();
$serviceInfo = [
'rest' => [
'resourcePath' => "/V1/customers/me?customerId=1",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
'token' => $this->token,
]
];
$requestData = ['customer' => ["id" => "-1", "Id" => "1"]];
try {
$this->_webApiCall($serviceInfo, $requestData);
} catch (\Throwable $exception) {
if ($restResponse = json_decode($exception->getMessage(), true)) {
$exceptionMessage = $restResponse['message'];
}
}
$this->assertEquals('The customer email is missing. Enter and try again.', $exceptionMessage);
}
}