diff --git a/lib/Segments/SegmentsRepository.php b/lib/Segments/SegmentsRepository.php index 0dd6aa623e..f09a3dfa11 100644 --- a/lib/Segments/SegmentsRepository.php +++ b/lib/Segments/SegmentsRepository.php @@ -3,6 +3,7 @@ namespace MailPoet\Segments; use DateTime; +use MailPoet\ConflictException; use MailPoet\Doctrine\Repository; use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; @@ -94,6 +95,8 @@ class SegmentsRepository extends Repository { /** * @param DynamicSegmentFilterData[] $filtersData + * @throws ConflictException + * @throws NotFoundException */ public function createOrUpdate( string $name, @@ -110,6 +113,9 @@ class SegmentsRepository extends Repository { $segment->setName($name); $segment->setDescription($description); } else { + if (!$this->isNameUnique($name, $id)) { + throw new ConflictException("Could not create new segment with name [{$name}] because a segment with that name already exists."); + } $segment = new SegmentEntity($name, $type, $description); $this->persist($segment); } diff --git a/tests/integration/Segments/SegmentsRepositoryTest.php b/tests/integration/Segments/SegmentsRepositoryTest.php index a8647e52b1..73aad0f1d7 100644 --- a/tests/integration/Segments/SegmentsRepositoryTest.php +++ b/tests/integration/Segments/SegmentsRepositoryTest.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments; +use MailPoet\ConflictException; use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\NewsletterEntity; @@ -107,6 +108,14 @@ class SegmentsRepositoryTest extends \MailPoetTest { expect($count)->equals(2); } + public function testItChecksForDuplicateNameWhenCreatingNewSegment() { + $this->createDefaultSegment('Existing Segment'); + $this->segmentsRepository->flush(); + $this->expectException(ConflictException::class); + $this->expectExceptionMessage("Could not create new segment with name [Existing Segment] because a segment with that name already exists."); + $this->segmentsRepository->createOrUpdate('Existing Segment'); + } + private function createDefaultSegment(string $name): SegmentEntity { $segment = new SegmentEntity($name, SegmentEntity::TYPE_DEFAULT, 'description'); $this->entityManager->persist($segment);