saveController = $this->diContainer->get(SegmentSaveController::class); $this->subscriberSegmentRepository = $this->diContainer->get(SubscriberSegmentRepository::class); } public function testItCanSaveASegment(): void { $segmentData = [ 'name' => 'Segment one', 'description' => 'Description', ]; $segment = $this->saveController->save($segmentData); verify($segment->getName())->equals('Segment one'); verify($segment->getDescription())->equals('Description'); verify($segment->getType())->equals(SegmentEntity::TYPE_DEFAULT); } public function testItDuplicatesSegment(): void { $segment = $this->createSegment('Segment two'); $subscriber1 = $this->createSubscriber('subscribed@mailpoet.com'); $subscriber2 = $this->createSubscriber('unsubscribed@mailpoet.com'); $subscriberSegment1 = $this->createSubscriberSegment($subscriber1, $segment, SubscriberEntity::STATUS_SUBSCRIBED); $subscriberSegment2 = $this->createSubscriberSegment($subscriber2, $segment, SubscriberEntity::STATUS_UNSUBSCRIBED); $duplicate = $this->saveController->duplicate($segment); $subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $duplicate]); $subscriberDuplicate1 = $this->subscriberSegmentRepository->findOneBy(['segment' => $duplicate, 'subscriber' => $subscriber1]); $subscriberDuplicate2 = $this->subscriberSegmentRepository->findOneBy(['segment' => $duplicate, 'subscriber' => $subscriber2]); $this->assertInstanceOf(SubscriberSegmentEntity::class, $subscriberDuplicate1); $this->assertInstanceOf(SubscriberSegmentEntity::class, $subscriberDuplicate2); verify($duplicate->getName())->equals('Copy of ' . $segment->getName()); verify($duplicate->getDescription())->equals($segment->getDescription()); verify($duplicate->getType())->equals($segment->getType()); verify($subscriberSegments)->arrayCount(2); verify($subscriberDuplicate1->getStatus())->equals($subscriberSegment1->getStatus()); verify($subscriberDuplicate2->getStatus())->equals($subscriberSegment2->getStatus()); } public function testItCheckDuplicateSegment(): void { $name = 'Test name'; $this->createSegment($name); $segmentData = [ 'name' => $name, 'description' => 'Description', 'filters' => [[ 'segmentType' => SegmentEntity::TYPE_DEFAULT, 'wordpressRole' => 'editor', 'action' => UserRole::TYPE, ]], ]; $this->expectException(ConflictException::class); $this->expectExceptionMessage("Could not create new segment with name [Test name] because a segment with that name already exists."); $this->saveController->save($segmentData); } private function createSegment(string $name): SegmentEntity { $segment = new SegmentEntity($name, SegmentEntity::TYPE_DEFAULT, 'description'); $this->entityManager->persist($segment); $this->entityManager->flush(); return $segment; } private function createSubscriber(string $email): SubscriberEntity { $subscriber = new SubscriberEntity(); $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); $subscriber->setEmail($email); $this->entityManager->persist($subscriber); $this->entityManager->flush(); return $subscriber; } private function createSubscriberSegment( SubscriberEntity $subscriber, SegmentEntity $segment, string $status ): SubscriberSegmentEntity { $subscriberSegment = new SubscriberSegmentEntity($segment, $subscriber, $status); $this->entityManager->persist($subscriberSegment); $this->entityManager->flush(); return $subscriberSegment; } }