901 lines
33 KiB
PHP
Executable File
901 lines
33 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 as Customer;
|
|
use Magento\Customer\Model\AccountManagement;
|
|
use Magento\Framework\App\Config\ScopeConfigInterface;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\Exception\InputException;
|
|
use Magento\Framework\Webapi\Exception as HTTPExceptionCodes;
|
|
use Magento\Newsletter\Model\Subscriber;
|
|
use Magento\Security\Model\Config;
|
|
use Magento\Store\Model\ScopeInterface;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\TestFramework\Helper\Customer as CustomerHelper;
|
|
use Magento\TestFramework\TestCase\WebapiAbstract;
|
|
|
|
/**
|
|
* Test class for Magento\Customer\Api\AccountManagementInterface
|
|
*
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class AccountManagementTest extends WebapiAbstract
|
|
{
|
|
public const SERVICE_VERSION = 'V1';
|
|
public const SERVICE_NAME = 'customerAccountManagementV1';
|
|
public const RESOURCE_PATH = '/V1/customers';
|
|
|
|
/**
|
|
* Sample values for testing
|
|
*/
|
|
public const ATTRIBUTE_CODE = 'attribute_code';
|
|
public const ATTRIBUTE_VALUE = 'attribute_value';
|
|
|
|
/**
|
|
* @var ObjectManager
|
|
*/
|
|
private $objectManager;
|
|
|
|
/**
|
|
* @var AccountManagementInterface
|
|
*/
|
|
private $accountManagement;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\SearchCriteriaBuilder
|
|
*/
|
|
private $searchCriteriaBuilder;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\SortOrderBuilder
|
|
*/
|
|
private $sortOrderBuilder;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\Search\FilterGroupBuilder
|
|
*/
|
|
private $filterGroupBuilder;
|
|
|
|
/**
|
|
* @var CustomerHelper
|
|
*/
|
|
private $customerHelper;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
private $currentCustomerId;
|
|
|
|
/** @var Subscriber */
|
|
private $subscriber;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Reflection\DataObjectProcessor
|
|
*/
|
|
private $dataObjectProcessor;
|
|
|
|
/**
|
|
* @var \Magento\Config\Model\Config
|
|
*/
|
|
private $config;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $configValue;
|
|
|
|
/**
|
|
* Execute per test initialization.
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
$this->objectManager = Bootstrap::getObjectManager();
|
|
|
|
$this->accountManagement = Bootstrap::getObjectManager()->get(
|
|
\Magento\Customer\Api\AccountManagementInterface::class
|
|
);
|
|
$this->searchCriteriaBuilder = Bootstrap::getObjectManager()->create(
|
|
\Magento\Framework\Api\SearchCriteriaBuilder::class
|
|
);
|
|
$this->sortOrderBuilder = Bootstrap::getObjectManager()->create(
|
|
\Magento\Framework\Api\SortOrderBuilder::class
|
|
);
|
|
$this->filterGroupBuilder = Bootstrap::getObjectManager()->create(
|
|
\Magento\Framework\Api\Search\FilterGroupBuilder::class
|
|
);
|
|
$this->customerHelper = new CustomerHelper();
|
|
|
|
$this->dataObjectProcessor = Bootstrap::getObjectManager()->create(
|
|
\Magento\Framework\Reflection\DataObjectProcessor::class
|
|
);
|
|
$this->config = Bootstrap::getObjectManager()->create(
|
|
\Magento\Config\Model\Config::class
|
|
);
|
|
$this->initSubscriber();
|
|
|
|
if ($this->config->getConfigDataValue(
|
|
Config::XML_PATH_FRONTEND_AREA .
|
|
Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE
|
|
) != 0) {
|
|
$this->configValue = $this->config
|
|
->getConfigDataValue(
|
|
Config::XML_PATH_FRONTEND_AREA .
|
|
Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE
|
|
);
|
|
$this->config->setDataByPath(
|
|
Config::XML_PATH_FRONTEND_AREA . Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE,
|
|
0
|
|
);
|
|
$this->config->save();
|
|
}
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
if (!empty($this->currentCustomerId)) {
|
|
foreach ($this->currentCustomerId as $customerId) {
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/' . $customerId,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
|
|
],
|
|
'soap' => [
|
|
'service' => CustomerRepositoryTest::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => CustomerRepositoryTest::SERVICE_NAME . 'DeleteById',
|
|
],
|
|
];
|
|
|
|
$response = $this->_webApiCall($serviceInfo, ['customerId' => $customerId]);
|
|
|
|
$this->assertTrue($response);
|
|
}
|
|
}
|
|
$this->config->setDataByPath(
|
|
Config::XML_PATH_FRONTEND_AREA . Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE,
|
|
$this->configValue
|
|
);
|
|
$this->config->save();
|
|
$this->accountManagement = null;
|
|
$this->subscriber = null;
|
|
}
|
|
|
|
private function initSubscriber()
|
|
{
|
|
$this->subscriber = Bootstrap::getObjectManager()->create(
|
|
\Magento\Newsletter\Model\Subscriber::class
|
|
);
|
|
}
|
|
|
|
public function testCreateCustomer()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
$this->assertNotNull($customerData['id']);
|
|
}
|
|
|
|
public function testCreateCustomerWithErrors()
|
|
{
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, ],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'CreateAccount',
|
|
],
|
|
];
|
|
|
|
$customerDataArray = $this->dataObjectProcessor->buildOutputDataArray(
|
|
$this->customerHelper->createSampleCustomerDataObject(),
|
|
\Magento\Customer\Api\Data\CustomerInterface::class
|
|
);
|
|
$invalidEmail = 'invalid';
|
|
$customerDataArray['email'] = $invalidEmail;
|
|
$requestData = ['customer' => $customerDataArray, 'password' => CustomerHelper::PASSWORD];
|
|
try {
|
|
$this->_webApiCall($serviceInfo, $requestData);
|
|
$this->fail('Expected exception did not occur.');
|
|
} catch (\Exception $e) {
|
|
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
|
|
$expectedException = new InputException();
|
|
$expectedException->addError(__('"Email" is not a valid email address.'));
|
|
$this->assertInstanceOf('SoapFault', $e);
|
|
$this->checkSoapFault(
|
|
$e,
|
|
$expectedException->getRawMessage(),
|
|
'env:Sender',
|
|
$expectedException->getParameters() // expected error parameters
|
|
);
|
|
} else {
|
|
$this->assertEquals(HTTPExceptionCodes::HTTP_BAD_REQUEST, $e->getCode());
|
|
$exceptionData = $this->processRestExceptionResult($e);
|
|
$expectedExceptionData = [
|
|
'message' => '"Email" is not a valid email address.',
|
|
];
|
|
$this->assertEquals($expectedExceptionData, $exceptionData);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function testCreateCustomerWithoutOptionalFields()
|
|
{
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, ],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'CreateAccount',
|
|
],
|
|
];
|
|
|
|
$customerDataArray = $this->dataObjectProcessor->buildOutputDataArray(
|
|
$this->customerHelper->createSampleCustomerDataObject(),
|
|
\Magento\Customer\Api\Data\CustomerInterface::class
|
|
);
|
|
unset($customerDataArray['store_id']);
|
|
unset($customerDataArray['website_id']);
|
|
$requestData = ['customer' => $customerDataArray, 'password' => CustomerHelper::PASSWORD];
|
|
try {
|
|
$customerData = $this->_webApiCall($serviceInfo, $requestData, null, 'all');
|
|
$this->assertNotNull($customerData['id']);
|
|
} catch (\Exception $e) {
|
|
$this->fail('Customer should be created without optional fields.');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test customer activation when it is required
|
|
*
|
|
* @magentoConfigFixture default_store customer/create_account/confirm 0
|
|
*/
|
|
public function testActivateCustomer()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
|
|
// Update the customer's confirmation key to a known value
|
|
$customerData = $this->customerHelper->updateSampleCustomer(
|
|
$customerData[Customer::ID],
|
|
[
|
|
'id' => $customerData[Customer::ID],
|
|
'confirmation' => CustomerHelper::CONFIRMATION
|
|
]
|
|
);
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/' . $customerData[Customer::EMAIL] . '/activate',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'Activate',
|
|
],
|
|
];
|
|
|
|
$requestData = [
|
|
'email' => $customerData[Customer::EMAIL],
|
|
'confirmationKey' => CustomerHelper::CONFIRMATION
|
|
];
|
|
|
|
try {
|
|
$result = $this->_webApiCall($serviceInfo, $requestData);
|
|
$this->assertEquals($customerData[Customer::ID], $result[Customer::ID], 'Wrong customer!');
|
|
} catch (\Exception $e) {
|
|
$this->fail('Customer is not activated.');
|
|
}
|
|
}
|
|
|
|
public function testGetCustomerActivateCustomer()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/' . $customerData[Customer::EMAIL] . '/activate',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'Activate',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'email' => $customerData[Customer::EMAIL],
|
|
'confirmationKey' => CustomerHelper::CONFIRMATION
|
|
];
|
|
|
|
try {
|
|
$customerResponseData = $this->_webApiCall($serviceInfo, $requestData);
|
|
$this->assertEquals($customerData[Customer::ID], $customerResponseData[Customer::ID]);
|
|
} catch (\Exception $e) {
|
|
$this->fail('Customer is not activated.');
|
|
}
|
|
}
|
|
|
|
public function testValidateResetPasswordLinkToken()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
/** @var \Magento\Customer\Model\Customer $customerModel */
|
|
$customerModel = Bootstrap::getObjectManager()->create(\Magento\Customer\Model\CustomerFactory::class)
|
|
->create();
|
|
$customerModel->load($customerData[Customer::ID]);
|
|
$rpToken = 'lsdj579slkj5987slkj595lkj';
|
|
$customerModel->setRpToken('lsdj579slkj5987slkj595lkj');
|
|
$customerModel->setRpTokenCreatedAt(date('Y-m-d H:i:s'));
|
|
$customerModel->save();
|
|
$path = self::RESOURCE_PATH . '/' . $customerData[Customer::ID] . '/password/resetLinkToken/' . $rpToken;
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => $path,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'ValidateResetPasswordLinkToken',
|
|
],
|
|
];
|
|
|
|
$this->_webApiCall(
|
|
$serviceInfo,
|
|
['customerId' => $customerData['id'], 'resetPasswordLinkToken' => $rpToken]
|
|
);
|
|
}
|
|
|
|
public function testValidateResetPasswordLinkTokenInvalidToken()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
$invalidToken = 'fjjkafjie';
|
|
$path = self::RESOURCE_PATH . '/' . $customerData[Customer::ID] . '/password/resetLinkToken/' . $invalidToken;
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => $path,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'ValidateResetPasswordLinkToken',
|
|
],
|
|
];
|
|
|
|
$expectedMessage = 'The password token is mismatched. Reset and try again.';
|
|
|
|
try {
|
|
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
|
|
$this->_webApiCall(
|
|
$serviceInfo,
|
|
['customerId' => $customerData['id'], 'resetPasswordLinkToken' => 'invalid']
|
|
);
|
|
} else {
|
|
$this->_webApiCall($serviceInfo);
|
|
}
|
|
$this->fail("Expected exception to be thrown.");
|
|
} catch (\SoapFault $e) {
|
|
$this->assertStringContainsString(
|
|
$expectedMessage,
|
|
$e->getMessage(),
|
|
"Exception message does not match"
|
|
);
|
|
} catch (\Exception $e) {
|
|
$errorObj = $this->processRestExceptionResult($e);
|
|
$this->assertEquals($expectedMessage, $errorObj['message']);
|
|
$this->assertEquals(HTTPExceptionCodes::HTTP_BAD_REQUEST, $e->getCode());
|
|
}
|
|
}
|
|
|
|
public function testInitiatePasswordMissingRequiredFields()
|
|
{
|
|
$this->_markTestAsRestOnly('Soap clients explicitly check for required fields based on WSDL.');
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/password',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
|
|
]
|
|
];
|
|
|
|
try {
|
|
$this->_webApiCall($serviceInfo);
|
|
} catch (\Exception $e) {
|
|
$this->assertEquals(\Magento\Framework\Webapi\Exception::HTTP_BAD_REQUEST, $e->getCode());
|
|
$exceptionData = $this->processRestExceptionResult($e);
|
|
$expectedExceptionData = [
|
|
'message' => 'One or more input exceptions have occurred.',
|
|
'errors' => [
|
|
[
|
|
'message' => '"%fieldName" is required. Enter and try again.',
|
|
'parameters' => [
|
|
'fieldName' => 'email',
|
|
],
|
|
],
|
|
[
|
|
'message' => '"%fieldName" is required. Enter and try again.',
|
|
'parameters' => [
|
|
'fieldName' => 'template',
|
|
]
|
|
],
|
|
],
|
|
];
|
|
$this->assertEquals($expectedExceptionData, $exceptionData);
|
|
}
|
|
}
|
|
|
|
public function testInitiatePasswordReset()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/password',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'InitiatePasswordReset',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'email' => $customerData[Customer::EMAIL],
|
|
'template' => AccountManagement::EMAIL_RESET,
|
|
'websiteId' => $customerData[Customer::WEBSITE_ID],
|
|
];
|
|
// This api doesn't return any response.
|
|
// No exception or response means the request was processed successfully.
|
|
// The webapi framework does not return the header information as yet. A check for HTTP 200 would be ideal here
|
|
$this->_webApiCall($serviceInfo, $requestData);
|
|
}
|
|
|
|
public function testSendPasswordResetLinkBadEmailOrWebsite()
|
|
{
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/password',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'InitiatePasswordReset',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'email' => 'dummy@example.com',
|
|
'template' => AccountManagement::EMAIL_RESET,
|
|
'websiteId' => 0,
|
|
];
|
|
try {
|
|
$this->_webApiCall($serviceInfo, $requestData);
|
|
} catch (\Exception $e) {
|
|
$expectedErrorParameters =
|
|
[
|
|
'fieldName' => 'email',
|
|
'fieldValue' => 'dummy@example.com',
|
|
'field2Name' => 'websiteId',
|
|
'field2Value' => 0,
|
|
];
|
|
|
|
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_REST) {
|
|
$errorObj = $this->processRestExceptionResult($e);
|
|
$this->assertEquals(
|
|
'No such entity with %fieldName = %fieldValue, %field2Name = %field2Value',
|
|
$errorObj['message']
|
|
);
|
|
$this->assertEquals($expectedErrorParameters, $errorObj['parameters']);
|
|
$this->assertEquals(HTTPExceptionCodes::HTTP_NOT_FOUND, $e->getCode());
|
|
} else {
|
|
$this->assertInstanceOf('SoapFault', $e);
|
|
$this->checkSoapFault(
|
|
$e,
|
|
'No such entity with %fieldName = %fieldValue, %field2Name = %field2Value',
|
|
'env:Sender',
|
|
$expectedErrorParameters
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function testGetConfirmationStatus()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/' . $customerData[Customer::ID] . '/confirm',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'GetConfirmationStatus',
|
|
],
|
|
];
|
|
|
|
$confirmationResponse = $this->_webApiCall($serviceInfo, ['customerId' => $customerData['id']]);
|
|
|
|
$this->assertEquals(AccountManagement::ACCOUNT_CONFIRMATION_NOT_REQUIRED, $confirmationResponse);
|
|
}
|
|
|
|
public function testResendConfirmation()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/confirm',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'ResendConfirmation',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'email' => $customerData[Customer::EMAIL],
|
|
'websiteId' => $customerData[Customer::WEBSITE_ID],
|
|
];
|
|
// This api doesn't return any response.
|
|
// No exception or response means the request was processed successfully.
|
|
// The webapi framework does not return the header information as yet. A check for HTTP 200 would be ideal here
|
|
$this->_webApiCall($serviceInfo, $requestData);
|
|
}
|
|
|
|
public function testResendConfirmationBadEmailOrWebsite()
|
|
{
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/confirm',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'ResendConfirmation',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'email' => 'dummy@example.com',
|
|
'websiteId' => 0,
|
|
];
|
|
try {
|
|
$this->_webApiCall($serviceInfo, $requestData);
|
|
} catch (\Exception $e) {
|
|
$expectedErrorParameters =
|
|
[
|
|
'fieldName' => 'email',
|
|
'fieldValue' => 'dummy@example.com',
|
|
'field2Name' => 'websiteId',
|
|
'field2Value' => 0,
|
|
];
|
|
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_REST) {
|
|
$errorObj = $this->processRestExceptionResult($e);
|
|
$this->assertEquals(
|
|
'No such entity with %fieldName = %fieldValue, %field2Name = %field2Value',
|
|
$errorObj['message']
|
|
);
|
|
$this->assertEquals($expectedErrorParameters, $errorObj['parameters']);
|
|
$this->assertEquals(HTTPExceptionCodes::HTTP_NOT_FOUND, $e->getCode());
|
|
} else {
|
|
$this->assertInstanceOf('SoapFault', $e);
|
|
$this->checkSoapFault(
|
|
$e,
|
|
'No such entity with %fieldName = %fieldValue, %field2Name = %field2Value',
|
|
'env:Sender',
|
|
$expectedErrorParameters
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function testValidateCustomerData()
|
|
{
|
|
$customerData = $this->customerHelper->createSampleCustomerDataObject();
|
|
$customerData->setFirstname(null);
|
|
$customerData->setLastname(null);
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/validate',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'Validate',
|
|
],
|
|
];
|
|
$customerData = $this->dataObjectProcessor->buildOutputDataArray(
|
|
$customerData,
|
|
\Magento\Customer\Api\Data\CustomerInterface::class
|
|
);
|
|
$requestData = ['customer' => $customerData];
|
|
$validationResponse = $this->_webApiCall($serviceInfo, $requestData);
|
|
$this->assertFalse($validationResponse['valid']);
|
|
|
|
$this->assertEquals(
|
|
'The "First Name" attribute value is empty. Set the attribute and try again.',
|
|
$validationResponse['messages'][0]
|
|
);
|
|
$this->assertEquals(
|
|
'The "Last Name" attribute value is empty. Set the attribute and try again.',
|
|
$validationResponse['messages'][1]
|
|
);
|
|
}
|
|
|
|
public function testIsReadonly()
|
|
{
|
|
$customerData = $this->_createCustomer();
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/' . $customerData[Customer::ID] . '/permissions/readonly',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'IsReadonly',
|
|
],
|
|
];
|
|
|
|
$response = $this->_webApiCall($serviceInfo, ['customerId' => $customerData['id']]);
|
|
|
|
$this->assertFalse($response);
|
|
}
|
|
|
|
public function testEmailAvailable()
|
|
{
|
|
$config = $this->objectManager->get(ScopeConfigInterface::class);
|
|
|
|
$customerData = $this->_createCustomer();
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/isEmailAvailable',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'IsEmailAvailable',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'customerEmail' => $customerData[Customer::EMAIL],
|
|
'websiteId' => $customerData[Customer::WEBSITE_ID],
|
|
];
|
|
|
|
$emailSetting = $config->getValue(
|
|
AccountManagement::GUEST_CHECKOUT_LOGIN_OPTION_SYS_CONFIG,
|
|
ScopeInterface::SCOPE_WEBSITE,
|
|
$customerData[Customer::WEBSITE_ID]
|
|
);
|
|
|
|
if (!$emailSetting) {
|
|
$this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
|
|
} else {
|
|
$this->assertFalse($this->_webApiCall($serviceInfo, $requestData));
|
|
}
|
|
}
|
|
|
|
public function testEmailAvailableInvalidEmail()
|
|
{
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/isEmailAvailable',
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'IsEmailAvailable',
|
|
],
|
|
];
|
|
$requestData = [
|
|
'customerEmail' => 'invalid',
|
|
'websiteId' => 0,
|
|
];
|
|
$this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
|
|
}
|
|
|
|
/**
|
|
* @magentoApiDataFixture Magento/Customer/_files/attribute_user_defined_address.php
|
|
* @magentoApiDataFixture Magento/Customer/_files/attribute_user_defined_customer.php
|
|
*/
|
|
public function testCustomAttributes()
|
|
{
|
|
//Sample customer data comes with the disable_auto_group_change custom attribute
|
|
$customerData = $this->customerHelper->createSampleCustomerDataObject();
|
|
//address attribute code from fixture
|
|
$fixtureAddressAttributeCode = 'address_user_attribute';
|
|
//customer attribute code from fixture
|
|
$fixtureCustomerAttributeCode = 'user_attribute';
|
|
//Custom Attribute Values
|
|
$address1CustomAttributeValue = 'value1';
|
|
$address2CustomAttributeValue = 'value2';
|
|
$customerCustomAttributeValue = 'value3';
|
|
|
|
$addresses = $customerData->getAddresses();
|
|
$addresses[0]->setCustomAttribute($fixtureAddressAttributeCode, $address1CustomAttributeValue);
|
|
$addresses[1]->setCustomAttribute($fixtureAddressAttributeCode, $address2CustomAttributeValue);
|
|
$customerData->setAddresses($addresses);
|
|
$customerData->setCustomAttribute($fixtureCustomerAttributeCode, $customerCustomAttributeValue);
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'CreateAccount',
|
|
],
|
|
];
|
|
|
|
$customerDataArray = $this->dataObjectProcessor->buildOutputDataArray(
|
|
$customerData,
|
|
\Magento\Customer\Api\Data\CustomerInterface::class
|
|
);
|
|
$requestData = ['customer' => $customerDataArray, 'password' => CustomerHelper::PASSWORD];
|
|
$customerData = $this->_webApiCall($serviceInfo, $requestData);
|
|
$customerId = $customerData['id'];
|
|
//TODO: Fix assertions to verify custom attributes
|
|
$this->assertNotNull($customerData);
|
|
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . '/' . $customerId ,
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
|
|
],
|
|
'soap' => [
|
|
'service' => CustomerRepositoryTest::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => CustomerRepositoryTest::SERVICE_NAME . 'DeleteById',
|
|
],
|
|
];
|
|
|
|
$response = $this->_webApiCall($serviceInfo, ['customerId' => $customerId]);
|
|
$this->assertTrue($response);
|
|
}
|
|
|
|
/**
|
|
* @magentoApiDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoApiDataFixture Magento/Customer/_files/customer_two_addresses.php
|
|
*/
|
|
public function testGetDefaultBillingAddress()
|
|
{
|
|
$fixtureCustomerId = 1;
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . "/$fixtureCustomerId/billingAddress",
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'GetDefaultBillingAddress',
|
|
],
|
|
];
|
|
$requestData = ['customerId' => $fixtureCustomerId];
|
|
$addressData = $this->_webApiCall($serviceInfo, $requestData);
|
|
$this->assertEquals(
|
|
$this->getFirstFixtureAddressData(),
|
|
$addressData,
|
|
"Default billing address data is invalid."
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @magentoApiDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoApiDataFixture Magento/Customer/_files/customer_two_addresses.php
|
|
*/
|
|
public function testGetDefaultShippingAddress()
|
|
{
|
|
$fixtureCustomerId = 1;
|
|
$serviceInfo = [
|
|
'rest' => [
|
|
'resourcePath' => self::RESOURCE_PATH . "/$fixtureCustomerId/shippingAddress",
|
|
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
|
],
|
|
'soap' => [
|
|
'service' => self::SERVICE_NAME,
|
|
'serviceVersion' => self::SERVICE_VERSION,
|
|
'operation' => self::SERVICE_NAME . 'GetDefaultShippingAddress',
|
|
],
|
|
];
|
|
$requestData = ['customerId' => $fixtureCustomerId];
|
|
$addressData = $this->_webApiCall($serviceInfo, $requestData);
|
|
$this->assertEquals(
|
|
$this->getFirstFixtureAddressData(),
|
|
$addressData,
|
|
"Default shipping address data is invalid."
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @return array|bool|float|int|string
|
|
*/
|
|
protected function _createCustomer()
|
|
{
|
|
$customerData = $this->customerHelper->createSampleCustomer();
|
|
$this->currentCustomerId[] = $customerData['id'];
|
|
return $customerData;
|
|
}
|
|
|
|
/**
|
|
* 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,
|
|
];
|
|
}
|
|
|
|
public function testCreateCustomerWithSubscription()
|
|
{
|
|
$customerData = $this->customerHelper->createSampleCustomer(
|
|
["extension_attributes" => ["is_subscribed" => true]]
|
|
);
|
|
|
|
$this->assertNotNull($customerData['id']);
|
|
|
|
$this->subscriber->loadByCustomerId($customerData['id']);
|
|
|
|
$this->assertNotNull($this->subscriber->getId());
|
|
$this->assertEquals($customerData['id'], $this->subscriber->getCustomerId());
|
|
}
|
|
|
|
public function testUnsubscribeCustomer()
|
|
{
|
|
//Creating customer and subscribe
|
|
$customerData = $this->customerHelper->createSampleCustomer(
|
|
["extension_attributes" => ["is_subscribed" => true]]
|
|
);
|
|
$this->assertNotNull($customerData['id']);
|
|
|
|
$this->subscriber->loadByCustomerId($customerData['id']);
|
|
$subscriptionId = $this->subscriber->getId();
|
|
|
|
$this->assertNotNull($subscriptionId);
|
|
$this->assertEquals($customerData['id'], $this->subscriber->getCustomerId());
|
|
//Manage customer in order to unsubscribe
|
|
$this->customerHelper->updateSampleCustomer(
|
|
$customerData["id"],
|
|
array_merge(
|
|
$customerData,
|
|
["extension_attributes" => ["is_subscribed" => false]]
|
|
)
|
|
);
|
|
$this->initSubscriber();
|
|
|
|
$this->subscriber->loadByCustomerId($customerData['id']);
|
|
$this->assertEquals(Subscriber::STATUS_UNSUBSCRIBED, $this->subscriber->getStatus());
|
|
}
|
|
}
|