/** * 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]); }
/** * 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; }