diff --git a/app/code/Magento/Customer/Observer/UpgradeQuoteCustomerEmailObserver.php b/app/code/Magento/Customer/Observer/UpgradeQuoteCustomerEmailObserver.php new file mode 100644 index 0000000000000..e0c9552b9f508 --- /dev/null +++ b/app/code/Magento/Customer/Observer/UpgradeQuoteCustomerEmailObserver.php @@ -0,0 +1,66 @@ +quoteRepository = $quoteRepository; + } + + /** + * Upgrade quote customer email when customer has changed email + * + * @param Observer $observer + * @return void + */ + public function execute(Observer $observer): void + { + /** @var \Magento\Customer\Model\Data\Customer $customerOrig */ + $customerOrig = $observer->getEvent()->getOrigCustomerDataObject(); + if (!$customerOrig) { + return; + } + + $emailOrig = $customerOrig->getEmail(); + + /** @var \Magento\Customer\Model\Data\Customer $customer */ + $customer = $observer->getEvent()->getCustomerDataObject(); + $email = $customer->getEmail(); + + if ($email == $emailOrig) { + return; + } + + try { + $quote = $this->quoteRepository->getForCustomer($customer->getId()); + $quote->setCustomerEmail($email); + $this->quoteRepository->save($quote); + } catch (NoSuchEntityException $e) { + return; + } + } +} diff --git a/app/code/Magento/Customer/Test/Unit/Observer/UpgradeQuoteCustomerEmailObserverTest.php b/app/code/Magento/Customer/Test/Unit/Observer/UpgradeQuoteCustomerEmailObserverTest.php new file mode 100644 index 0000000000000..f41c0ed9f0fb4 --- /dev/null +++ b/app/code/Magento/Customer/Test/Unit/Observer/UpgradeQuoteCustomerEmailObserverTest.php @@ -0,0 +1,107 @@ +observerMock = $this->getMockBuilder(\Magento\Framework\Event\Observer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->eventMock = $this->getMockBuilder(\Magento\Framework\Event::class) + ->disableOriginalConstructor() + ->setMethods(['getCustomerDataObject', 'getOrigCustomerDataObject']) + ->getMock(); + + $this->observerMock->expects($this->any())->method('getEvent')->will($this->returnValue($this->eventMock)); + + $this->quoteRepositoryMock = $this + ->getMockBuilder(\Magento\Quote\Api\CartRepositoryInterface::class) + ->getMockForAbstractClass(); + $this->model = new UpgradeQuoteCustomerEmailObserver($this->quoteRepositoryMock); + } + + /** + * Unit test for verifying quote customers email upgrade observer + */ + public function testUpgradeQuoteCustomerEmail() + { + $email = "test@test.com"; + $origEmail = "origtest@test.com"; + + $customer = $this->getMockBuilder(\Magento\Customer\Api\Data\CustomerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $customerOrig = $this->getMockBuilder(\Magento\Customer\Api\Data\CustomerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $quoteMock = $this->getMockBuilder(\Magento\Quote\Model\Quote::class) + ->setMethods(['setCustomerEmail']) + ->disableOriginalConstructor() + ->getMock(); + + $this->eventMock->expects($this->any()) + ->method('getCustomerDataObject') + ->will($this->returnValue($customer)); + $this->eventMock->expects($this->any()) + ->method('getOrigCustomerDataObject') + ->will($this->returnValue($customerOrig)); + + $customerOrig->expects($this->any()) + ->method('getEmail') + ->willReturn($this->returnValue($origEmail)); + + $customer->expects($this->any()) + ->method('getEmail') + ->willReturn($this->returnValue($email)); + + $this->quoteRepositoryMock->expects($this->once()) + ->method('getForCustomer') + ->willReturn($quoteMock); + + $quoteMock->expects($this->once()) + ->method('setCustomerEmail'); + + $this->quoteRepositoryMock->expects($this->once()) + ->method('save') + ->with($quoteMock); + + $this->model->execute($this->observerMock); + } +} diff --git a/app/code/Magento/Customer/etc/events.xml b/app/code/Magento/Customer/etc/events.xml index d841d8faa9c38..2a724498a0359 100644 --- a/app/code/Magento/Customer/etc/events.xml +++ b/app/code/Magento/Customer/etc/events.xml @@ -15,4 +15,7 @@ + + +