/**
  * test SaveAuth
  */
 public function testSaveAuth()
 {
     $customerId = 1;
     $customerSecureMock = $this->getMock(\Magento\Customer\Model\Data\CustomerSecure::class, [], [], '', false);
     $dbAdapter = $this->getMock(\Magento\Framework\DB\Adapter\AdapterInterface::class, [], [], '', false);
     $this->customerRegistry->expects($this->once())->method('retrieveSecureData')->willReturn($customerSecureMock);
     $customerSecureMock->expects($this->exactly(3))->method('getData')->willReturn(1);
     $this->customerResourceModel->expects($this->any())->method('getConnection')->willReturn($dbAdapter);
     $this->customerResourceModel->expects($this->any())->method('getTable')->willReturn('customer_entity');
     $dbAdapter->expects($this->any())->method('update')->with('customer_entity', ['failures_num' => 1, 'first_failure' => 1, 'lock_expires' => 1]);
     $dbAdapter->expects($this->any())->method('quoteInto')->with('entity_id = ?', $customerId);
     $this->model->saveAuth($customerId);
 }
 /**
  * @param \Magento\Customer\Api\CustomerRepositoryInterface $subject
  * @param callable $proceed
  * @param \Magento\Customer\Api\Data\CustomerInterface $customer
  * @param string $passwordHash
  * @return \Magento\Customer\Api\Data\CustomerInterface
  * @throws \Exception
  * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  */
 public function aroundSave(\Magento\Customer\Api\CustomerRepositoryInterface $subject, \Closure $proceed, \Magento\Customer\Api\Data\CustomerInterface $customer, $passwordHash = null)
 {
     $this->resourceModel->beginTransaction();
     try {
         /** @var $result \Magento\Customer\Api\Data\CustomerInterface */
         $result = $proceed($customer, $passwordHash);
         $this->resourceModel->commit();
         return $result;
     } catch (\Exception $e) {
         $this->resourceModel->rollBack();
         throw $e;
     }
 }
 protected function setUp()
 {
     $this->_website = $this->getMock('Magento\\Store\\Model\\Website', [], [], '', false);
     $this->_config = $this->getMock('Magento\\Eav\\Model\\Config', [], [], '', false);
     $this->_attribute = $this->getMock('Magento\\Eav\\Model\\Attribute', [], [], '', false);
     $this->_storeManager = $this->getMock('Magento\\Store\\Model\\StoreManager', [], [], '', false);
     $this->_storetMock = $this->getMock('\\Magento\\Store\\Model\\Store', [], [], '', false);
     $this->_scopeConfigMock = $this->getMock('\\Magento\\Framework\\App\\Config\\ScopeConfigInterface');
     $this->_transportBuilderMock = $this->getMock('\\Magento\\Framework\\Mail\\Template\\TransportBuilder', [], [], '', false);
     $this->_transportMock = $this->getMock('Magento\\Framework\\Mail\\TransportInterface', [], [], '', false);
     $this->attributeFactoryMock = $this->getMock('Magento\\Customer\\Model\\AttributeFactory', ['create'], [], '', false);
     $this->attributeCustomerMock = $this->getMock('Magento\\Customer\\Model\\Attribute', [], [], '', false);
     $this->resourceMock = $this->getMock('\\Magento\\Customer\\Model\\ResourceModel\\Customer', ['getIdFieldName'], [], '', false, false);
     $this->resourceMock->expects($this->any())->method('getIdFieldName')->will($this->returnValue('id'));
     $this->registryMock = $this->getMock('Magento\\Framework\\Registry', ['registry'], [], '', false);
     $this->_encryptor = $this->getMock('Magento\\Framework\\Encryption\\EncryptorInterface');
     $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
     $this->_model = $helper->getObject('Magento\\Customer\\Model\\Customer', ['storeManager' => $this->_storeManager, 'config' => $this->_config, 'transportBuilder' => $this->_transportBuilderMock, 'scopeConfig' => $this->_scopeConfigMock, 'encryptor' => $this->_encryptor, 'attributeFactory' => $this->attributeFactoryMock, 'registry' => $this->registryMock, 'resource' => $this->resourceMock]);
 }
Beispiel #4
0
 /**
  * Check for email duplicates before saving customers sharing options
  *
  * @return $this
  * @throws \Magento\Framework\Exception\LocalizedException
  */
 public function beforeSave()
 {
     $value = $this->getValue();
     if ($value == self::SHARE_GLOBAL) {
         if ($this->_customerResource->findEmailDuplicates()) {
             //@codingStandardsIgnoreStart
             throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t share customer accounts globally when the accounts share identical email addresses on more than one website.'));
             //@codingStandardsIgnoreEnd
         }
     }
     return $this;
 }
 /**
  * Resolve customers data based on ids quote table.
  *
  * @return void
  */
 public function resolveCustomerNames()
 {
     $select = $this->customerResource->getConnection()->select();
     $customerName = $this->customerResource->getConnection()->getConcatSql(['firstname', 'lastname'], ' ');
     $select->from(['customer' => $this->customerResource->getTable('customer_entity')], ['email']);
     $select->columns(['customer_name' => $customerName]);
     $select->where('customer.entity_id IN (?)', array_column($this->getData(), 'customer_id'));
     $customersData = $this->customerResource->getConnection()->fetchAll($select);
     foreach ($this->getItems() as $item) {
         $item->setData(array_merge($item->getData(), current($customersData)));
         next($customersData);
     }
 }
 /**
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testSaveWithPasswordHash()
 {
     $customerId = 1;
     $storeId = 2;
     $passwordHash = 'ukfa4sdfa56s5df02asdf4rt';
     $this->prepareMocksForValidation(true);
     $region = $this->getMockForAbstractClass('Magento\\Customer\\Api\\Data\\RegionInterface', [], '', false);
     $address = $this->getMockForAbstractClass('Magento\\Customer\\Api\\Data\\AddressInterface', [], '', false, false, true, ['setCustomerId', 'setRegion', 'getRegion', 'getId']);
     $address2 = $this->getMockForAbstractClass('Magento\\Customer\\Api\\Data\\AddressInterface', [], '', false, false, true, ['setCustomerId', 'setRegion', 'getRegion', 'getId']);
     $customerModel = $this->getMock('Magento\\Customer\\Model\\Customer', ['getId', 'setId', 'setStoreId', 'getStoreId', 'getAttributeSetId', 'setAttributeSetId', 'setRpToken', 'setRpTokenCreatedAt', 'getDataModel', 'setPasswordHash'], [], '', false);
     $customerAttributesMetaData = $this->getMockForAbstractClass('Magento\\Framework\\Api\\CustomAttributesDataInterface', [], '', false, false, true, ['getId', 'getEmail', 'getWebsiteId', 'getAddresses', 'setAddresses']);
     $this->customer->expects($this->atLeastOnce())->method('getId')->willReturn($customerId);
     $this->customerRegistry->expects($this->atLeastOnce())->method('retrieve')->with($customerId)->willReturn($customerModel);
     $customerModel->expects($this->atLeastOnce())->method('getDataModel')->willReturn($this->customer);
     $this->imageProcessor->expects($this->once())->method('save')->with($this->customer, CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER, $this->customer)->willReturn($customerAttributesMetaData);
     $address->expects($this->once())->method('setCustomerId')->with($customerId)->willReturnSelf();
     $address->expects($this->once())->method('getRegion')->willReturn($region);
     $address->expects($this->atLeastOnce())->method('getId')->willReturn(7);
     $address->expects($this->once())->method('setRegion')->with($region);
     $customerAttributesMetaData->expects($this->any())->method('getAddresses')->willReturn([$address]);
     $customerAttributesMetaData->expects($this->at(1))->method('setAddresses')->with([]);
     $customerAttributesMetaData->expects($this->at(2))->method('setAddresses')->with([$address]);
     $this->extensibleDataObjectConverter->expects($this->once())->method('toNestedArray')->with($customerAttributesMetaData, [], '\\Magento\\Customer\\Api\\Data\\CustomerInterface')->willReturn(['customerData']);
     $this->customerFactory->expects($this->once())->method('create')->with(['data' => ['customerData']])->willReturn($customerModel);
     $customerModel->expects($this->once())->method('getStoreId')->willReturn(null);
     $store = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false);
     $store->expects($this->once())->method('getId')->willReturn($storeId);
     $this->storeManager->expects($this->once())->method('getStore')->willReturn($store);
     $customerModel->expects($this->once())->method('setStoreId')->with($storeId);
     $customerModel->expects($this->once())->method('setId')->with(null);
     $customerModel->expects($this->once())->method('getAttributeSetId')->willReturn(null);
     $customerModel->expects($this->once())->method('setAttributeSetId')->with(\Magento\Customer\Api\CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER);
     $customerModel->expects($this->once())->method('setPasswordHash')->with($passwordHash);
     $customerModel->expects($this->atLeastOnce())->method('getId')->willReturn($customerId);
     $this->customerResourceModel->expects($this->once())->method('save')->with($customerModel);
     $this->customerRegistry->expects($this->once())->method('push')->with($customerModel);
     $this->customer->expects($this->any())->method('getAddresses')->willReturn([$address, $address2]);
     $this->addressRepository->expects($this->once())->method('save')->with($address);
     $customerAttributesMetaData->expects($this->once())->method('getEmail')->willReturn('*****@*****.**');
     $customerAttributesMetaData->expects($this->once())->method('getWebsiteId')->willReturn(2);
     $this->customerRegistry->expects($this->once())->method('retrieveByEmail')->with('*****@*****.**', 2)->willReturn($customerModel);
     $this->eventManager->expects($this->once())->method('dispatch')->with('customer_save_after_data_object', ['customer_data_object' => $this->customer, 'orig_customer_data_object' => $customerAttributesMetaData]);
     $this->model->save($this->customer, $passwordHash);
 }
 /**
  * Test _saveCustomerDefaults
  *
  * @magentoDataFixture Magento/Customer/_files/import_export/customer_with_addresses.php
  */
 public function testSaveCustomerDefaults()
 {
     /** @var $objectManager \Magento\TestFramework\ObjectManager */
     $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
     // get not default address
     $customers = $objectManager->get('Magento\\Framework\\Registry')->registry($this->_fixtureKey);
     /** @var $notDefaultAddress \Magento\Customer\Model\Address */
     $notDefaultAddress = null;
     /** @var $addressCustomer \Magento\Customer\Model\Customer */
     $addressCustomer = null;
     /** @var $customer \Magento\Customer\Model\Customer */
     foreach ($customers as $customer) {
         /** @var $address \Magento\Customer\Model\Address */
         foreach ($customer->getAddressesCollection() as $address) {
             if (!$customer->getDefaultBillingAddress() && !$customer->getDefaultShippingAddress()) {
                 $notDefaultAddress = $address;
                 $addressCustomer = $customer;
                 break;
             }
             if ($notDefaultAddress) {
                 break;
             }
         }
     }
     $this->assertNotNull($notDefaultAddress, 'Not default address must exists.');
     $this->assertNotNull($addressCustomer, 'Not default address customer must exists.');
     $addressId = $notDefaultAddress->getId();
     $customerId = $addressCustomer->getId();
     // set customer defaults
     $defaults = [$this->customerResource->getTable('customer_entity') => [$customerId => ['default_billing' => $addressId, 'default_shipping' => $addressId]]];
     // invoke _saveCustomerDefaults
     $saveDefaults = new \ReflectionMethod($this->_testClassName, '_saveCustomerDefaults');
     $saveDefaults->setAccessible(true);
     $saveDefaults->invoke($this->_entityAdapter, $defaults);
     // check DB
     /** @var $testCustomer \Magento\Customer\Model\Customer */
     $testCustomer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Customer\\Model\\Customer');
     $testCustomer->load($customerId);
     $this->assertEquals($customerId, $testCustomer->getId(), 'Customer must exists.');
     $this->assertNotNull($testCustomer->getDefaultBillingAddress(), 'Default billing address must exists.');
     $this->assertNotNull($testCustomer->getDefaultShippingAddress(), 'Default shipping address must exists.');
     $this->assertEquals($addressId, $testCustomer->getDefaultBillingAddress()->getId(), 'Incorrect default billing address.');
     $this->assertEquals($addressId, $testCustomer->getDefaultShippingAddress()->getId(), 'Incorrect default shipping address.');
 }
 /**
  * {@inheritdoc}
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.NPathComplexity)
  */
 public function save(\Magento\Customer\Api\Data\CustomerInterface $customer, $passwordHash = null)
 {
     $this->validate($customer);
     $prevCustomerData = null;
     if ($customer->getId()) {
         $prevCustomerData = $this->getById($customer->getId());
     }
     $customer = $this->imageProcessor->save($customer, CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER, $prevCustomerData);
     $origAddresses = $customer->getAddresses();
     $customer->setAddresses([]);
     $customerData = $this->extensibleDataObjectConverter->toNestedArray($customer, [], '\\Magento\\Customer\\Api\\Data\\CustomerInterface');
     $customer->setAddresses($origAddresses);
     $customerModel = $this->customerFactory->create(['data' => $customerData]);
     $storeId = $customerModel->getStoreId();
     if ($storeId === null) {
         $customerModel->setStoreId($this->storeManager->getStore()->getId());
     }
     $customerModel->setId($customer->getId());
     // Need to use attribute set or future updates can cause data loss
     if (!$customerModel->getAttributeSetId()) {
         $customerModel->setAttributeSetId(\Magento\Customer\Api\CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER);
     }
     // Populate model with secure data
     if ($customer->getId()) {
         $customerSecure = $this->customerRegistry->retrieveSecureData($customer->getId());
         $customerModel->setRpToken($customerSecure->getRpToken());
         $customerModel->setRpTokenCreatedAt($customerSecure->getRpTokenCreatedAt());
         $customerModel->setPasswordHash($customerSecure->getPasswordHash());
     } else {
         if ($passwordHash) {
             $customerModel->setPasswordHash($passwordHash);
         }
     }
     // If customer email was changed, reset RpToken info
     if ($prevCustomerData && $prevCustomerData->getEmail() !== $customerModel->getEmail()) {
         $customerModel->setRpToken(null);
         $customerModel->setRpTokenCreatedAt(null);
     }
     $this->customerResourceModel->save($customerModel);
     $this->customerRegistry->push($customerModel);
     $customerId = $customerModel->getId();
     if ($customer->getAddresses() !== null) {
         if ($customer->getId()) {
             $existingAddresses = $this->getById($customer->getId())->getAddresses();
             $getIdFunc = function ($address) {
                 return $address->getId();
             };
             $existingAddressIds = array_map($getIdFunc, $existingAddresses);
         } else {
             $existingAddressIds = [];
         }
         $savedAddressIds = [];
         foreach ($customer->getAddresses() as $address) {
             $address->setCustomerId($customerId)->setRegion($address->getRegion());
             $this->addressRepository->save($address);
             if ($address->getId()) {
                 $savedAddressIds[] = $address->getId();
             }
         }
         $addressIdsToDelete = array_diff($existingAddressIds, $savedAddressIds);
         foreach ($addressIdsToDelete as $addressId) {
             $this->addressRepository->deleteById($addressId);
         }
     }
     $savedCustomer = $this->get($customer->getEmail(), $customer->getWebsiteId());
     $this->eventManager->dispatch('customer_save_after_data_object', ['customer_data_object' => $savedCustomer, 'orig_customer_data_object' => $customer]);
     return $savedCustomer;
 }
 /**
  * @expectedException \Exception
  * @expectedExceptionMessage error occurred
  */
 public function testAroundSaveRollBack()
 {
     $this->resourceMock->expects($this->once())->method('beginTransaction');
     $this->resourceMock->expects($this->once())->method('rollBack');
     $this->model->aroundSave($this->subjectMock, $this->rollbackClosureMock, $this->customerMock, $this->passwordHash);
 }
 /**
  * Reset Authentication data for customer.
  *
  * @param int $customerId
  * @return $this
  */
 public function saveAuth($customerId)
 {
     $customerSecure = $this->customerRegistry->retrieveSecureData($customerId);
     $this->customerResourceModel->getConnection()->update($this->customerResourceModel->getTable('customer_entity'), ['failures_num' => $customerSecure->getData('failures_num'), 'first_failure' => $customerSecure->getData('first_failure'), 'lock_expires' => $customerSecure->getData('lock_expires')], $this->customerResourceModel->getConnection()->quoteInto('entity_id = ?', $customerId));
     return $this;
 }