Skip to content

Commit 19d4fa7

Browse files
committed
Merge remote-tracking branch 'act4/ACP2E-3621' into pr_january_doleksandr
2 parents 673f119 + f397260 commit 19d4fa7

File tree

2 files changed

+100
-24
lines changed

2 files changed

+100
-24
lines changed

app/code/Magento/Newsletter/Model/Plugin/CustomerPlugin.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2014 Adobe
4+
* All Rights Reserved.
55
*/
66

77
namespace Magento\Newsletter\Model\Plugin;
@@ -119,7 +119,7 @@ public function afterSave(
119119
) {
120120
/** @var Subscriber $subscriber */
121121
$subscriber = $this->getSubscriber($result);
122-
$subscribeStatus = $this->getIsSubscribedFromExtensionAttributes($customer) ?? $subscriber->isSubscribed();
122+
$subscribeStatus = $this->isSubscribedFromExtensionAttributes($customer) ?? $subscriber->isSubscribed();
123123
$needToUpdate = $this->isSubscriptionChanged($result, $subscriber, $subscribeStatus);
124124

125125
/**
@@ -153,7 +153,7 @@ public function afterSave(
153153
* @param CustomerInterface $customer
154154
* @return bool|null
155155
*/
156-
private function getIsSubscribedFromExtensionAttributes(CustomerInterface $customer): ?bool
156+
private function isSubscribedFromExtensionAttributes(CustomerInterface $customer): ?bool
157157
{
158158
$extensionAttributes = $customer->getExtensionAttributes();
159159
if ($extensionAttributes === null || $extensionAttributes->getIsSubscribed() === null) {
@@ -265,7 +265,7 @@ public function afterGetList(CustomerRepositoryInterface $subject, SearchResults
265265
/** @var CustomerExtensionInterface $extensionAttributes */
266266
$extensionAttributes = $customer->getExtensionAttributes();
267267
/** @var Subscriber $subscribe */
268-
$subscribe = $collection->getItemByColumnValue('subscriber_email', $customer->getEmail());
268+
$subscribe = $collection->getItemByColumnValue('customer_id', $customer->getId());
269269
$isSubscribed = $subscribe && (int)$subscribe->getStatus() === Subscriber::STATUS_SUBSCRIBED;
270270
$extensionAttributes->setIsSubscribed($isSubscribed);
271271
}

dev/tests/integration/testsuite/Magento/Newsletter/Model/Plugin/PluginTest.php

Lines changed: 95 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
<?php
22
/**
3-
* Copyright 2015 Adobe
3+
* Copyright 2014 Adobe
44
* All Rights Reserved.
55
*/
66
namespace Magento\Newsletter\Model\Plugin;
77

8+
use Magento\Customer\Test\Fixture\Customer;
9+
use Magento\Framework\Api\SearchCriteriaBuilder;
10+
use Magento\Newsletter\Model\Subscriber;
11+
use Magento\Store\Test\Fixture\Group as GroupFixture;
12+
use Magento\Store\Test\Fixture\Store as StoreFixture;
13+
use Magento\Store\Test\Fixture\Website as WebsiteFixture;
14+
use Magento\TestFramework\Fixture\DataFixture;
15+
use Magento\TestFramework\Fixture\DataFixtureStorage;
16+
use Magento\TestFramework\Fixture\DataFixtureStorageManager;
17+
use Magento\TestFramework\Fixture\DbIsolation;
818
use Magento\TestFramework\Helper\Bootstrap;
919
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
1020

@@ -32,6 +42,9 @@ class PluginTest extends \PHPUnit\Framework\TestCase
3242
*/
3343
protected $transportBuilderMock;
3444

45+
/** @var DataFixtureStorage */
46+
private $fixtures;
47+
3548
protected function setUp(): void
3649
{
3750
$this->accountManagement = Bootstrap::getObjectManager()->get(
@@ -43,6 +56,7 @@ protected function setUp(): void
4356
$this->transportBuilderMock = Bootstrap::getObjectManager()->get(
4457
TransportBuilderMock::class
4558
);
59+
$this->fixtures = Bootstrap::getObjectManager()->get(DataFixtureStorageManager::class)->getStorage();
4660
}
4761

4862
protected function tearDown(): void
@@ -62,8 +76,8 @@ public function testCustomerCreated()
6276
{
6377
$objectManager = Bootstrap::getObjectManager();
6478

65-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
66-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
79+
/** @var Subscriber $subscriber */
80+
$subscriber = $objectManager->create(Subscriber::class);
6781
$subscriber->loadByEmail('customer_two@example.com');
6882
$this->assertTrue($subscriber->isSubscribed());
6983
$this->assertEquals(0, (int)$subscriber->getCustomerId());
@@ -112,8 +126,8 @@ public function testCustomerUpdatedEmail()
112126
{
113127
$objectManager = Bootstrap::getObjectManager();
114128

115-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
116-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
129+
/** @var Subscriber $subscriber */
130+
$subscriber = $objectManager->create(Subscriber::class);
117131
$subscriber->loadByEmail('customer@example.com');
118132
$this->assertTrue($subscriber->isSubscribed());
119133
$this->assertEquals(1, (int)$subscriber->getCustomerId());
@@ -135,8 +149,8 @@ public function testCustomerDeletedByIdAdminArea()
135149
{
136150
$objectManager = Bootstrap::getObjectManager();
137151

138-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
139-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
152+
/** @var Subscriber $subscriber */
153+
$subscriber = $objectManager->create(Subscriber::class);
140154
$subscriber->loadByEmail('customer@example.com');
141155
$this->assertTrue($subscriber->isSubscribed());
142156

@@ -153,8 +167,8 @@ public function testCustomerDeletedAdminArea()
153167
{
154168
$customer = $this->customerRepository->getById(1);
155169
$objectManager = Bootstrap::getObjectManager();
156-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
157-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
170+
/** @var Subscriber $subscriber */
171+
$subscriber = $objectManager->create(Subscriber::class);
158172
$subscriber->loadByEmail('customer@example.com');
159173
$this->assertTrue($subscriber->isSubscribed());
160174
$this->customerRepository->delete($customer);
@@ -165,14 +179,14 @@ public function testCustomerDeletedAdminArea()
165179
* Verify a subscription doesn't exist for a given email address
166180
*
167181
* @param string $email
168-
* @return \Magento\Newsletter\Model\Subscriber
182+
* @return Subscriber
169183
*/
170184
private function verifySubscriptionNotExist($email)
171185
{
172186
$objectManager = Bootstrap::getObjectManager();
173187

174-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
175-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
188+
/** @var Subscriber $subscriber */
189+
$subscriber = $objectManager->create(Subscriber::class);
176190
$subscriber->loadByEmail($email);
177191
$this->assertFalse($subscriber->isSubscribed());
178192
$this->assertEquals(0, (int)$subscriber->getId());
@@ -191,12 +205,12 @@ public function testCustomerWithZeroStoreIdIsSubscribed()
191205
\Magento\Store\Model\StoreManagerInterface::class
192206
)->getStore()->getId();
193207

194-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
195-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
208+
$subscriber = $objectManager->create(Subscriber::class);
209+
/** @var Subscriber $subscriber */
196210
$subscriber->setStoreId($currentStore)
197211
->setCustomerId(0)
198212
->setSubscriberEmail('customer@example.com')
199-
->setSubscriberStatus(\Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED)
213+
->setSubscriberStatus(Subscriber::STATUS_SUBSCRIBED)
200214
->save();
201215

202216
/** @var \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerFactory */
@@ -225,8 +239,8 @@ public function testCustomerWithZeroStoreIdIsSubscribed()
225239
*/
226240
public function testCustomerWithTwoNewsLetterSubscriptions()
227241
{
228-
/** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchBuilder */
229-
$searchBuilder = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
242+
/** @var SearchCriteriaBuilder $searchBuilder */
243+
$searchBuilder = Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
230244
$searchCriteria = $searchBuilder->addFilter('entity_id', 1)->create();
231245
$items = $this->customerRepository->getList($searchCriteria)->getItems();
232246
/** @var \Magento\Customer\Api\Data\CustomerInterface $customer */
@@ -271,8 +285,8 @@ public function testCreateAccountWithNewsLetterSubscription(): void
271285
$mailMessage
272286
);
273287

274-
/** @var \Magento\Newsletter\Model\Subscriber $subscriber */
275-
$subscriber = $objectManager->create(\Magento\Newsletter\Model\Subscriber::class);
288+
/** @var Subscriber $subscriber */
289+
$subscriber = $objectManager->create(Subscriber::class);
276290
$subscriber->loadByEmail('customer@example.com');
277291
$this->assertTrue($subscriber->isSubscribed());
278292

@@ -298,4 +312,66 @@ public function testCreateAccountWithNewsLetterSubscription(): void
298312
);
299313
$this->assertEquals('Newsletter subscription confirmation', $message->getSubject());
300314
}
315+
316+
#[
317+
DbIsolation(false),
318+
DataFixture(WebsiteFixture::class, as: 'w2'),
319+
DataFixture(GroupFixture::class, ['website_id' => '$w2.id$'], 'g2'),
320+
DataFixture(StoreFixture::class, ['store_group_id' => '$g2.id$'], as: 's2'),
321+
DataFixture(Customer::class, ['email' => 'customer@example.com'], as: 'customerDefaultWebsite'),
322+
DataFixture(
323+
Customer::class,
324+
['email' => 'customer@example.com', 'website_id' => '$w2.id$', 'store_id' => '$s2.id$'],
325+
as: 'customerCustomWebsite'
326+
)
327+
]
328+
public function testMultipleWebsiteCustomerHasUniqueSubscriptionsPerWebsite(): void
329+
{
330+
$objectManager = Bootstrap::getObjectManager();
331+
332+
$customerDefaultWebsite = $this->fixtures->get('customerDefaultWebsite');
333+
$customerCustomWebsite = $this->fixtures->get('customerCustomWebsite');
334+
// setting to customer for convenient and uniform retrieving later below
335+
$customerDefaultWebsite->setSubscriberStatus(Subscriber::STATUS_SUBSCRIBED);
336+
$customerCustomWebsite->setSubscriberStatus(Subscriber::STATUS_UNSUBSCRIBED);
337+
338+
$this->assertEquals(
339+
$customerDefaultWebsite->getEmail(),
340+
$customerCustomWebsite->getEmail(),
341+
'Precondition emails for customers on both websites must be the same'
342+
);
343+
344+
foreach ([$customerDefaultWebsite, $customerCustomWebsite] as $customer) {
345+
$subscriber = $objectManager->create(Subscriber::class);
346+
$subscriber->setEmail($customer->getEmail());
347+
$subscriber->setCustomerId($customer->getId());
348+
$subscriber->setStoreId($customer->getStoreId());
349+
$subscriber->setSubscriberStatus($customer->getSubscriberStatus());
350+
$subscriber->save();
351+
}
352+
353+
/** @var SearchCriteriaBuilder $searchBuilder */
354+
$searchBuilder = Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
355+
$searchCriteria = $searchBuilder->addFilter('email', $customerDefaultWebsite->getEmail())->create();
356+
$items = $this->customerRepository->getList($searchCriteria)->getItems();
357+
358+
// Assertions
359+
$this->assertEquals(2, count($items), 'Customers from both websites should be retrieved');
360+
361+
$expectedCustomerSubscriptionMap = [
362+
$customerDefaultWebsite->getId() => true,
363+
$customerCustomWebsite->getId() => false
364+
];
365+
366+
$actualCustomerSubscriptionMap = [];
367+
foreach ($items as $item) {
368+
$actualCustomerSubscriptionMap[$item->getId()] = $item->getExtensionAttributes()->getIsSubscribed();
369+
}
370+
371+
$this->assertEquals(
372+
$expectedCustomerSubscriptionMap,
373+
$actualCustomerSubscriptionMap,
374+
'Customer with same email on each website should have has respective subscription'
375+
);
376+
}
301377
}

0 commit comments

Comments
 (0)