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 */
66namespace 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 ;
818use Magento \TestFramework \Helper \Bootstrap ;
919use 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 */
@@ -270,8 +284,8 @@ public function testCreateAccountWithNewsLetterSubscription(): void
270284 $ message ->getBody ()->getParts ()[0 ]->getRawContent ()
271285 );
272286
273- /** @var \Magento\Newsletter\Model\ Subscriber $subscriber */
274- $ subscriber = $ objectManager ->create (\ Magento \ Newsletter \ Model \ Subscriber::class);
287+ /** @var Subscriber $subscriber */
288+ $ subscriber = $ objectManager ->create (Subscriber::class);
275289 $ subscriber ->loadByEmail ('customer@example.com ' );
276290 $ this ->assertTrue ($ subscriber ->isSubscribed ());
277291
@@ -297,4 +311,66 @@ public function testCreateAccountWithNewsLetterSubscription(): void
297311 );
298312 $ this ->assertEquals ('Newsletter subscription confirmation ' , $ message ->getSubject ());
299313 }
314+
315+ #[
316+ DbIsolation(false ),
317+ DataFixture(WebsiteFixture::class, as: 'w2 ' ),
318+ DataFixture(GroupFixture::class, ['website_id ' => '$w2.id$ ' ], 'g2 ' ),
319+ DataFixture(StoreFixture::class, ['store_group_id ' => '$g2.id$ ' ], as: 's2 ' ),
320+ DataFixture(Customer::class, ['email ' => 'customer@example.com ' ], as: 'customerDefaultWebsite ' ),
321+ DataFixture(
322+ Customer::class,
323+ ['email ' => 'customer@example.com ' , 'website_id ' => '$w2.id$ ' , 'store_id ' => '$s2.id$ ' ],
324+ as: 'customerCustomWebsite '
325+ )
326+ ]
327+ public function testMultipleWebsiteCustomerHasUniqueSubscriptionsPerWebsite (): void
328+ {
329+ $ objectManager = Bootstrap::getObjectManager ();
330+
331+ $ customerDefaultWebsite = $ this ->fixtures ->get ('customerDefaultWebsite ' );
332+ $ customerCustomWebsite = $ this ->fixtures ->get ('customerCustomWebsite ' );
333+ // setting to customer for convenient and uniform retrieving later below
334+ $ customerDefaultWebsite ->setSubscriberStatus (Subscriber::STATUS_SUBSCRIBED );
335+ $ customerCustomWebsite ->setSubscriberStatus (Subscriber::STATUS_UNSUBSCRIBED );
336+
337+ $ this ->assertEquals (
338+ $ customerDefaultWebsite ->getEmail (),
339+ $ customerCustomWebsite ->getEmail (),
340+ 'Precondition emails for customers on both websites must be the same '
341+ );
342+
343+ foreach ([$ customerDefaultWebsite , $ customerCustomWebsite ] as $ customer ) {
344+ $ subscriber = $ objectManager ->create (Subscriber::class);
345+ $ subscriber ->setEmail ($ customer ->getEmail ());
346+ $ subscriber ->setCustomerId ($ customer ->getId ());
347+ $ subscriber ->setStoreId ($ customer ->getStoreId ());
348+ $ subscriber ->setSubscriberStatus ($ customer ->getSubscriberStatus ());
349+ $ subscriber ->save ();
350+ }
351+
352+ /** @var SearchCriteriaBuilder $searchBuilder */
353+ $ searchBuilder = Bootstrap::getObjectManager ()->create (SearchCriteriaBuilder::class);
354+ $ searchCriteria = $ searchBuilder ->addFilter ('email ' , $ customerDefaultWebsite ->getEmail ())->create ();
355+ $ items = $ this ->customerRepository ->getList ($ searchCriteria )->getItems ();
356+
357+ // Assertions
358+ $ this ->assertEquals (2 , count ($ items ), 'Customers from both websites should be retrieved ' );
359+
360+ $ expectedCustomerSubscriptionMap = [
361+ $ customerDefaultWebsite ->getId () => true ,
362+ $ customerCustomWebsite ->getId () => false
363+ ];
364+
365+ $ actualCustomerSubscriptionMap = [];
366+ foreach ($ items as $ item ) {
367+ $ actualCustomerSubscriptionMap [$ item ->getId ()] = $ item ->getExtensionAttributes ()->getIsSubscribed ();
368+ }
369+
370+ $ this ->assertEquals (
371+ $ expectedCustomerSubscriptionMap ,
372+ $ actualCustomerSubscriptionMap ,
373+ 'Customer with same email on each website should have has respective subscription '
374+ );
375+ }
300376}
0 commit comments