diff --git a/tests/integration/Segments/SegmentSubscribersRepositoryTest.php b/tests/integration/Segments/SegmentSubscribersRepositoryTest.php new file mode 100644 index 0000000000..78de278b61 --- /dev/null +++ b/tests/integration/Segments/SegmentSubscribersRepositoryTest.php @@ -0,0 +1,142 @@ +repository = $this->diContainer->get(SegmentSubscribersRepository::class); + $this->cleanup(); + } + + public function testItReturnsOnlySubscribedSubscribersForStaticSegment() { + $segment = $this->createSegmentEntity(); + + $this->createSubscriberEntity(); // Subscriber without segment + + $subscriberInSegment = $this->createSubscriberEntity(); + $subscriberInSegment->getSegments()->add( + $this->createSubscriberSegmentEntity($segment, $subscriberInSegment) + ); + + $globallyUnsubscribedSubscriberInSegment = $this->createSubscriberEntity(); + $subscriberInSegment->getSegments()->add( + $this->createSubscriberSegmentEntity($segment, $globallyUnsubscribedSubscriberInSegment) + ); + $globallyUnsubscribedSubscriberInSegment->setStatus(SubscriberEntity::STATUS_UNSUBSCRIBED); + + $unsubscribedSubscriberInSegment = $this->createSubscriberEntity(); + $subscriberSegment = $this->createSubscriberSegmentEntity($segment, $unsubscribedSubscriberInSegment); + $subscriberSegment->setStatus(SubscriberEntity::STATUS_UNSUBSCRIBED); + $subscriberInSegment->getSegments()->add( + $subscriberSegment + ); + $this->entityManager->flush(); + + $count = $this->repository->getSubscribersCount((int)$segment->getId()); + expect($count)->equals(1); + $ids = $this->repository->getSubscriberIdsInSegment((int)$segment->getId()); + expect($ids)->equals([$subscriberInSegment->getId()]); + $filteredIds = $this->repository->findSubscribersIdsInSegment((int)$segment->getId(), [$subscriberInSegment->getId(), 20, 30]); + expect($filteredIds)->equals([$subscriberInSegment->getId()]); + $filteredIds = $this->repository->findSubscribersIdsInSegment((int)$segment->getId(), [$globallyUnsubscribedSubscriberInSegment->getId()]); + expect($filteredIds)->equals([]); + } + + public function testItReturnsSubscibersInDynamicSegments() { + $segment = $this->createDynamicSegmentEntity(); + + $wpUserEmail = 'user-role-test1@example.com'; + $this->cleanupWpUser($wpUserEmail); + wp_insert_user([ + 'user_login' => 'user-role-test1', + 'user_email' => $wpUserEmail, + 'role' => 'editor', + 'user_pass' => '12123154', + ]); + $wpUserSubscriber = $this->entityManager + ->getRepository(SubscriberEntity::class) + ->findOneBy(['email' => $wpUserEmail]); + assert($wpUserSubscriber instanceof SubscriberEntity); + $subscriberNoList = $this->createSubscriberEntity(); // Subscriber without segment + $this->entityManager->flush(); + + $count = $this->repository->getSubscribersCount((int)$segment->getId()); + expect($count)->equals(1); + $ids = $this->repository->getSubscriberIdsInSegment((int)$segment->getId()); + expect($ids)->equals([$wpUserSubscriber->getId()]); + $filteredIds = $this->repository->findSubscribersIdsInSegment((int)$segment->getId(), [$wpUserSubscriber->getId(), 20, 30]); + expect($filteredIds)->equals([$wpUserSubscriber->getId()]); + $filteredIds = $this->repository->findSubscribersIdsInSegment((int)$segment->getId(), [$subscriberNoList->getId()]); + expect($filteredIds)->equals([]); + + $this->cleanupWpUser($wpUserEmail); + } + + public function _after() { + parent::_after(); + $this->cleanup(); + } + + private function createSubscriberEntity(): SubscriberEntity { + $subscriber = new SubscriberEntity(); + $rand = rand(0, 100000); + $subscriber->setEmail("john{$rand}@mailpoet.com"); + $subscriber->setFirstName('John'); + $subscriber->setLastName('Doe'); + $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriber->setSource(Source::API); + $this->entityManager->persist($subscriber); + return $subscriber; + } + + private function createSegmentEntity(): SegmentEntity { + $segment = new SegmentEntity('Segment' . rand(0, 10000), SegmentEntity::TYPE_DEFAULT, 'Segment description'); + $this->entityManager->persist($segment); + return $segment; + } + + private function createSubscriberSegmentEntity(SegmentEntity $segment, SubscriberEntity $subscriber): SubscriberSegmentEntity { + $subscriberSegment = new SubscriberSegmentEntity($segment, $subscriber, SubscriberEntity::STATUS_SUBSCRIBED); + $this->entityManager->persist($subscriberSegment); + return $subscriberSegment; + } + + private function createDynamicSegmentEntity(): SegmentEntity { + $segment = new SegmentEntity('Segment' . rand(0, 10000), SegmentEntity::TYPE_DYNAMIC, 'Segment description'); + $dynamicFilter = new DynamicSegmentFilterEntity($segment, [ + 'wordpressRole' => 'editor', + 'segmentType' => DynamicSegmentFilterEntity::TYPE_USER_ROLE, + ]); + $segment->getDynamicFilters()->add($dynamicFilter); + $this->entityManager->persist($segment); + $this->entityManager->persist($dynamicFilter); + return $segment; + } + + private function cleanupWpUser(string $email) { + $user = get_user_by('email', $email); + if ($user) { + wp_delete_user($user->ID); + } + } + + private function cleanup() { + $this->truncateEntity(SegmentEntity::class); + $this->truncateEntity(SubscriberEntity::class); + $this->truncateEntity(SubscriberSegmentEntity::class); + $this->truncateEntity(DynamicSegmentFilterEntity::class); + } +}