cleanup(); $this->homepageDataController = $this->diContainer->get(HomepageDataController::class); } public function testItFetchesBasicData(): void { $data = $this->homepageDataController->getPageData(); expect($data)->notEmpty(); expect($data['taskListDismissed'])->false(); expect($data['productDiscoveryDismissed'])->false(); expect($data['taskListStatus'])->array(); expect($data['taskListStatus'])->notEmpty(); expect($data['productDiscoveryStatus'])->array(); expect($data['productDiscoveryStatus'])->notEmpty(); expect($data['wooCustomersCount'])->int(); expect($data['subscribersCount'])->int(); expect($data['subscribersStats'])->array(); expect($data['taskListStatus'])->notEmpty(); } public function testItFetchesSenderTaskListStatus(): void { $settings = $this->diContainer->get(SettingsController::class); $settings->set('sender', null); $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['senderSet'])->false(); $settings->set('sender.address', 'test@email.com'); $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['senderSet'])->false(); $settings->set('sender.name', 'John Doe'); $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['senderSet'])->true(); } public function testItDoesntFetchTaskListStatusWhenTaskListDismissed(): void { $settings = $this->diContainer->get(SettingsController::class); $settings->set('homepage.task_list_dismissed', true); $data = $this->homepageDataController->getPageData(); expect($data['taskListStatus'])->null(); } public function testItFetchesSubscribersAddedTaskListStatus(): void { $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['subscribersAdded'])->false(); $form = (new Form())->create(); $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['subscribersAdded'])->true(); $this->entityManager->remove($form); $this->entityManager->flush($form); $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['subscribersAdded'])->false(); for ($x = 0; $x <= 11; $x++) { (new Subscriber())->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)->create(); } $data = $this->homepageDataController->getPageData(); $taskListStatus = $data['taskListStatus']; expect($taskListStatus['subscribersAdded'])->true(); } public function testItFetchesProductDiscoveryStatusForWelcomeCampaign(): void { $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['setUpWelcomeCampaign'])->false(); // Not done when welcome newsletter is activated $newsletter = (new Newsletter()) ->withType(NewsletterEntity::TYPE_WELCOME) ->withStatus(NewsletterEntity::STATUS_DRAFT) ->create(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['setUpWelcomeCampaign'])->false(); // Done when welcome newsletter is active $newsletter->setStatus(NewsletterEntity::STATUS_ACTIVE); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['setUpWelcomeCampaign'])->true(); } public function testItFetchesProductDiscoveryStatusSentNewsletters(): void { $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->false(); // Not done when standard newsletter is draft $newsletter = (new Newsletter()) ->withType(NewsletterEntity::TYPE_STANDARD) ->withStatus(NewsletterEntity::STATUS_DRAFT) ->create(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->false(); // Done when standard newsletter is scheduled $newsletter->setStatus(NewsletterEntity::STATUS_SCHEDULED); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->true(); // Done when standard newsletter is sent $newsletter->setStatus(NewsletterEntity::STATUS_SENT); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->true(); // Not done when post notification is draft $newsletter->setStatus(NewsletterEntity::STATUS_DRAFT); $newsletter->setType(NewsletterEntity::TYPE_NOTIFICATION); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->false(); // Done when post notification is active $newsletter->setStatus(NewsletterEntity::STATUS_ACTIVE); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->true(); // Done when automatic email active $newsletter->setType(NewsletterEntity::TYPE_AUTOMATIC); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['sendFirstNewsletter'])->true(); } public function testItFetchesProductDiscoveryStatusSetUpAbandonedCartEmail(): void { $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['setUpAbandonedCartEmail'])->false(); $newsletter = (new Newsletter()) ->withAutomaticTypeWooCommerceAbandonedCart() ->withStatus(NewsletterEntity::STATUS_DRAFT) ->create(); // Not done when abandoned cart email is draft $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['setUpAbandonedCartEmail'])->false(); // Done when abandoned cart email is active $newsletter->setStatus(NewsletterEntity::STATUS_ACTIVE); $this->entityManager->flush(); $productDiscoveryStatus = $this->homepageDataController->getPageData()['productDiscoveryStatus']; expect($productDiscoveryStatus['setUpAbandonedCartEmail'])->true(); } public function testItFetchesSubscriberStatsForZeroSubscribers(): void { $subscribersStats = $this->homepageDataController->getPageData()['subscribersStats']; expect($subscribersStats['global']['subscribed'])->equals(0); expect($subscribersStats['global']['unsubscribed'])->equals(0); } public function testItFetchesCorrectGlobalSubscriberStats(): void { $thirtyOneDaysAgo = Carbon::now()->subDays(31); $twentyNineDaysAgo = Carbon::now()->subDays(29); // Old subscribed (new Subscriber())->withCreatedAt($thirtyOneDaysAgo)->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)->create(); // New subscribed (new Subscriber())->withCreatedAt($twentyNineDaysAgo)->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)->create(); // Unsubscribed long time ago $oldUnsubscribed = (new Subscriber())->withCreatedAt($thirtyOneDaysAgo)->withStatus(SubscriberEntity::STATUS_UNSUBSCRIBED)->create(); $oldUnsubscribedStats = new StatisticsUnsubscribeEntity(null, null, $oldUnsubscribed); $oldUnsubscribedStats->setCreatedAt($thirtyOneDaysAgo); $this->entityManager->persist($oldUnsubscribedStats); $this->entityManager->flush(); // Freshly unsubscribed $newUnsubscribed = (new Subscriber())->withCreatedAt($twentyNineDaysAgo)->withStatus(SubscriberEntity::STATUS_UNSUBSCRIBED)->create(); $newUnsubscribedStats = new StatisticsUnsubscribeEntity(null, null, $newUnsubscribed); $newUnsubscribedStats->setCreatedAt($twentyNineDaysAgo); $this->entityManager->persist($newUnsubscribedStats); $this->entityManager->flush(); $subscribersStats = $this->homepageDataController->getPageData()['subscribersStats']; expect($subscribersStats['global']['subscribed'])->equals(1); expect($subscribersStats['global']['unsubscribed'])->equals(1); } private function cleanup(): void { $this->truncateEntity(SettingEntity::class); $this->truncateEntity(SubscriberEntity::class); $this->truncateEntity(FormEntity::class); $this->truncateEntity(NewsletterEntity::class); $this->truncateEntity(NewsletterOptionFieldEntity::class); $this->truncateEntity(NewsletterOptionEntity::class); } }