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