Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CustomerRepositoryTest.php
Go to the documentation of this file.
1 <?php
8 
13 
19 class CustomerRepositoryTest extends \PHPUnit\Framework\TestCase
20 {
22  private $accountManagement;
23 
25  private $customerRepository;
26 
28  private $objectManager;
29 
31  private $customerFactory;
32 
34  private $addressFactory;
35 
37  private $regionFactory;
38 
40  private $converter;
41 
43  protected $dataObjectHelper;
44 
46  protected $encryptor;
47 
49  protected $customerRegistry;
50 
51  protected function setUp()
52  {
53  $this->objectManager = Bootstrap::getObjectManager();
54  $this->customerRepository =
55  $this->objectManager->create(\Magento\Customer\Api\CustomerRepositoryInterface::class);
56  $this->customerFactory =
57  $this->objectManager->create(\Magento\Customer\Api\Data\CustomerInterfaceFactory::class);
58  $this->addressFactory = $this->objectManager->create(\Magento\Customer\Api\Data\AddressInterfaceFactory::class);
59  $this->regionFactory = $this->objectManager->create(\Magento\Customer\Api\Data\RegionInterfaceFactory::class);
60  $this->accountManagement =
61  $this->objectManager->create(\Magento\Customer\Api\AccountManagementInterface::class);
62  $this->converter = $this->objectManager->create(\Magento\Framework\Api\ExtensibleDataObjectConverter::class);
63  $this->dataObjectHelper = $this->objectManager->create(\Magento\Framework\Api\DataObjectHelper::class);
64  $this->encryptor = $this->objectManager->create(\Magento\Framework\Encryption\EncryptorInterface::class);
65  $this->customerRegistry = $this->objectManager->create(\Magento\Customer\Model\CustomerRegistry::class);
66 
68  $cache = $this->objectManager->create(\Magento\Framework\Config\CacheInterface::class);
69  $cache->remove('extension_attributes_config');
70  }
71 
72  protected function tearDown()
73  {
76  $customerRegistry = $objectManager->get(\Magento\Customer\Model\CustomerRegistry::class);
77  $customerRegistry->remove(1);
78  }
79 
84  {
87  $storeId = 1;
88  $firstname = 'Tester';
89  $lastname = 'McTest';
90  $groupId = 1;
91  $newCustomerEntity = $this->customerFactory->create()
92  ->setStoreId($storeId)
93  ->setEmail($email)
94  ->setFirstname($firstname)
95  ->setLastname($lastname)
96  ->setGroupId($groupId);
97  $customer = $this->customerRepository->save($newCustomerEntity);
99  $newCustomerFirstname = 'New First Name';
100  $updatedCustomer = $this->customerFactory->create();
101  $this->dataObjectHelper->mergeDataObjects(
102  \Magento\Customer\Api\Data\CustomerInterface::class,
103  $updatedCustomer,
104  $customer
105  );
106  $updatedCustomer->setFirstname($newCustomerFirstname);
107  $this->customerRepository->save($updatedCustomer);
109  $customer = $this->customerRepository->get($customer->getEmail());
110  $this->assertEquals($newCustomerFirstname, $customer->getFirstname());
111  $this->assertEquals($lastname, $customer->getLastname());
112  }
113 
117  public function testCreateNewCustomer()
118  {
120  $storeId = 1;
121  $firstname = 'Tester';
122  $lastname = 'McTest';
123  $groupId = 1;
124 
125  $newCustomerEntity = $this->customerFactory->create()
126  ->setStoreId($storeId)
127  ->setEmail($email)
128  ->setFirstname($firstname)
129  ->setLastname($lastname)
130  ->setGroupId($groupId);
131  $savedCustomer = $this->customerRepository->save($newCustomerEntity);
132  $this->assertNotNull($savedCustomer->getId());
133  $this->assertEquals($email, $savedCustomer->getEmail());
134  $this->assertEquals($storeId, $savedCustomer->getStoreId());
135  $this->assertEquals($firstname, $savedCustomer->getFirstname());
136  $this->assertEquals($lastname, $savedCustomer->getLastname());
137  $this->assertEquals($groupId, $savedCustomer->getGroupId());
138  $this->assertTrue(!$savedCustomer->getSuffix());
139  }
140 
148  public function testUpdateCustomer($defaultBilling, $defaultShipping)
149  {
150  $existingCustomerId = 1;
152  $firstName = 'Firstsave';
153  $lastName = 'Lastsave';
154  $newPassword = 'newPassword123';
155  $newPasswordHash = $this->encryptor->getHash($newPassword, true);
156  $customerBefore = $this->customerRepository->getById($existingCustomerId);
157  $customerData = array_merge($customerBefore->__toArray(), [
158  'id' => 1,
159  'email' => $email,
160  'firstname' => $firstName,
161  'lastname' => $lastName,
162  'created_in' => 'Admin',
163  'password' => 'notsaved',
164  'default_billing' => $defaultBilling,
165  'default_shipping' => $defaultShipping
166  ]);
167  $customerDetails = $this->customerFactory->create();
168  $this->dataObjectHelper->populateWithArray(
169  $customerDetails,
171  \Magento\Customer\Api\Data\CustomerInterface::class
172  );
173  $this->customerRepository->save($customerDetails, $newPasswordHash);
174  $customerAfter = $this->customerRepository->getById($existingCustomerId);
175  $this->assertEquals($email, $customerAfter->getEmail());
176  $this->assertEquals($firstName, $customerAfter->getFirstname());
177  $this->assertEquals($lastName, $customerAfter->getLastname());
178  $this->assertEquals($defaultBilling, $customerAfter->getDefaultBilling());
179  $this->assertEquals($defaultShipping, $customerAfter->getDefaultShipping());
180  $this->expectedDefaultShippingsInCustomerModelAttributes(
181  $existingCustomerId,
182  $defaultBilling,
183  $defaultShipping
184  );
185  $this->assertEquals('Admin', $customerAfter->getCreatedIn());
186  $this->accountManagement->authenticate($customerAfter->getEmail(), $newPassword);
187  $attributesBefore = $this->converter->toFlatArray(
188  $customerBefore,
189  [],
190  \Magento\Customer\Api\Data\CustomerInterface::class
191  );
192  $attributesAfter = $this->converter->toFlatArray(
193  $customerAfter,
194  [],
195  \Magento\Customer\Api\Data\CustomerInterface::class
196  );
197  // ignore 'updated_at'
198  unset($attributesBefore['updated_at']);
199  unset($attributesAfter['updated_at']);
200  $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter);
201  $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore);
202  $expectedInBefore = [
203  'firstname',
204  'lastname',
205  'email',
206  ];
207  foreach ($expectedInBefore as $key) {
208  $this->assertContains($key, array_keys($inBeforeOnly));
209  }
210  $this->assertContains('created_in', array_keys($inAfterOnly));
211  $this->assertContains('firstname', array_keys($inAfterOnly));
212  $this->assertContains('lastname', array_keys($inAfterOnly));
213  $this->assertContains('email', array_keys($inAfterOnly));
214  $this->assertNotContains('password_hash', array_keys($inAfterOnly));
215  }
216 
222  public function testUpdateCustomerAddress()
223  {
224  $customerId = 1;
225  $city = 'San Jose';
227  $customer = $this->customerRepository->getById($customerId);
228  $customerDetails = $customer->__toArray();
229  $addresses = $customer->getAddresses();
230  $addressId = $addresses[0]->getId();
231  $newAddress = array_merge($addresses[0]->__toArray(), ['city' => $city]);
232  $newAddressDataObject = $this->addressFactory->create();
233  $this->dataObjectHelper->populateWithArray(
234  $newAddressDataObject,
235  $newAddress,
236  \Magento\Customer\Api\Data\AddressInterface::class
237  );
238  $newAddressDataObject->setRegion($addresses[0]->getRegion());
239  $newCustomerEntity = $this->customerFactory->create();
240  $this->dataObjectHelper->populateWithArray(
241  $newCustomerEntity,
242  $customerDetails,
243  \Magento\Customer\Api\Data\CustomerInterface::class
244  );
245  $newCustomerEntity->setId($customerId)
246  ->setAddresses([$newAddressDataObject, $addresses[1]]);
247  $this->customerRepository->save($newCustomerEntity);
248  $newCustomer = $this->customerRepository->get($email);
249  $this->assertEquals(2, count($newCustomer->getAddresses()));
250 
251  foreach ($newCustomer->getAddresses() as $newAddress) {
252  if ($newAddress->getId() == $addressId) {
253  $this->assertEquals($city, $newAddress->getCity());
254  }
255  }
256  }
257 
264  {
265  $customerId = 1;
266  $customer = $this->customerRepository->getById($customerId);
267  $customerDetails = $customer->__toArray();
268  $newCustomerEntity = $this->customerFactory->create();
269  $this->dataObjectHelper->populateWithArray(
270  $newCustomerEntity,
271  $customerDetails,
272  \Magento\Customer\Api\Data\CustomerInterface::class
273  );
274  $newCustomerEntity->setId($customer->getId())
275  ->setAddresses(null);
276  $this->customerRepository->save($newCustomerEntity);
277 
278  $newCustomerDetails = $this->customerRepository->getById($customerId);
279  //Verify that old addresses are still present
280  $this->assertEquals(2, count($newCustomerDetails->getAddresses()));
281  }
282 
289  {
290  $customerId = 1;
291  $customer = $this->customerRepository->getById($customerId);
292  $customerDetails = $customer->__toArray();
293  $newCustomerEntity = $this->customerFactory->create();
294  $this->dataObjectHelper->populateWithArray(
295  $newCustomerEntity,
296  $customerDetails,
297  \Magento\Customer\Api\Data\CustomerInterface::class
298  );
299  $newCustomerEntity->setId($customer->getId())
300  ->setAddresses([]);
301  $this->customerRepository->save($newCustomerEntity);
302 
303  $newCustomerDetails = $this->customerRepository->getById($customerId);
304  //Verify that old addresses are removed
305  $this->assertEquals(0, count($newCustomerDetails->getAddresses()));
306  }
307 
318  public function testSearchCustomers($filters, $filterGroup, $expectedResult)
319  {
321  $searchBuilder = Bootstrap::getObjectManager()
322  ->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
323  foreach ($filters as $filter) {
324  $searchBuilder->addFilters([$filter]);
325  }
326  if ($filterGroup !== null) {
327  $searchBuilder->addFilters($filterGroup);
328  }
329 
330  $searchResults = $this->customerRepository->getList($searchBuilder->create());
331 
332  $this->assertEquals(count($expectedResult), $searchResults->getTotalCount());
333 
334  foreach ($searchResults->getItems() as $item) {
335  $this->assertEquals($expectedResult[$item->getId()]['email'], $item->getEmail());
336  $this->assertEquals($expectedResult[$item->getId()]['firstname'], $item->getFirstname());
337  unset($expectedResult[$item->getId()]);
338  }
339  }
340 
347  public function testSearchCustomersOrder()
348  {
350  $objectManager = Bootstrap::getObjectManager();
351  $searchBuilder = $objectManager->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
352 
353  // Filter for 'firstname' like 'First'
354  $filterBuilder = $objectManager->create(\Magento\Framework\Api\FilterBuilder::class);
355  $firstnameFilter = $filterBuilder->setField('firstname')
356  ->setConditionType('like')
357  ->setValue('First%')
358  ->create();
359  $searchBuilder->addFilters([$firstnameFilter]);
360  // Search ascending order
361  $sortOrderBuilder = $objectManager->create(\Magento\Framework\Api\SortOrderBuilder::class);
362  $sortOrder = $sortOrderBuilder
363  ->setField('lastname')
364  ->setDirection(SortOrder::SORT_ASC)
365  ->create();
366  $searchBuilder->addSortOrder($sortOrder);
367  $searchResults = $this->customerRepository->getList($searchBuilder->create());
368  $this->assertEquals(3, $searchResults->getTotalCount());
369  $this->assertEquals('Lastname', $searchResults->getItems()[0]->getLastname());
370  $this->assertEquals('Lastname2', $searchResults->getItems()[1]->getLastname());
371  $this->assertEquals('Lastname3', $searchResults->getItems()[2]->getLastname());
372 
373  // Search descending order
374  $sortOrder = $sortOrderBuilder
375  ->setField('lastname')
376  ->setDirection(SortOrder::SORT_DESC)
377  ->create();
378  $searchBuilder->addSortOrder($sortOrder);
379  $searchResults = $this->customerRepository->getList($searchBuilder->create());
380  $this->assertEquals('Lastname3', $searchResults->getItems()[0]->getLastname());
381  $this->assertEquals('Lastname2', $searchResults->getItems()[1]->getLastname());
382  $this->assertEquals('Lastname', $searchResults->getItems()[2]->getLastname());
383  }
384 
390  public function testDelete()
391  {
392  $fixtureCustomerEmail = '[email protected]';
393  $customer = $this->customerRepository->get($fixtureCustomerEmail);
394  $this->customerRepository->delete($customer);
396  $this->expectException(\Magento\Framework\Exception\NoSuchEntityException::class);
397  $this->expectExceptionMessage('No such entity with email = [email protected], websiteId = 1');
398  $this->customerRepository->get($fixtureCustomerEmail);
399  }
400 
406  public function testDeleteById()
407  {
408  $fixtureCustomerEmail = '[email protected]';
409  $fixtureCustomerId = 1;
410  $this->customerRepository->deleteById($fixtureCustomerId);
412  $this->expectException(\Magento\Framework\Exception\NoSuchEntityException::class);
413  $this->expectExceptionMessage('No such entity with email = [email protected], websiteId = 1');
414  $this->customerRepository->get($fixtureCustomerEmail);
415  }
416 
422  public function updateCustomerDataProvider()
423  {
424  return [
425  'Customer remove default shipping and billing' => [
426  null,
427  null
428  ],
429  'Customer update default shipping and billing' => [
430  1,
431  1
432  ],
433  ];
434  }
435 
436  public function searchCustomersDataProvider()
437  {
438  $builder = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\FilterBuilder::class);
439  return [
440  'Customer with specific email' => [
441  [$builder->setField('email')->setValue('[email protected]')->create()],
442  null,
443  [1 => ['email' => '[email protected]', 'firstname' => 'Firstname']],
444  ],
445  'Customer with specific first name' => [
446  [$builder->setField('firstname')->setValue('Firstname2')->create()],
447  null,
448  [2 => ['email' => '[email protected]', 'firstname' => 'Firstname2']],
449  ],
450  'Customers with either email' => [
451  [],
452  [
453  $builder->setField('firstname')->setValue('Firstname')->create(),
454  $builder->setField('firstname')->setValue('Firstname2')->create()
455  ],
456  [
457  1 => ['email' => '[email protected]', 'firstname' => 'Firstname'],
458  2 => ['email' => '[email protected]', 'firstname' => 'Firstname2']
459  ],
460  ],
461  'Customers created since' => [
462  [
463  $builder->setField('created_at')->setValue('2011-02-28 15:52:26')
464  ->setConditionType('gt')->create(),
465  ],
466  [],
467  [
468  1 => ['email' => '[email protected]', 'firstname' => 'Firstname'],
469  3 => ['email' => '[email protected]', 'firstname' => 'Firstname3']
470  ],
471  ]
472  ];
473  }
474 
482  protected function expectedDefaultShippingsInCustomerModelAttributes(
483  $customerId,
484  $defaultBilling,
485  $defaultShipping
486  ) {
490  $customer = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
492  $customer->load($customerId);
493  $this->assertEquals(
494  $defaultBilling,
495  $customer->getDefaultBilling(),
496  'default_billing customer attribute did not updated'
497  );
498  $this->assertEquals(
499  $defaultShipping,
500  $customer->getDefaultShipping(),
501  'default_shipping customer attribute did not updated'
502  );
503  }
504 
510  {
511  $customerId = 1;
512  $customerData = [
513  "id" => 1,
514  "website_id" => 1,
515  "email" => "[email protected]",
516  "firstname" => "1111",
517  "lastname" => "Boss",
518  "middlename" => null,
519  "gender" => 0
520  ];
521 
522  $customerEntity = $this->customerFactory->create(['data' => $customerData]);
523 
524  $customer = $this->customerRepository->getById($customerId);
525  $oldDefaultBilling = $customer->getDefaultBilling();
526  $oldDefaultShipping = $customer->getDefaultShipping();
527 
528  $savedCustomer = $this->customerRepository->save($customerEntity);
529 
530  $this->assertEquals(
531  $savedCustomer->getDefaultBilling(),
532  $oldDefaultBilling,
533  'Default billing shoud not be overridden'
534  );
535 
536  $this->assertEquals(
537  $savedCustomer->getDefaultShipping(),
538  $oldDefaultShipping,
539  'Default shipping shoud not be overridden'
540  );
541  }
542 }
$customerData
$customer
Definition: customers.php:11
$email
Definition: details.phtml:13
$addresses
Definition: address_list.php:7
$filters
Definition: uploader.phtml:11