segmentFactory = new SegmentFactory(); $this->subscriberFactory = new SubscriberFactory(); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); $this->subscriberSegmentRepository = $this->diContainer->get(SubscriberSegmentRepository::class); $this->subscriber = $this->subscriberFactory ->withFirstName('John') ->withLastName('Mailer') ->withEmail('john@mailpoet.com') ->create(); } public function testItSendsConfirmationEmail() { $subcriptionUrlFactoryMock = $this->createMock(SubscriptionUrlFactory::class); $subcriptionUrlFactoryMock->method('getConfirmationUrl')->willReturn('http://example.com'); $settings = $this->diContainer->get(SettingsController::class); $settings->set( 'signup_confirmation.body', $settings->get('signup_confirmation.body') . "\nLists: [lists_to_confirm]" ); $this->subscriber->setStatus('unconfirmed'); $this->subscriber->setSource('api'); $this->subscribersRepository->persist($this->subscriber); $this->subscribersRepository->flush(); $mailer = Stub::makeEmpty(Mailer::class, [ 'send' => Stub\Expected::once(function($email, $subscriber, $extraParams) { expect($email['body']['html'])->stringContainsString('Test segment'); expect($email['body']['html'])->stringContainsString('I confirm my subscription!'); expect($extraParams['meta'])->equals([ 'email_type' => 'confirmation', 'subscriber_status' => 'unconfirmed', 'subscriber_source' => 'api', ]); return ['response' => true]; }), ], $this); $sender = new ConfirmationEmailMailer( $mailer, $this->diContainer->get(WPFunctions::class), $this->diContainer->get(SettingsController::class), $this->diContainer->get(SubscribersRepository::class), $subcriptionUrlFactoryMock ); $segment = $this->segmentFactory->withName('Test segment')->create(); $this->subscriberSegmentRepository->subscribeToSegments($this->subscriber, [$segment]); $result = $sender->sendConfirmationEmail($this->subscriber); expect($result)->true(); expect($this->subscriber->getConfirmationsCount())->equals(1); $sender->sendConfirmationEmailOnce($this->subscriber); $this->subscribersRepository->refresh($this->subscriber); expect($this->subscriber->getConfirmationsCount())->equals(1); } public function testItThrowsExceptionWhenConfirmationEmailCannotBeSent() { $mailer = Stub::makeEmpty(Mailer::class, [ 'send' => Stub\Expected::once(function () { throw new \Exception('send error'); }), ], $this); $sender = new ConfirmationEmailMailer( $mailer, $this->diContainer->get(WPFunctions::class), $this->diContainer->get(SettingsController::class), $this->diContainer->get(SubscribersRepository::class), $this->diContainer->get(SubscriptionUrlFactory::class) ); $this->expectException(\Exception::class); $this->expectExceptionMessage(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet')); $sender->sendConfirmationEmail($this->subscriber); } public function testSendConfirmationEmailThrowsWhenSendReturnsFalse() { $mailer = Stub::makeEmpty(Mailer::class, [ 'send' => ['response' => false], ], $this); $sender = new ConfirmationEmailMailer( $mailer, $this->diContainer->get(WPFunctions::class), $this->diContainer->get(SettingsController::class), $this->diContainer->get(SubscribersRepository::class), $this->diContainer->get(SubscriptionUrlFactory::class) ); $this->expectException(\Exception::class); $this->expectExceptionMessage(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet')); $sender->sendConfirmationEmail($this->subscriber); } public function testItDoesntSendWhenMSSIsActiveAndConfirmationEmailIsNotAuthorized() { $mailer = $this->makeEmpty(Mailer::class, [ 'send' => Stub\Expected::never(), ]); $settings = SettingsController::getInstance(); $settings->set(AuthorizedEmailsController::AUTHORIZED_EMAIL_ADDRESSES_ERROR_SETTING, ['invalid_sender_address' => 'email@email.com']); $settings->set(Mailer::MAILER_CONFIG_SETTING_NAME, ['method' => Mailer::METHOD_MAILPOET]); $sender = new ConfirmationEmailMailer( $mailer, $this->diContainer->get(WPFunctions::class), $this->diContainer->get(SettingsController::class), $this->diContainer->get(SubscribersRepository::class), $this->diContainer->get(SubscriptionUrlFactory::class) ); $result = $sender->sendConfirmationEmail($this->subscriber); expect($result)->equals(false); $settings->set(AuthorizedEmailsController::AUTHORIZED_EMAIL_ADDRESSES_ERROR_SETTING, null); } public function testItLimitsNumberOfConfirmationEmailsForNotLoggedInUser() { wp_set_current_user(0); expect((new WPFunctions)->isUserLoggedIn())->false(); $mailer = Stub::makeEmpty(Mailer::class, [ 'send' => function() { return ['response' => true]; }, ], $this); $sender = new ConfirmationEmailMailer( $mailer, $this->diContainer->get(WPFunctions::class), $this->diContainer->get(SettingsController::class), $this->diContainer->get(SubscribersRepository::class), $this->diContainer->get(SubscriptionUrlFactory::class) ); for ($i = 0; $i < $sender::MAX_CONFIRMATION_EMAILS; $i++) { expect($sender->sendConfirmationEmail($this->subscriber))->equals(true); } expect($sender->sendConfirmationEmail($this->subscriber))->equals(false); } public function testItDoesNotLimitNumberOfConfirmationEmailsForLoggedInUser() { wp_set_current_user(1); expect((new WPFunctions)->isUserLoggedIn())->true(); $mailer = Stub::makeEmpty(Mailer::class, [ 'send' => function() { return ['response' => true]; }, ], $this); $sender = new ConfirmationEmailMailer( $mailer, $this->diContainer->get(WPFunctions::class), $this->diContainer->get(SettingsController::class), $this->diContainer->get(SubscribersRepository::class), $this->diContainer->get(SubscriptionUrlFactory::class) ); for ($i = 0; $i < $sender::MAX_CONFIRMATION_EMAILS; $i++) { expect($sender->sendConfirmationEmail($this->subscriber))->equals(true); } expect($sender->sendConfirmationEmail($this->subscriber))->equals(true); } public function _after() { $this->truncateEntity(SubscriberEntity::class); $this->truncateEntity(SegmentEntity::class); $this->truncateEntity(SubscriberSegmentEntity::class); } }