Files
piratepoet/tests/integration/Newsletter/Listing/NewsletterListingRepositoryTest.php
2020-03-11 17:06:02 +00:00

308 lines
11 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\Newsletter\Listing;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterOptionEntity;
use MailPoet\Entities\NewsletterOptionFieldEntity;
use MailPoet\Entities\NewsletterSegmentEntity;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Listing\Handler;
use MailPoet\Models\Newsletter;
class NewsletterListingRepositoryTest extends \MailPoetTest {
public function testItAppliesGroup() {
$newsletter = new NewsletterEntity();
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setSubject('Newsletter subject');
$this->entityManager->persist($newsletter);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// all/trash groups
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['group' => 'all']));
expect($newsletters)->count(1);
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['group' => 'trash']));
expect($newsletters)->count(0);
// mark the newsletter sent
$newsletter->setStatus(NewsletterEntity::STATUS_SENT);
$this->entityManager->flush();
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['group' => 'sent']));
expect($newsletters)->count(1);
// delete the newsletter
$newsletter->setDeletedAt(new \DateTime());
$this->entityManager->flush();
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['group' => 'all']));
expect($newsletters)->count(0);
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['group' => 'trash']));
expect($newsletters)->count(1);
}
public function testItAppliesSearch() {
$newsletter = new NewsletterEntity();
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setSubject('Search for "pineapple" here');
$this->entityManager->persist($newsletter);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['search' => 'pineapple']));
expect($newsletters)->count(1);
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['search' => 'tomato']));
expect($newsletters)->count(0);
}
public function testItAppliesSegmentFilter() {
$newsletter = new NewsletterEntity();
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setSubject('Newsletter without segment');
$this->entityManager->persist($newsletter);
$segment = new SegmentEntity();
$segment->setName('Segment');
$segment->setType(SegmentEntity::TYPE_DEFAULT);
$segment->setDescription('Segment description');
$this->entityManager->persist($segment);
$newsletter = new NewsletterEntity();
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setSubject('Newsletter with segment');
$this->entityManager->persist($newsletter);
$newsletterSegment = new NewsletterSegmentEntity();
$newsletterSegment->setSegment($segment);
$newsletterSegment->setNewsletter($newsletter);
$this->entityManager->persist($newsletterSegment);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// without filter
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([]));
expect($newsletters)->count(2);
// with filter
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'filter' => [
'segment' => $segment->getId(),
],
]));
expect($newsletters)->count(1);
}
public function testItAppliesTypeParameter() {
$newsletter = new NewsletterEntity();
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setSubject('Newsletter subject');
$this->entityManager->persist($newsletter);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// without type
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([]));
expect($newsletters)->count(1);
// with 'standard' type
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'params' => [
'type' => 'standard',
],
]));
expect($newsletters)->count(1);
// with 'welcome' type
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'params' => [
'type' => 'welcome',
],
]));
expect($newsletters)->count(0);
}
public function testItAppliesAutomaticEmailsGroupParameter() {
$newsletterOptionField = new NewsletterOptionFieldEntity();
$newsletterOptionField->setName('group');
$newsletterOptionField->setNewsletterType(NewsletterEntity::TYPE_AUTOMATIC);
$this->entityManager->persist($newsletterOptionField);
$newsletter1 = new NewsletterEntity();
$newsletter1->setType(NewsletterEntity::TYPE_AUTOMATIC);
$newsletter1->setSubject('Automatic email 1');
$this->entityManager->persist($newsletter1);
$newsletter1Option = new NewsletterOptionEntity();
$newsletter1Option->setNewsletter($newsletter1);
$newsletter1Option->setOptionField($newsletterOptionField);
$newsletter1Option->setValue('woocommerce');
$this->entityManager->persist($newsletter1Option);
$newsletter2 = new NewsletterEntity();
$newsletter2->setType(NewsletterEntity::TYPE_AUTOMATIC);
$newsletter2->setSubject('Automatic email 2');
$this->entityManager->persist($newsletter2);
$newsletter2Option = new NewsletterOptionEntity();
$newsletter2Option->setNewsletter($newsletter2);
$newsletter2Option->setOptionField($newsletterOptionField);
$newsletter2Option->setValue('unicorns');
$this->entityManager->persist($newsletter2Option);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// get 'woocommerce' group
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'params' => [
'type' => Newsletter::TYPE_AUTOMATIC,
'group' => 'woocommerce',
],
]));
expect($newsletters)->count(1);
// get 'unicorns' group
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'params' => [
'type' => Newsletter::TYPE_AUTOMATIC,
'group' => 'unicorns',
],
]));
expect($newsletters)->count(1);
// get all emails group
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition(['type' => Newsletter::TYPE_AUTOMATIC]));
expect($newsletters)->count(2);
}
public function testItAppliesParentIdParameter() {
$parent = new NewsletterEntity();
$parent->setType(NewsletterEntity::TYPE_NOTIFICATION);
$parent->setSubject('Newsletter subject');
$this->entityManager->persist($parent);
$newsletter = new NewsletterEntity();
$newsletter->setParent($parent);
$newsletter->setType(NewsletterEntity::TYPE_NOTIFICATION_HISTORY);
$newsletter->setSubject('Newsletter subject');
$this->entityManager->persist($newsletter);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// existing parent ID
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'params' => [
'parent_id' => (string)$parent->getId(),
],
]));
expect($newsletters)->count(1);
// non-existent parent ID
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'params' => [
'parent_id' => (string)$newsletter->getId(),
],
]));
expect($newsletters)->count(0);
}
public function testItAppliesSort() {
$newsletter1 = new NewsletterEntity();
$newsletter1->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter1->setSubject('Newsletter A');
$this->entityManager->persist($newsletter1);
$newsletter2 = new NewsletterEntity();
$newsletter2->setType(NewsletterEntity::TYPE_WELCOME);
$newsletter2->setSubject('Newsletter B');
$this->entityManager->persist($newsletter2);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// ASC
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'sort_by' => 'subject',
'sort_order' => 'asc',
]));
expect($newsletters)->count(2);
expect($newsletters[0]->getSubject())->same('Newsletter A');
expect($newsletters[1]->getSubject())->same('Newsletter B');
// DESC
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'sort_by' => 'subject',
'sort_order' => 'desc',
]));
expect($newsletters)->count(2);
expect($newsletters[0]->getSubject())->same('Newsletter B');
expect($newsletters[1]->getSubject())->same('Newsletter A');
}
public function testItAppliesLimitAndOffset() {
$newsletter1 = new NewsletterEntity();
$newsletter1->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter1->setSubject('Newsletter A');
$this->entityManager->persist($newsletter1);
$newsletter2 = new NewsletterEntity();
$newsletter2->setType(NewsletterEntity::TYPE_WELCOME);
$newsletter2->setSubject('Newsletter B');
$this->entityManager->persist($newsletter2);
$this->entityManager->flush();
$listingHandler = new Handler();
$newsletterListingRepository = $this->diContainer->get(NewsletterListingRepository::class);
// first page
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'limit' => 1,
'offset' => 0,
]));
expect($newsletters)->count(1);
expect($newsletters[0]->getSubject())->same('Newsletter A');
// second page
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'limit' => 1,
'offset' => 1,
]));
expect($newsletters)->count(1);
expect($newsletters[0]->getSubject())->same('Newsletter B');
// third page
$newsletters = $newsletterListingRepository->getData($listingHandler->getListingDefinition([
'limit' => 1,
'offset' => 2,
]));
expect($newsletters)->count(0);
}
public function _after() {
$this->truncateEntity(NewsletterEntity::class);
$this->truncateEntity(SegmentEntity::class);
$this->truncateEntity(NewsletterSegmentEntity::class);
}
}