88namespace  Magento \Newsletter \Model ;
99
1010use  Magento \Customer \Api \CustomerRepositoryInterface ;
11+ use  Magento \Framework \Mail \EmailMessage ;
1112use  Magento \Framework \Exception \LocalizedException ;
1213use  Magento \Framework \Exception \NoSuchEntityException ;
1314use  Magento \Framework \ObjectManagerInterface ;
2223 */ 
2324class  SubscriberTest extends  TestCase
2425{
25-     /** @var ObjectManagerInterface  */ 
26+     private  const  CONFIRMATION_SUBSCRIBE  = 'You have been successfully subscribed to our newsletter. ' ;
27+     private  const  CONFIRMATION_UNSUBSCRIBE  = 'You have been unsubscribed from the newsletter. ' ;
28+ 
29+     /** @var ObjectManagerInterface */ 
2630    private  $ objectManager ;
2731
2832    /** @var SubscriberFactory */ 
2933    private  $ subscriberFactory ;
3034
31-     /** @var TransportBuilderMock   */ 
35+     /** @var TransportBuilderMock */ 
3236    private  $ transportBuilder ;
3337
3438    /** @var CustomerRepositoryInterface */ 
@@ -89,27 +93,20 @@ public function testUnsubscribeSubscribe(): void
8993        $ subscriber  = $ this  ->subscriberFactory ->create ();
9094        $ this  ->assertSame ($ subscriber , $ subscriber ->loadByCustomerId (1 ));
9195        $ this  ->assertEquals ($ subscriber , $ subscriber ->unsubscribe ());
92-         $ this  ->assertStringContainsString (
93-             ' You have been unsubscribed from the newsletter. '  ,
94-             $ this  ->getFilteredRawMessage ( $ this -> transportBuilder )
96+         $ this  ->assertConfirmationParagraphExists (
97+             self :: CONFIRMATION_UNSUBSCRIBE ,
98+             $ this  ->transportBuilder -> getSentMessage ( )
9599        );
100+ 
96101        $ this  ->assertEquals (Subscriber::STATUS_UNSUBSCRIBED , $ subscriber ->getSubscriberStatus ());
97102        // Subscribe and verify 
98103        $ this  ->assertEquals (Subscriber::STATUS_SUBSCRIBED , $ subscriber ->subscribe ('customer@example.com ' ));
99104        $ this  ->assertEquals (Subscriber::STATUS_SUBSCRIBED , $ subscriber ->getSubscriberStatus ());
100-         $ this  ->assertStringContainsString (
101-             'You have been successfully subscribed to our newsletter. ' ,
102-             $ this  ->getFilteredRawMessage ($ this  ->transportBuilder )
103-         );
104-     }
105105
106-     /** 
107-      * @param TransportBuilderMock $transportBuilderMock 
108-      * @return string 
109-      */ 
110-     private  function  getFilteredRawMessage (TransportBuilderMock   $ transportBuilderMock ): string 
111-     {
112-         return  $ transportBuilderMock ->getSentMessage ()->getBody ()->getParts ()[0 ]->getRawContent ();
106+         $ this  ->assertConfirmationParagraphExists (
107+             self ::CONFIRMATION_SUBSCRIBE ,
108+             $ this  ->transportBuilder ->getSentMessage ()
109+         );
113110    }
114111
115112    /** 
@@ -125,16 +122,17 @@ public function testUnsubscribeSubscribeByCustomerId(): void
125122        // Unsubscribe and verify 
126123        $ this  ->assertSame ($ subscriber , $ subscriber ->unsubscribeCustomerById (1 ));
127124        $ this  ->assertEquals (Subscriber::STATUS_UNSUBSCRIBED , $ subscriber ->getSubscriberStatus ());
128-         $ this  ->assertStringContainsString (
129-             ' You have been unsubscribed from the newsletter. '  ,
130-             $ this  ->getFilteredRawMessage ( $ this -> transportBuilder )
125+         $ this  ->assertConfirmationParagraphExists (
126+             self :: CONFIRMATION_UNSUBSCRIBE ,
127+             $ this  ->transportBuilder -> getSentMessage ( )
131128        );
129+ 
132130        // Subscribe and verify 
133131        $ this  ->assertSame ($ subscriber , $ subscriber ->subscribeCustomerById (1 ));
134132        $ this  ->assertEquals (Subscriber::STATUS_SUBSCRIBED , $ subscriber ->getSubscriberStatus ());
135-         $ this  ->assertStringContainsString (
136-             ' You have been successfully subscribed to our newsletter. '  ,
137-             $ this  ->getFilteredRawMessage ( $ this -> transportBuilder )
133+         $ this  ->assertConfirmationParagraphExists (
134+             self :: CONFIRMATION_SUBSCRIBE ,
135+             $ this  ->transportBuilder -> getSentMessage ( )
138136        );
139137    }
140138
@@ -152,9 +150,10 @@ public function testConfirm(): void
152150        $ subscriber ->subscribe ($ customerEmail );
153151        $ subscriber ->loadByEmail ($ customerEmail );
154152        $ subscriber ->confirm ($ subscriber ->getSubscriberConfirmCode ());
155-         $ this  ->assertStringContainsString (
156-             'You have been successfully subscribed to our newsletter. ' ,
157-             $ this  ->getFilteredRawMessage ($ this  ->transportBuilder )
153+ 
154+         $ this  ->assertConfirmationParagraphExists (
155+             self ::CONFIRMATION_SUBSCRIBE ,
156+             $ this  ->transportBuilder ->getSentMessage ()
158157        );
159158    }
160159
@@ -189,4 +188,35 @@ public function testSubscribeUnconfirmedCustomerWithoutSubscription(): void
189188        $ subscriber ->subscribeCustomerById ($ customer ->getId ());
190189        $ this  ->assertEquals (Subscriber::STATUS_UNCONFIRMED , $ subscriber ->getStatus ());
191190    }
191+ 
192+     /** 
193+      * Verifies if Paragraph with specified message is in e-mail 
194+      * 
195+      * @param string $expectedMessage 
196+      * @param EmailMessage $message 
197+      */ 
198+     private  function  assertConfirmationParagraphExists (string  $ expectedMessage , EmailMessage   $ message ): void 
199+     {
200+         $ messageContent  = $ this  ->getMessageRawContent ($ message );
201+ 
202+         $ emailDom  = new  \DOMDocument ();
203+         $ emailDom ->loadHTML ($ messageContent );
204+ 
205+         $ emailXpath  = new  \DOMXPath ($ emailDom );
206+         $ greeting  = $ emailXpath ->query ("//p[contains(text(), ' $ expectedMessage')] " );
207+ 
208+         $ this  ->assertSame (1 , $ greeting ->length , "Cannot find the confirmation paragraph in e-mail contents " );
209+     }
210+ 
211+     /** 
212+      * Returns raw content of provided message 
213+      * 
214+      * @param EmailMessage $message 
215+      * @return string 
216+      */ 
217+     private  function  getMessageRawContent (EmailMessage   $ message ): string 
218+     {
219+         $ emailParts  = $ message ->getBody ()->getParts ();
220+         return  current ($ emailParts )->getRawContent ();
221+     }
192222}
0 commit comments