40 private $customerRepository;
45 private $dataObjectHelper;
50 private $customerDataFactory;
55 private $searchCriteriaBuilder;
60 private $sortOrderBuilder;
65 private $filterGroupBuilder;
70 private $customerRegistry;
75 private $customerHelper;
80 private $currentCustomerId;
85 private $dataObjectProcessor;
93 \
Magento\Customer\Model\CustomerRegistry::class
97 \
Magento\Customer\Api\CustomerRepositoryInterface::class,
98 [
'customerRegistry' => $this->customerRegistry]
101 \
Magento\Framework\Api\DataObjectHelper::class
104 \
Magento\Customer\Api\Data\CustomerInterfaceFactory::class
107 \
Magento\Framework\Api\SearchCriteriaBuilder::class
110 \
Magento\Framework\Api\SortOrderBuilder::class
113 \
Magento\Framework\Api\Search\FilterGroupBuilder::class
115 $this->customerHelper =
new CustomerHelper();
118 \
Magento\Framework\Reflection\DataObjectProcessor::class
124 if (!empty($this->currentCustomerId)) {
125 foreach ($this->currentCustomerId as
$customerId) {
128 'resourcePath' => self::RESOURCE_PATH .
'/' .
$customerId,
134 'operation' => self::SERVICE_NAME .
'DeleteById',
143 $this->customerRepository =
null;
152 public function testInvalidCustomerUpdate()
163 \
Magento\Integration\Api\CustomerTokenServiceInterface::class
165 $token = $customerTokenService->createCustomerAccessToken($firstCustomerData[Customer::EMAIL],
'test@123');
170 $lastName = $existingCustomerDataObject->getLastname();
172 $newCustomerDataObject = $this->customerDataFactory->create();
173 $this->dataObjectHelper->populateWithArray(
174 $newCustomerDataObject,
176 \
Magento\Customer\Api\Data\CustomerInterface::class
181 'resourcePath' => self::RESOURCE_PATH .
"/{$customerData[Customer::ID]}",
187 $newCustomerDataObject = $this->dataObjectProcessor->buildOutputDataArray(
188 $newCustomerDataObject,
189 \
Magento\Customer\Api\Data\CustomerInterface::class
198 $this->currentCustomerId = [];
202 'resourcePath' => self::RESOURCE_PATH .
'/' .
$customerData[Customer::ID],
208 'operation' => self::SERVICE_NAME .
'DeleteById',
211 if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
220 $this->expectException(\
Magento\Framework\Exception\NoSuchEntityException::class);
221 $this->expectExceptionMessage(sprintf(
"No such entity with customerId = %s",
$customerData[Customer::ID]));
230 'resourcePath' => self::RESOURCE_PATH .
'/' . $invalidId,
236 'operation' => self::SERVICE_NAME .
'DeleteById',
240 $expectedMessage =
'No such entity with %fieldName = %fieldValue';
243 $this->
_webApiCall($serviceInfo, [
'customerId' => $invalidId]);
245 $this->fail(
"Expected exception");
246 }
catch (\SoapFault $e) {
247 $this->assertContains(
250 "SoapFault does not contain expected message." 252 }
catch (\Exception $e) {
254 $this->assertEquals($expectedMessage, $errorObj[
'message']);
255 $this->assertEquals([
'fieldName' =>
'customerId',
'fieldValue' => $invalidId], $errorObj[
'parameters']);
256 $this->assertEquals(HTTPExceptionCodes::HTTP_NOT_FOUND, $e->getCode());
264 $lastName = $existingCustomerDataObject->getLastname();
266 $newCustomerDataObject = $this->customerDataFactory->create();
267 $this->dataObjectHelper->populateWithArray(
268 $newCustomerDataObject,
270 \
Magento\Customer\Api\Data\CustomerInterface::class
275 'resourcePath' => self::RESOURCE_PATH .
"/{$customerData[Customer::ID]}",
281 'operation' => self::SERVICE_NAME .
'Save',
284 $newCustomerDataObject = $this->dataObjectProcessor->buildOutputDataArray(
285 $newCustomerDataObject,
286 \
Magento\Customer\Api\Data\CustomerInterface::class
294 $this->assertEquals($lastName .
"Updated", $existingCustomerDataObject->getLastname());
302 $customerData = $this->customerHelper->createSampleCustomer();
304 $lastName = $existingCustomerDataObject->getLastname();
306 $newCustomerDataObject = $this->customerDataFactory->create();
307 $this->dataObjectHelper->populateWithArray(
308 $newCustomerDataObject,
310 \
Magento\Customer\Api\Data\CustomerInterface::class
315 'resourcePath' => self::RESOURCE_PATH .
"/{$customerData[Customer::ID]}",
321 'operation' => self::SERVICE_NAME .
'Save',
324 $newCustomerDataObject = $this->dataObjectProcessor->buildOutputDataArray(
325 $newCustomerDataObject,
326 \
Magento\Customer\Api\Data\CustomerInterface::class
328 unset($newCustomerDataObject[
'website_id']);
331 $expectedMessage =
'"Associate to Website" is a required value.';
334 $this->fail(
"Expected exception.");
335 }
catch (\SoapFault $e) {
336 $this->assertContains(
339 "SoapFault does not contain expected message." 341 }
catch (\Exception $e) {
342 $errorObj = $this->customerHelper->processRestExceptionResult($e);
343 $this->assertEquals($expectedMessage, $errorObj[
'message'],
'Invalid message: "' . $e->getMessage() .
'"');
344 $this->assertEquals(HTTPExceptionCodes::HTTP_BAD_REQUEST, $e->getCode());
352 $lastName = $existingCustomerDataObject->getLastname();
357 $newCustomerDataObject = $this->customerDataFactory->create();
358 $this->dataObjectHelper->populateWithArray(
359 $newCustomerDataObject,
361 \
Magento\Customer\Api\Data\CustomerInterface::class
366 'resourcePath' => self::RESOURCE_PATH .
"/-1",
372 'operation' => self::SERVICE_NAME .
'Save',
375 $newCustomerDataObject = $this->dataObjectProcessor->buildOutputDataArray(
376 $newCustomerDataObject,
377 \
Magento\Customer\Api\Data\CustomerInterface::class
381 $expectedMessage =
'No such entity with %fieldName = %fieldValue';
385 $this->fail(
"Expected exception.");
386 }
catch (\SoapFault $e) {
387 $this->assertContains(
390 "SoapFault does not contain expected message." 392 }
catch (\Exception $e) {
394 $this->assertEquals($expectedMessage, $errorObj[
'message']);
395 $this->assertEquals([
'fieldName' =>
'customerId',
'fieldValue' => -1], $errorObj[
'parameters']);
396 $this->assertEquals(HTTPExceptionCodes::HTTP_NOT_FOUND, $e->getCode());
405 $customerDataArray = $this->dataObjectProcessor->buildOutputDataArray(
406 $this->customerHelper->createSampleCustomerDataObject(),
407 \Magento\Customer\Api\Data\CustomerInterface::class
410 foreach ($customerDataArray[Customer::KEY_ADDRESSES] as &
$address) {
411 $address[Address::FIRSTNAME] =
null;
422 'operation' => self::SERVICE_NAME .
'Save',
428 $this->fail(
'Expected exception did not occur.');
429 }
catch (\Exception $e) {
430 if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
432 $expectedException->addError(
434 '"%fieldName" is required. Enter and try again.',
435 [
'fieldName' => Address::FIRSTNAME]
438 $this->assertInstanceOf(
'SoapFault', $e);
441 $expectedException->getRawMessage(),
443 $expectedException->getParameters()
446 $this->assertEquals(HTTPExceptionCodes::HTTP_BAD_REQUEST, $e->getCode());
448 $expectedExceptionData = [
449 'message' =>
'"%fieldName" is required. Enter and try again.',
450 'parameters' => [
'fieldName' => Address::FIRSTNAME],
452 $this->assertEquals($expectedExceptionData, $exceptionData);
457 $this->customerRegistry->retrieveByEmail(
458 $customerDataArray[Customer::EMAIL],
459 $customerDataArray[Customer::WEBSITE_ID]
461 $this->fail(
'An expected NoSuchEntityException was not thrown.');
465 $customerDataArray[Customer::EMAIL],
467 $customerDataArray[Customer::WEBSITE_ID]
470 $exception->getMessage(),
472 'Exception message does not match expected message.' 485 ->setField(Customer::EMAIL)
488 $this->searchCriteriaBuilder->addFilters([$filter]);
489 $searchData = $this->dataObjectProcessor->buildOutputDataArray(
490 $this->searchCriteriaBuilder->create(),
491 \Magento\Framework\Api\SearchCriteriaInterface::class
496 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
502 'operation' => self::SERVICE_NAME .
'getList',
506 $this->assertEquals(1, $searchResults[
'total_count']);
507 $this->assertEquals(
$customerData[Customer::ID], $searchResults[
'items'][0][Customer::ID]);
519 ->setField(Customer::EMAIL)
522 $this->searchCriteriaBuilder->addFilters([$filter]);
524 $searchData = $this->searchCriteriaBuilder->create()->__toArray();
529 'resourcePath' => self::RESOURCE_PATH .
'/search?' . $searchQueryString,
534 $this->assertEquals(1, $searchResults[
'total_count']);
535 $this->assertEquals(
$customerData[Customer::ID], $searchResults[
'items'][0][Customer::ID]);
543 $this->
_markTestAsRestOnly(
'Soap clients explicitly check for required fields based on WSDL.');
546 'resourcePath' => self::RESOURCE_PATH .
'/search',
552 }
catch (\Exception $e) {
553 $this->assertEquals(HTTPExceptionCodes::HTTP_BAD_REQUEST, $e->getCode());
555 $expectedExceptionData = [
556 'message' =>
'"%fieldName" is required. Enter and try again.',
558 'fieldName' =>
'searchCriteria' 561 $this->assertEquals($expectedExceptionData, $exceptionData);
568 public function testSearchCustomersMultipleFiltersWithSort()
573 $filter1 = $builder->setField(Customer::EMAIL)
574 ->setValue($customerData1[Customer::EMAIL])
576 $filter2 = $builder->setField(Customer::EMAIL)
577 ->setValue($customerData2[Customer::EMAIL])
579 $filter3 = $builder->setField(Customer::LASTNAME)
580 ->setValue($customerData1[Customer::LASTNAME])
582 $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
583 $this->searchCriteriaBuilder->addFilters([$filter3]);
587 \
Magento\Framework\Api\SortOrderBuilder::class
590 $sortOrder = $sortOrderBuilder->setField(Customer::EMAIL)->setDirection(
SortOrder::SORT_ASC)->create();
591 $this->searchCriteriaBuilder->setSortOrders([$sortOrder]);
598 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
604 'operation' => self::SERVICE_NAME .
'getList',
608 $this->assertEquals(2, $searchResults[
'total_count']);
609 $this->assertEquals($customerData1[Customer::ID], $searchResults[
'items'][0][Customer::ID]);
610 $this->assertEquals($customerData2[Customer::ID], $searchResults[
'items'][1][Customer::ID]);
622 $filter1 = $builder->setField(Customer::EMAIL)
623 ->setValue($customerData1[Customer::EMAIL])
625 $filter2 = $builder->setField(Customer::EMAIL)
626 ->setValue($customerData2[Customer::EMAIL])
628 $filter3 = $builder->setField(Customer::LASTNAME)
629 ->setValue($customerData1[Customer::LASTNAME])
631 $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
632 $this->searchCriteriaBuilder->addFilters([$filter3]);
640 'resourcePath' => self::RESOURCE_PATH .
'/search?' . $searchQueryString,
645 $this->assertEquals(2, $searchResults[
'total_count']);
646 $this->assertEquals($customerData1[Customer::ID], $searchResults[
'items'][0][Customer::ID]);
647 $this->assertEquals($customerData2[Customer::ID], $searchResults[
'items'][1][Customer::ID]);
658 $filter1 = $filter1 = $builder->setField(Customer::EMAIL)
659 ->setValue($customerData1[Customer::EMAIL])
661 $filter2 = $builder->setField(Customer::EMAIL)
662 ->setValue($customerData2[Customer::EMAIL])
664 $filter3 = $builder->setField(Customer::LASTNAME)
665 ->setValue(
'INVALID')
667 $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
668 $this->searchCriteriaBuilder->addFilters([$filter3]);
674 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
680 'operation' => self::SERVICE_NAME .
'getList',
684 $this->assertEquals(0, $searchResults[
'total_count'],
'No results expected for non-existent email.');
696 $filter1 = $filter1 = $builder->setField(Customer::EMAIL)
697 ->setValue($customerData1[Customer::EMAIL])
699 $filter2 = $builder->setField(Customer::EMAIL)
700 ->setValue($customerData2[Customer::EMAIL])
702 $filter3 = $builder->setField(Customer::LASTNAME)
703 ->setValue(
'INVALID')
705 $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
706 $this->searchCriteriaBuilder->addFilters([$filter3]);
713 'resourcePath' => self::RESOURCE_PATH .
'/search?' . $searchQueryString,
718 $this->assertEquals(0, $searchResults[
'total_count'],
'No results expected for non-existent email.');
724 public function testSearchCustomersMultipleFilterGroups()
730 $filter1 = $builder->setField(Customer::EMAIL)
731 ->setValue($customerData1[Customer::EMAIL])
733 $filter2 = $builder->setField(Customer::MIDDLENAME)
734 ->setValue($customerData1[Customer::MIDDLENAME])
736 $filter3 = $builder->setField(Customer::MIDDLENAME)
737 ->setValue(
'invalid')
739 $filter4 = $builder->setField(Customer::LASTNAME)
740 ->setValue($customerData1[Customer::LASTNAME])
743 $this->searchCriteriaBuilder->addFilters([$filter1]);
744 $this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
745 $this->searchCriteriaBuilder->addFilters([$filter4]);
746 $searchCriteria = $this->searchCriteriaBuilder->setCurrentPage(1)->setPageSize(10)->create();
751 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
757 'operation' => self::SERVICE_NAME .
'getList',
761 $this->assertEquals(1, $searchResults[
'total_count']);
762 $this->assertEquals($customerData1[Customer::ID], $searchResults[
'items'][0][Customer::ID]);
765 $filter4 = $builder->setField(Customer::LASTNAME)
766 ->setValue(
'invalid')
769 $this->searchCriteriaBuilder->addFilters([$filter1]);
770 $this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
771 $this->searchCriteriaBuilder->addFilters([$filter4]);
775 $serviceInfo[
'rest'][
'resourcePath'] = self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData);
777 $this->assertEquals(0, $searchResults[
'total_count']);
798 $customerData = $this->customerHelper->createSampleCustomer();
testUpdateCustomerNoWebsiteId()
_markTestAsRestOnly($message=null)
static doubleField($fieldName, $fieldValue, $secondFieldName, $secondFieldValue)
testSearchCustomersMultipleFiltersWithSortUsingGET()
_webApiCall( $serviceInfo, $arguments=[], $webApiAdapterCode=null, $storeCode=null, $integration=null)
testSearchCustomersUsingGET()
const RESOURCE_PATH_CUSTOMER_TOKEN
testCreateCustomerWithoutAddressRequiresException()
testSearchCustomersUsingGETEmptyFilter()
testSearchCustomersNonExistentMultipleFilters()
testSearchCustomersNonExistentMultipleFiltersGET()
checkSoapFault( $soapFault, $expectedMessage, $expectedFaultCode, $expectedErrorParams=[], $expectedWrappedErrors=[], $traceString=null)
_getCustomerData($customerId)
processRestExceptionResult(\Exception $e)
testDeleteCustomerInvalidCustomerId()
testUpdateCustomerException()
static getObjectManager()