Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\PointBundle\Tests\Functional; | |
use Mautic\CoreBundle\Entity\IpAddress; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\PointBundle\Entity\Group; | |
use Mautic\PointBundle\Entity\GroupContactScore; | |
use Mautic\ReportBundle\Entity\Report; | |
use Symfony\Component\DomCrawler\Crawler; | |
use Symfony\Component\HttpFoundation\Request; | |
class ReportSubscriberFunctionalTest extends MauticMysqlTestCase | |
{ | |
protected function setUp(): void | |
{ | |
$this->useCleanupRollback = false; | |
parent::setUp(); | |
} | |
public function testContactPointLogReportWithGroup(): void | |
{ | |
$this->createTestContactWithGroupPoints(); | |
$report = new Report(); | |
$report->setName('Contact point log'); | |
$report->setSource('lead.pointlog'); | |
$report->setColumns(['lp.type', 'lp.event_name', 'l.email', 'lp.delta', 'pl.name']); | |
$report->setTableOrder([[ | |
'column' => 'lp.delta', | |
'direction' => 'DESC', | |
]]); | |
$this->em->persist($report); | |
$this->em->flush(); | |
$this->em->clear(); | |
// -- test report table in mautic panel | |
$crawler = $this->client->request(Request::METHOD_GET, "/s/reports/view/{$report->getId()}"); | |
$crawlerReportTable = $crawler->filterXPath('//table[@id="reportTable"]')->first(); | |
// convert html table to php array | |
$crawlerReportTable = $this->domTableToArray($crawlerReportTable); | |
$this->assertSame([ | |
// no., event_type, event_name, email, points_delta, group_name | |
['1', 'test type', 'Adjust points', '[email protected]', '15', 'Group A'], | |
['2', 'test type', 'Adjust points', '[email protected]', '10', 'Group A'], | |
['3', 'test type', 'Adjust points', '[email protected]', '5', 'Group A'], | |
['4', 'test type', 'Adjust points', '[email protected]', '2', 'Group B'], | |
['5', 'test type', 'Adjust points', '[email protected]', '1', 'Group B'], | |
], array_slice($crawlerReportTable, 1, 5)); | |
// -- test API report data | |
$this->client->request(Request::METHOD_GET, "/api/reports/{$report->getId()}"); | |
$clientResponse = $this->client->getResponse(); | |
$result = json_decode($clientResponse->getContent(), true); | |
$this->assertSame([ | |
[ | |
'type' => 'test type', | |
'event_name' => 'Adjust points', | |
'email' => '[email protected]', | |
'delta' => '15', | |
'group_name' => 'Group A', | |
], | |
[ | |
'type' => 'test type', | |
'event_name' => 'Adjust points', | |
'email' => '[email protected]', | |
'delta' => '10', | |
'group_name' => 'Group A', | |
], | |
[ | |
'type' => 'test type', | |
'event_name' => 'Adjust points', | |
'email' => '[email protected]', | |
'delta' => '5', | |
'group_name' => 'Group A', | |
], | |
[ | |
'type' => 'test type', | |
'event_name' => 'Adjust points', | |
'email' => '[email protected]', | |
'delta' => '2', | |
'group_name' => 'Group B', | |
], | |
[ | |
'type' => 'test type', | |
'event_name' => 'Adjust points', | |
'email' => '[email protected]', | |
'delta' => '1', | |
'group_name' => 'Group B', | |
], | |
], $result['data']); | |
} | |
public function testGroupScoreReport(): void | |
{ | |
$this->createTestContactWithGroupPoints(); | |
$report = new Report(); | |
$report->setName('Group score report'); | |
$report->setSource('group.score'); | |
$report->setColumns(['pl.name', 'ls.score', 'l.email']); | |
$report->setTableOrder([[ | |
'column' => 'ls.score', | |
'direction' => 'DESC', | |
]]); | |
$this->em->persist($report); | |
$this->em->flush(); | |
$this->em->clear(); | |
// -- test report table in mautic panel | |
$crawler = $this->client->request(Request::METHOD_GET, "/s/reports/view/{$report->getId()}"); | |
$crawlerReportTable = $crawler->filterXPath('//table[@id="reportTable"]')->first(); | |
// convert html table to php array | |
$crawlerReportTable = $this->domTableToArray($crawlerReportTable); | |
$this->assertSame([ | |
// no., group_name, group_score, email | |
['1', 'Group A', '15', '[email protected]'], | |
['2', 'Group A', '10', '[email protected]'], | |
['3', 'Group A', '5', '[email protected]'], | |
['4', 'Group B', '2', '[email protected]'], | |
['5', 'Group B', '1', '[email protected]'], | |
], array_slice($crawlerReportTable, 1, 5)); | |
// -- test API report data | |
$this->client->request(Request::METHOD_GET, "/api/reports/{$report->getId()}"); | |
$clientResponse = $this->client->getResponse(); | |
$result = json_decode($clientResponse->getContent(), true); | |
$this->assertSame([ | |
[ | |
'group_name' => 'Group A', | |
'group_score' => '15', | |
'email' => '[email protected]', | |
], | |
[ | |
'group_name' => 'Group A', | |
'group_score' => '10', | |
'email' => '[email protected]', | |
], | |
[ | |
'group_name' => 'Group A', | |
'group_score' => '5', | |
'email' => '[email protected]', | |
], | |
[ | |
'group_name' => 'Group B', | |
'group_score' => '2', | |
'email' => '[email protected]', | |
], | |
[ | |
'group_name' => 'Group B', | |
'group_score' => '1', | |
'email' => '[email protected]', | |
], | |
], $result['data']); | |
} | |
private function createTestContactWithGroupPoints(): void | |
{ | |
$contactModel = static::getContainer()->get('mautic.lead.model.lead'); | |
$groupA = $this->createGroup('Group A'); | |
$groupB = $this->createGroup('Group B'); | |
$this->em->flush(); | |
$contacts = [ | |
$this->createContact('[email protected]'), | |
$this->createContact('[email protected]'), | |
$this->createContact('[email protected]'), | |
]; | |
$contactModel->saveEntities($contacts); | |
$this->adjustContactPoints($contacts[0], 5, $groupA); | |
$this->adjustContactPoints($contacts[1], 15, $groupA); | |
$this->adjustContactPoints($contacts[2], 10, $groupA); | |
$this->adjustContactPoints($contacts[2], 2, $groupB); | |
$this->adjustContactPoints($contacts[1], 1, $groupB); | |
$contactModel->saveEntities($contacts); | |
} | |
private function createContact(string $email): Lead | |
{ | |
$contact = new Lead(); | |
$contact->setEmail($email); | |
$this->em->persist($contact); | |
return $contact; | |
} | |
private function adjustContactPoints(Lead $contact, int $points, Group $group): void | |
{ | |
$ipAddress = new IpAddress(); | |
$ipAddress->setIpAddress('127.0.0.1'); | |
$contact->addPointsChangeLogEntry( | |
'test type', | |
'Adjust points', | |
'test action', | |
$points, | |
$ipAddress, | |
$group | |
); | |
$contact->adjustPoints($points); | |
$groupContactScore = new GroupContactScore(); | |
$groupContactScore->setContact($contact); | |
$groupContactScore->setGroup($group); | |
$groupContactScore->setScore($points); | |
$contact->addGroupScore($groupContactScore); | |
} | |
private function createGroup( | |
string $name | |
): Group { | |
$group = new Group(); | |
$group->setName($name); | |
$this->em->persist($group); | |
return $group; | |
} | |
/** | |
* @return array<int,array<int,mixed>> | |
*/ | |
private function domTableToArray(Crawler $crawler): array | |
{ | |
return $crawler->filter('tr')->each(fn ($tr) => $tr->filter('td')->each(fn ($td) => trim($td->text()))); | |
} | |
} | |