Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\CampaignBundle\Tests\Model; | |
use Doctrine\DBAL\Exception; | |
use Doctrine\ORM\Exception\ORMException; | |
use Doctrine\ORM\OptimisticLockException; | |
use Mautic\CampaignBundle\Entity\Campaign; | |
use Mautic\CampaignBundle\Entity\Event; | |
use Mautic\CampaignBundle\Entity\Lead as CampaignLead; | |
use Mautic\CampaignBundle\Model\CampaignModel; | |
use Mautic\CoreBundle\Entity\IpAddress; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\EmailBundle\Entity\Email; | |
use Mautic\EmailBundle\Entity\Stat; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\PageBundle\Entity\Hit; | |
use Mautic\PageBundle\Entity\Redirect; | |
use Mautic\PageBundle\Entity\Trackable; | |
class CampaignModelFunctionalTest extends MauticMysqlTestCase | |
{ | |
/** | |
* @throws OptimisticLockException | |
* @throws ORMException | |
* @throws Exception | |
*/ | |
public function testGetEmailsCountryStats(): void | |
{ | |
/** @var CampaignModel $model */ | |
$model = $this->getContainer()->get('mautic.campaign.model.campaign'); | |
$dateFrom = new \DateTimeImmutable('2023-07-21'); | |
$dateTo = new \DateTimeImmutable('2023-07-24'); | |
$leadsPayload = [ | |
[ | |
'email' => '[email protected]', | |
'country' => 'Spain', | |
'read' => true, | |
'click' => true, | |
], | |
[ | |
'email' => '[email protected]', | |
'country' => 'Spain', | |
'read' => true, | |
'click' => false, | |
], | |
[ | |
'email' => '[email protected]', | |
'country' => 'Spain', | |
'read' => false, | |
'click' => false, | |
], | |
[ | |
'email' => '[email protected]', | |
'country' => '', | |
'read' => true, | |
'click' => true, | |
], | |
[ | |
'email' => '[email protected]', | |
'country' => 'Poland', | |
'read' => true, | |
'click' => false, | |
], | |
[ | |
'email' => '[email protected]', | |
'country' => 'Poland', | |
'read' => true, | |
'click' => true, | |
], | |
]; | |
// Create test campaign | |
$campaign = new Campaign(); | |
$campaign->setName('Test campaign'); | |
$this->em->persist($campaign); | |
$this->em->flush(); | |
foreach ($leadsPayload as $key => $values) { | |
// Create lead | |
$lead = new Lead(); | |
$lead->setEmail($values['email']); | |
$lead->setCountry($values['country']); | |
$this->em->persist($lead); | |
$leadsArr[] = [ | |
'lead' => $lead, | |
'read' => $values['read'], | |
'click' => $values['click'], | |
]; | |
// Create campaign lead and assign to lead | |
$campaignLead = new CampaignLead(); | |
$campaignLead->setLead($lead); | |
$campaignLead->setDateAdded(new \DateTime('2023-07-22')); | |
$campaignLead->setManuallyAdded(true); | |
$campaignLead->setCampaign($campaign); | |
$this->em->persist($campaignLead); | |
$this->em->flush(); | |
$campaign->addLead($key, $campaignLead); | |
} | |
for ($i = 0; $i < 4; ++$i) { | |
// Create email | |
$email = new Email(); | |
$email->setName('Test email '.$i); | |
$this->em->persist($email); | |
$this->em->flush(); | |
// Create email events | |
$event = new Event(); | |
$event->setName('Send email '.$i); | |
$event->setType('email.send'); | |
$event->setEventType('action'); | |
$event->setChannel('email'); | |
$event->setChannelId($email->getId()); | |
$event->setCampaign($campaign); | |
$this->em->persist($event); | |
$this->em->flush(); | |
// Add events to campaign | |
$campaign->addEvent($i, $event); | |
// Create campaign email sending statistics | |
foreach ($leadsArr as $value) { | |
$this->emulateEmailStat($value['lead'], $email, $value['read'], $event->getId()); | |
if ($value['read'] && $value['click']) { | |
$hits = rand(1, 5); | |
$uniqueHits = rand(1, $hits); | |
$this->emulateClick($value['lead'], $email, $hits, $uniqueHits); | |
} | |
} | |
} | |
$results = $model->getCountryStats($campaign, $dateFrom, $dateTo); | |
$this->assertCount(4, $campaign->getEmailSendEvents()); | |
$this->assertCount(3, $results); | |
$this->assertSame([ | |
'contacts' => [ | |
[ | |
'country' => '', | |
'contacts' => '1', | |
], | |
[ | |
'country' => 'Poland', | |
'contacts' => '2', | |
], | |
[ | |
'country' => 'Spain', | |
'contacts' => '3', | |
], | |
], | |
'clicked_through_count' => [ | |
[ | |
'clicked_through_count' => '4', | |
'country' => '', | |
], | |
[ | |
'clicked_through_count' => '4', | |
'country' => 'Poland', | |
], | |
[ | |
'clicked_through_count' => '4', | |
'country' => 'Spain', | |
], | |
], | |
'read_count' => [ | |
[ | |
'read_count' => '4', | |
'country' => '', | |
], | |
[ | |
'read_count' => '8', | |
'country' => 'Poland', | |
], | |
[ | |
'read_count' => '8', | |
'country' => 'Spain', | |
], | |
], | |
], $results); | |
} | |
/** | |
* @throws OptimisticLockException | |
* @throws ORMException | |
*/ | |
public function testGetContextEntity(): void | |
{ | |
/** @var CampaignModel $model */ | |
$model = $this->getContainer()->get('mautic.campaign.model.campaign'); | |
$campaign = new Campaign(); | |
$campaign->setName('Test email'); | |
$this->em->persist($campaign); | |
$this->em->flush(); | |
$id = $campaign->getId(); | |
$result = $model->getEntity($id); | |
$this->assertSame($campaign, $result); | |
} | |
/** | |
* @throws OptimisticLockException | |
* @throws ORMException | |
*/ | |
private function emulateEmailStat(Lead $lead, Email $email, bool $isRead, int $sourceId): void | |
{ | |
$stat = new Stat(); | |
$stat->setEmailAddress('[email protected]'); | |
$stat->setLead($lead); | |
$stat->setDateSent(new \DateTime('2023-07-22')); | |
$stat->setEmail($email); | |
$stat->setIsRead($isRead); | |
$stat->setSource('campaign.event'); | |
$stat->setSourceId($sourceId); | |
$this->em->persist($stat); | |
$this->em->flush(); | |
} | |
/** | |
* @throws OptimisticLockException | |
* @throws ORMException | |
*/ | |
private function emulateClick(Lead $lead, Email $email, int $hits, int $uniqueHits): void | |
{ | |
$ipAddress = new IpAddress(); | |
$ipAddress->setIpAddress('127.0.0.1'); | |
$this->em->persist($ipAddress); | |
$this->em->flush(); | |
$redirect = new Redirect(); | |
$redirect->setRedirectId(uniqid()); | |
$redirect->setUrl('https://example.com'); | |
$redirect->setUniqueHits($uniqueHits); | |
$redirect->setHits($hits); | |
$this->em->persist($redirect); | |
$trackable = new Trackable(); | |
$trackable->setChannelId($email->getId()); | |
$trackable->setHits($hits); | |
$trackable->setChannel('email'); | |
$trackable->setUniqueHits($uniqueHits); | |
$trackable->setRedirect($redirect); | |
$this->em->persist($trackable); | |
$pageHit = new Hit(); | |
$pageHit->setRedirect($redirect); | |
$pageHit->setIpAddress($ipAddress); | |
$pageHit->setEmail($email); | |
$pageHit->setLead($lead); | |
$pageHit->setDateHit(new \DateTime('2023-07-22')); | |
$pageHit->setCode(200); | |
$pageHit->setUrl($redirect->getUrl()); | |
$pageHit->setTrackingId($redirect->getRedirectId()); | |
$pageHit->setSource('email'); | |
$pageHit->setSourceId($email->getId()); | |
$this->em->persist($pageHit); | |
$this->em->flush(); | |
} | |
} | |