Spaces:
No application file
No application file
namespace Mautic\PageBundle\Tests\Controller; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\CoreBundle\Tests\Traits\ControllerTrait; | |
use Mautic\LeadBundle\Entity\UtmTag; | |
use Mautic\PageBundle\DataFixtures\ORM\LoadPageCategoryData; | |
use Mautic\PageBundle\DataFixtures\ORM\LoadPageData; | |
use Mautic\PageBundle\Entity\Page; | |
use Mautic\PageBundle\Model\PageModel; | |
use PHPUnit\Framework\Assert; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class PageControllerTest extends MauticMysqlTestCase | |
{ | |
use ControllerTrait; | |
/** | |
* @var string | |
*/ | |
private $prefix; | |
/** | |
* @var int | |
*/ | |
private $id; | |
/** | |
* @throws \Exception | |
*/ | |
protected function setUp(): void | |
{ | |
parent::setUp(); | |
$this->prefix = static::getContainer()->getParameter('mautic.db_table_prefix'); | |
$pageData = [ | |
'title' => 'Test Page', | |
'template' => 'blank', | |
]; | |
$model = static::getContainer()->get('mautic.page.model.page'); | |
$page = new Page(); | |
$page->setTitle($pageData['title']) | |
->setTemplate($pageData['template']); | |
$model->saveEntity($page); | |
$this->id = $page->getId(); | |
} | |
/** | |
* Index should return status code 200. | |
*/ | |
public function testIndexAction(): void | |
{ | |
$urlAlias = 'pages'; | |
$routeAlias = 'page'; | |
$column = 'dateModified'; | |
$column2 = 'title'; | |
$tableAlias = 'p.'; | |
$this->getControllerColumnTests($urlAlias, $routeAlias, $column, $tableAlias, $column2); | |
} | |
public function testLandingPageTracking(): void | |
{ | |
$this->connection->insert($this->prefix.'pages', [ | |
'is_published' => true, | |
'date_added' => (new \DateTime())->format('Y-m-d H:i:s'), | |
'title' => 'Page:Page:LandingPageTracking', | |
'alias' => 'page-page-landingPageTracking', | |
'template' => 'blank', | |
'custom_html' => 'some content', | |
'hits' => 0, | |
'unique_hits' => 0, | |
'variant_hits' => 0, | |
'revision' => 0, | |
'lang' => 'en', | |
]); | |
$leadsBeforeTest = $this->connection->fetchAllAssociative('SELECT `id` FROM `'.$this->prefix.'leads`;'); | |
$leadIdsBeforeTest = array_column($leadsBeforeTest, 'id'); | |
$this->client->request('GET', '/page-page-landingPageTracking'); | |
$this->assertEquals(200, $this->client->getResponse()->getStatusCode(), $this->client->getResponse()->getContent()); | |
$sql = 'SELECT `id` FROM `'.$this->prefix.'leads`'; | |
if (!empty($leadIdsBeforeTest)) { | |
$sql .= ' WHERE `id` NOT IN ('.implode(',', $leadIdsBeforeTest).');'; | |
} | |
$newLeads = $this->connection->fetchAllAssociative($sql); | |
$this->assertCount(1, $newLeads); | |
$leadId = reset($newLeads)['id']; | |
$leadEventLogs = $this->connection->fetchAllAssociative(' | |
SELECT `id`, `action` | |
FROM `'.$this->prefix.'lead_event_log` | |
WHERE `lead_id` = :leadId | |
AND `bundle` = "page" AND `object` = "page";', ['leadId' => $leadId] | |
); | |
$this->assertCount(1, $leadEventLogs); | |
$this->assertSame('created_contact', reset($leadEventLogs)['action']); | |
} | |
/** | |
* Skipped for now. | |
*/ | |
public function LandingPageTrackingSecondVisit(): void | |
{ | |
$this->connection->insert($this->prefix.'pages', [ | |
'is_published' => true, | |
'date_added' => (new \DateTime())->format('Y-m-d H:i:s'), | |
'title' => 'Page:Page:LandingPageTrackingSecondVisit', | |
'alias' => 'page-page-landingPageTrackingSecondVisit', | |
'template' => 'blank', | |
'hits' => 0, | |
'unique_hits' => 0, | |
'variant_hits' => 0, | |
'revision' => 0, | |
'lang' => 'en', | |
]); | |
$leadsBeforeTest = $this->connection->fetchAllAssociative('SELECT `id` FROM `'.$this->prefix.'leads`;'); | |
$leadIdsBeforeTest = array_column($leadsBeforeTest, 'id'); | |
$this->client->request('GET', '/page-page-landingPageTrackingSecondVisit'); | |
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); | |
$sql = 'SELECT `id` FROM `'.$this->prefix.'leads`'; | |
if (!empty($leadIdsBeforeTest)) { | |
$sql .= ' WHERE `id` NOT IN ('.implode(',', $leadIdsBeforeTest).');'; | |
} | |
$newLeadsAfterFirstVisit = $this->connection->fetchAllAssociative($sql); | |
$this->assertCount(1, $newLeadsAfterFirstVisit); | |
$leadId = reset($newLeadsAfterFirstVisit)['id']; | |
$eventLogsAfterFirstVisit = $this->connection->fetchAllAssociative(' | |
SELECT `id`, `action` | |
FROM `'.$this->prefix.'lead_event_log` | |
WHERE `lead_id` = :leadId | |
AND `bundle` = "page" AND `object` = "page";', ['leadId' => $leadId] | |
); | |
$this->assertCount(1, $eventLogsAfterFirstVisit); | |
$this->assertSame('created_contact', reset($eventLogsAfterFirstVisit)['action']); | |
$this->client->request('GET', '/page-page-landingPageTrackingSecondVisit'); | |
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); | |
$eventLogsAfterSecondVisit = $this->connection->fetchAllAssociative(' | |
SELECT `id`, `action` | |
FROM `'.$this->prefix.'lead_event_log` | |
WHERE `lead_id` = :leadId | |
AND `bundle` = "page" AND `object` = "page";', ['leadId' => $leadId] | |
); | |
$this->assertCount(1, $eventLogsAfterSecondVisit); | |
$this->assertSame(reset($eventLogsAfterFirstVisit)['id'], reset($eventLogsAfterSecondVisit)['id']); | |
} | |
/** | |
* Test tracking of a first visit with UTM Tags. | |
*/ | |
public function testLandingPageWithUtmTracking(): void | |
{ | |
$timestamp = \time(); | |
$page = $this->createTestPage(); | |
$this->client->request('GET', "{$page->getAlias()}?utm_source=linkedin&utm_medium=social&utm_campaign=mautic&utm_content=".$timestamp); | |
$clientResponse = $this->client->getResponse(); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode(), $clientResponse->getContent()); | |
$allUtmTags = $this->em->getRepository(UtmTag::class)->getEntities(); | |
$this->assertNotCount(0, $allUtmTags); | |
foreach ($allUtmTags as $utmTag) { | |
$this->assertSame('linkedin', $utmTag->getUtmSource(), 'utm_source does not match'); | |
$this->assertSame('social', $utmTag->getUtmMedium(), 'utm_medium does not match'); | |
$this->assertSame('mautic', $utmTag->getUtmCampaign(), 'utm_campaign does not match'); | |
$this->assertSame(strval($timestamp), $utmTag->getUtmContent(), 'utm_content does not match'); | |
} | |
} | |
/** | |
* Create a page for testing. | |
*/ | |
protected function createTestPage($pageParams = []): Page | |
{ | |
$page = new Page(); | |
$title = $pageParams['title'] ?? 'Page:Page:LandingPageTracking'; | |
$alias = $pageParams['alias'] ?? 'page-page-landingPageTracking'; | |
$isPublished = $pageParams['isPublished'] ?? true; | |
$template = $pageParams['template'] ?? 'blank'; | |
$page->setTitle($title); | |
$page->setAlias($alias); | |
$page->setIsPublished($isPublished); | |
$page->setTemplate($template); | |
$page->setCustomHtml('some content'); | |
$this->em->persist($page); | |
$this->em->flush(); | |
return $page; | |
} | |
/* | |
* Get page's view. | |
*/ | |
public function testViewActionPage(): void | |
{ | |
$this->client->request('GET', '/s/pages/view/'.$this->id); | |
$clientResponse = $this->client->getResponse(); | |
$clientResponseContent = $clientResponse->getContent(); | |
$model = static::getContainer()->get('mautic.page.model.page'); | |
$page = $model->getEntity($this->id); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode()); | |
$this->assertStringContainsString($page->getTitle(), $clientResponseContent, 'The return must contain the title of page'); | |
} | |
/** | |
* Get landing page's create page. | |
*/ | |
public function testNewActionPage(): void | |
{ | |
$this->client->request('GET', '/s/pages/new/'); | |
$clientResponse = $this->client->getResponse(); | |
$clientResponseContent = $clientResponse->getContent(); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode()); | |
} | |
/* Get landing page's submissions list */ | |
public function testListLandingPageSubmissions(): void | |
{ | |
$this->client->request('GET', 's/pages/results/'.$this->id); | |
$clientResponse = $this->client->getResponse(); | |
$clientResponseContent = $clientResponse->getContent(); | |
$model = static::getContainer()->get('mautic.page.model.page'); | |
$page = $model->getEntity($this->id); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode()); | |
} | |
/** | |
* Only tests if an actual CSV file is returned. | |
*/ | |
public function testCsvIsExportedCorrectly(): void | |
{ | |
$this->loadFixtures([LoadPageCategoryData::class, LoadPageData::class]); | |
ob_start(); | |
$this->client->request(Request::METHOD_GET, '/s/pages/results/'.$this->id.'/export'); | |
$content = ob_get_contents(); | |
ob_end_clean(); | |
$clientResponse = $this->client->getResponse(); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode()); | |
$this->assertEquals($this->client->getInternalResponse()->getHeader('content-type'), 'text/csv; charset=UTF-8'); | |
} | |
/** | |
* Only tests if an actual Excel file is returned. | |
*/ | |
public function testExcelIsExportedCorrectly(): void | |
{ | |
$this->loadFixtures([LoadPageCategoryData::class, LoadPageData::class]); | |
ob_start(); | |
$this->client->request(Request::METHOD_GET, '/s/pages/results/'.$this->id.'/export/xlsx'); | |
$content = ob_get_contents(); | |
ob_end_clean(); | |
$clientResponse = $this->client->getResponse(); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode()); | |
$this->assertEquals($this->client->getInternalResponse()->getHeader('content-type'), 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); | |
} | |
/** | |
* Only tests if an actual HTML file is returned. | |
*/ | |
public function testHTMLIsExportedCorrectly(): void | |
{ | |
$this->loadFixtures([LoadPageCategoryData::class, LoadPageData::class]); | |
ob_start(); | |
$this->client->request(Request::METHOD_GET, '/s/pages/results/'.$this->id.'/export/html'); | |
$content = ob_get_contents(); | |
ob_end_clean(); | |
$clientResponse = $this->client->getResponse(); | |
$this->assertEquals(Response::HTTP_OK, $clientResponse->getStatusCode()); | |
$this->assertEquals($this->client->getInternalResponse()->getHeader('content-type'), 'text/html; charset=UTF-8'); | |
} | |
public function testSavePageAliasWithUnderscores(): void | |
{ | |
/** @var PageModel $pageModel */ | |
$pageModel = static::getContainer()->get('mautic.page.model.page'); | |
$parentPage = new Page(); | |
$parentPage->setTitle('This is My Page'); | |
$parentPage->setAlias('This_Is_My_Page'); | |
$parentPage->setTemplate('blank'); | |
$parentPage->setCustomHtml('This is My Page'); | |
$pageModel->saveEntity($parentPage); | |
$this->client->request(Request::METHOD_GET, '/this_is_my_page'); | |
$response = $this->client->getResponse(); | |
Assert::assertTrue($response->isOk()); | |
} | |
} | |