diff --git a/mailpoet/lib/Services/AuthorizedSenderDomainController.php b/mailpoet/lib/Services/AuthorizedSenderDomainController.php index 4778d2759d..0d75a6a2af 100644 --- a/mailpoet/lib/Services/AuthorizedSenderDomainController.php +++ b/mailpoet/lib/Services/AuthorizedSenderDomainController.php @@ -2,9 +2,11 @@ namespace MailPoet\Services; +use MailPoet\Mailer\Mailer; use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository; use MailPoet\Services\Bridge\API; use MailPoet\Settings\SettingsController; +use MailPoet\Util\License\Features\Subscribers; use MailPoetVendor\Carbon\Carbon; class AuthorizedSenderDomainController { @@ -42,14 +44,19 @@ class AuthorizedSenderDomainController { /** @var null|array */ private $currentRawData = null; + /** @var Subscribers */ + private $subscribers; + public function __construct( Bridge $bridge, NewsletterStatisticsRepository $newsletterStatisticsRepository, - SettingsController $settingsController + SettingsController $settingsController, + Subscribers $subscribers ) { $this->bridge = $bridge; $this->newsletterStatisticsRepository = $newsletterStatisticsRepository; $this->settingsController = $settingsController; + $this->subscribers = $subscribers; } /** @@ -276,4 +283,21 @@ class AuthorizedSenderDomainController { return $this->newsletterStatisticsRepository->countBy([]) === 0; } + + public function isSmallSender(): bool { + return $this->subscribers->getSubscribersCount() <= self::LOWER_LIMIT; + } + + public function isAuthorizedDomainRequiredForNewCampaigns(): bool { + if ($this->settingsController->get('mta.method') !== Mailer::METHOD_MAILPOET) { + return false; + } + + // TODO: Remove after the enforcement date has passed + if (!$this->isNewUser() && !$this->isEnforcementOfNewRestrictionsInEffect()) { + return false; + } + + return !$this->isSmallSender(); + } } diff --git a/mailpoet/tests/integration/Services/AuthorizedSenderDomainControllerTest.php b/mailpoet/tests/integration/Services/AuthorizedSenderDomainControllerTest.php index 9b9438e4ad..2811255410 100644 --- a/mailpoet/tests/integration/Services/AuthorizedSenderDomainControllerTest.php +++ b/mailpoet/tests/integration/Services/AuthorizedSenderDomainControllerTest.php @@ -13,6 +13,7 @@ use MailPoet\Settings\SettingsController; use MailPoet\Test\DataFactories\Newsletter; use MailPoet\Test\DataFactories\StatisticsNewsletters; use MailPoet\Test\DataFactories\Subscriber; +use MailPoet\Util\License\Features\Subscribers; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; @@ -291,9 +292,10 @@ class AuthorizedSenderDomainControllerTest extends \MailPoetTest { $this->assertSame('jane.doe=gmail.com@replies.sendingservice.net', $this->getController()->getRewrittenEmailAddress($email)); } - private function getController($bridgeMock = null): AuthorizedSenderDomainController { + private function getController($bridgeMock = null, $subscribersMock = null): AuthorizedSenderDomainController { $newsletterStatisticsRepository = $this->diContainer->get(NewsletterStatisticsRepository::class); - return new AuthorizedSenderDomainController($bridgeMock ?? $this->bridge, $newsletterStatisticsRepository, $this->settings); + $subscribers = $this->diContainer->get(Subscribers::class); + return new AuthorizedSenderDomainController($bridgeMock ?? $this->bridge, $newsletterStatisticsRepository, $this->settings, $subscribersMock ?? $subscribers); } public function testUserIsNewIfTheyHaveNotCompletedWelcomeWizard(): void { @@ -325,4 +327,92 @@ class AuthorizedSenderDomainControllerTest extends \MailPoetTest { Carbon::setTestNow(Carbon::parse('2024-02-01 00:00:01 UTC')); $this->assertTrue($this->getController()->isEnforcementOfNewRestrictionsInEffect()); } + + public function testIsSmallSenderIfSubscribersUnderLowerLimit(): void { + $subscribersMock = $this->make(Subscribers::class, [ + 'getSubscribersCount' => Expected::once(500), + ]); + + $this->assertTrue($this->getController(null, $subscribersMock)->isSmallSender()); + } + + public function testIsNotSmallSenderIfSubscribersOverLowerLimit(): void { + $subscribersMock = $this->make(Subscribers::class, [ + 'getSubscribersCount' => Expected::once(501), + ]); + + $this->assertFalse($this->getController(null, $subscribersMock)->isSmallSender()); + } + + public function testIsAuthorizedDomainRequiredForNewCampaigns(): void { + // Is new user + $this->settings->set('version', MAILPOET_VERSION); + $this->settings->set('installed_after_new_domain_restrictions', '1'); + + // Is big sender + $subscribersMock = $this->make(Subscribers::class, [ + 'getSubscribersCount' => Expected::once(501), + ]); + + $this->assertTrue($this->getController(null, $subscribersMock)->isAuthorizedDomainRequiredForNewCampaigns()); + } + + public function testNotIsAuthorizedDomainRequiredForNewCampaignsForExistingUsersBeforeEnforcementDate(): void { + // Is not new user + $this->settings->set('version', MAILPOET_VERSION); + $this->settings->delete('installed_after_new_domain_restrictions'); + (new StatisticsNewsletters((new Newsletter())->withSendingQueue()->create(), (new Subscriber())->create()))->create(); + + // Before EnforcementDate + Carbon::setTestNow(Carbon::parse('2024-01-31 00:00:00 UTC')); + + $this->assertFalse($this->getController()->isAuthorizedDomainRequiredForNewCampaigns()); + } + + public function testIsAuthorizedDomainRequiredForNewCampaignsForExistingUsersAfterEnforcementDate(): void { + // Is not new user + $this->settings->set('version', MAILPOET_VERSION); + $this->settings->delete('installed_after_new_domain_restrictions'); + (new StatisticsNewsletters((new Newsletter())->withSendingQueue()->create(), (new Subscriber())->create()))->create(); + + // After EnforcementDate + Carbon::setTestNow(Carbon::parse('2024-02-01 00:00:01 UTC')); + + // Is big sender + $subscribersMock = $this->make(Subscribers::class, [ + 'getSubscribersCount' => Expected::once(501), + ]); + + $this->assertTrue($this->getController(null, $subscribersMock)->isAuthorizedDomainRequiredForNewCampaigns()); + } + + public function testNotIsAuthorizedDomainRequiredForNewCampaignsForSmallSenders(): void { + // Is not new user + $this->settings->set('version', MAILPOET_VERSION); + $this->settings->delete('installed_after_new_domain_restrictions'); + (new StatisticsNewsletters((new Newsletter())->withSendingQueue()->create(), (new Subscriber())->create()))->create(); + + // After EnforcementDate + Carbon::setTestNow(Carbon::parse('2024-02-01 00:00:01 UTC')); + + // Is small sender + $subscribersMock = $this->make(Subscribers::class, [ + 'getSubscribersCount' => Expected::once(500), + ]); + + $this->assertFalse($this->getController(null, $subscribersMock)->isAuthorizedDomainRequiredForNewCampaigns()); + } + + public function testNotIsAuthorizedDomainRequiredForNewCampaignsForNewUsersSmallSenders(): void { + // Is new user + $this->settings->set('version', MAILPOET_VERSION); + $this->settings->set('installed_after_new_domain_restrictions', '1'); + + // Is small sender + $subscribersMock = $this->make(Subscribers::class, [ + 'getSubscribersCount' => Expected::once(500), + ]); + + $this->assertFalse($this->getController(null, $subscribersMock)->isAuthorizedDomainRequiredForNewCampaigns()); + } }