416 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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);
 | 
						|
    }
 | 
						|
}
 |