Files
piratepoet/mailpoet/tests/integration/Config/MigratorTest.php
John Oleksowicz 82a6fb8ac7 Refactor migrator to be a DI service
[MAILPOET-4061]
2022-02-07 14:37:08 +01:00

126 lines
6.4 KiB
PHP

<?php
namespace MailPoet\Test\Config;
use MailPoet\Config\Migrator;
use MailPoet\Entities\DynamicSegmentFilterData;
use MailPoet\Entities\DynamicSegmentFilterEntity;
use MailPoet\Segments\DynamicSegments\Filters\EmailAction;
use MailPoet\Settings\SettingsController;
class MigratorTest extends \MailPoetTest {
/** @var Migrator */
private $migrator;
/** @var SettingsController */
private $settings;
public function _before() {
parent::_before();
$this->migrator = $this->diContainer->get(Migrator::class);
$this->settings = $this->diContainer->get(SettingsController::class);
$this->truncateEntity(DynamicSegmentFilterEntity::class);
}
public function testItCanGenerateTheSubscribersSql() {
$subscriberSql = $this->migrator->subscribers();
$expectedTable = $this->migrator->prefix . 'subscribers';
expect($subscriberSql)->stringContainsString($expectedTable);
}
public function testItDoesNotMigrateWhenDatabaseIsUpToDate() {
$changes = $this->migrator->up();
$this->assertIsArray($changes);
// phpcs:disable Squiz.PHP.CommentedOutCode
// $this->assertEmpty(
// $changes,
// "Expected no migrations. However, the following changes are planned:\n\t" . implode($changes, "\n\t")
// );
}
public function testItMigratesEmailMachineOpensFiltersCorrectly() {
$this->settings->set('db_version', '3.76.0');
$data = ['newsletter_id' => '1'];
$id = $this->createSegmentFilter(EmailAction::ACTION_OPENED, $data, DynamicSegmentFilterData::TYPE_EMAIL);
$this->migrator->up();
$filter = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filter);
expect($filter->getFilterData()->getAction())->equals(EmailAction::ACTION_OPENED);
expect($filter->getFilterData()->getData())->equals(['newsletters' => [1], 'operator' => 'any']);
}
public function testItMigratesEmailOpensFiltersCorrectly() {
$this->settings->set('db_version', '3.76.0');
$data = ['newsletter_id' => '1'];
$id = $this->createSegmentFilter(EmailAction::ACTION_MACHINE_OPENED, $data, DynamicSegmentFilterData::TYPE_EMAIL);
$this->migrator->up();
$filter = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filter);
expect($filter->getFilterData()->getAction())->equals(EmailAction::ACTION_MACHINE_OPENED);
expect($filter->getFilterData()->getData())->equals(['newsletters' => [1], 'operator' => 'any']);
}
public function testItMigratesEmailNotOpenedFiltersCorrectly() {
$this->settings->set('db_version', '3.76.0');
$data = ['newsletter_id' => '1'];
$id = $this->createSegmentFilter(EmailAction::ACTION_NOT_OPENED, $data, DynamicSegmentFilterData::TYPE_EMAIL);
$this->migrator->up();
$filter = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filter);
expect($filter->getFilterData()->getAction())->equals(EmailAction::ACTION_OPENED);
expect($filter->getFilterData()->getData())->equals(['newsletters' => [1], 'operator' => 'none']);
}
public function testItMigratesEmailClicksFiltersCorrectly() {
$this->settings->set('db_version', '3.76.0');
$dataNoLink = ['newsletter_id' => '1'];
$id1 = $this->createSegmentFilter(EmailAction::ACTION_CLICKED, $dataNoLink, DynamicSegmentFilterData::TYPE_EMAIL);
$dataWithLink = ['newsletter_id' => '1', 'link_id' => '2'];
$id2 = $this->createSegmentFilter(EmailAction::ACTION_CLICKED, $dataWithLink, DynamicSegmentFilterData::TYPE_EMAIL);
$this->migrator->up();
$filterNoLink = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id1);
$filterLink = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id2);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filterNoLink);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filterLink);
expect($filterNoLink->getFilterData()->getAction())->equals(EmailAction::ACTION_CLICKED);
expect($filterNoLink->getFilterData()->getData())->equals(['newsletter_id' => '1', 'operator' => 'any', 'link_ids' => []]);
expect($filterLink->getFilterData()->getAction())->equals(EmailAction::ACTION_CLICKED);
expect($filterLink->getFilterData()->getData())->equals(['newsletter_id' => '1', 'operator' => 'any', 'link_ids' => [2]]);
}
public function testItMigratesEmailNotClickedFiltersCorrectly() {
$this->settings->set('db_version', '3.76.0');
$dataNoLink = ['newsletter_id' => '1'];
$id1 = $this->createSegmentFilter(EmailAction::ACTION_NOT_CLICKED, $dataNoLink, DynamicSegmentFilterData::TYPE_EMAIL);
$dataWithLink = ['newsletter_id' => '1', 'link_id' => '2'];
$id2 = $this->createSegmentFilter(EmailAction::ACTION_NOT_CLICKED, $dataWithLink, DynamicSegmentFilterData::TYPE_EMAIL);
$this->migrator->up();
$filterNoLink = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id1);
$filterLink = $this->entityManager->find(DynamicSegmentFilterEntity::class, $id2);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filterNoLink);
$this->assertInstanceOf(DynamicSegmentFilterEntity::class, $filterLink);
expect($filterNoLink->getFilterData()->getAction())->equals(EmailAction::ACTION_CLICKED);
expect($filterNoLink->getFilterData()->getData())->equals(['newsletter_id' => '1', 'operator' => 'none', 'link_ids' => []]);
expect($filterLink->getFilterData()->getAction())->equals(EmailAction::ACTION_CLICKED);
expect($filterLink->getFilterData()->getData())->equals(['newsletter_id' => '1', 'operator' => 'none', 'link_ids' => [2]]);
}
private function createSegmentFilter(string $action, array $data, string $type, $segmentId = 1): int {
$filterTable = $this->entityManager->getClassMetadata(DynamicSegmentFilterEntity::class)->getTableName();
$this->entityManager->getConnection()->executeQuery(
"INSERT into $filterTable (segment_id, filter_data, action, filter_type)
VALUES (:segment, :filter_data, :action, :filter_type)",
[
'segment' => $segmentId,
'action' => $action,
'filter_data' => \serialize($data),
'filter_type' => $type,
]
);
return (int)$this->entityManager->getConnection()->lastInsertId();
}
public function _after() {
$this->truncateEntity(DynamicSegmentFilterEntity::class);
}
}