Spaces:
No application file
No application file
namespace Mautic\LeadBundle\Tests\Entity; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class LeadRepositoryFunctionalTest extends MauticMysqlTestCase | |
{ | |
private Lead $lead; | |
protected function setUp(): void | |
{ | |
parent::setUp(); | |
$this->lead = $this->createLead(); | |
} | |
public function testPointsAreAdded(): void | |
{ | |
$model = static::getContainer()->get('mautic.lead.model.lead'); | |
$this->lead->adjustPoints(100); | |
$model->saveEntity($this->lead); | |
$this->assertEquals(200, $this->lead->getPoints()); | |
$changes = $this->lead->getChanges(true); | |
$this->assertEquals(200, $changes['points'][1]); | |
} | |
public function testPointsAreSubtracted(): void | |
{ | |
$model = static::getContainer()->get('mautic.lead.model.lead'); | |
$this->lead->adjustPoints(100, Lead::POINTS_SUBTRACT); | |
$model->saveEntity($this->lead); | |
$this->assertEquals(0, $this->lead->getPoints()); | |
$changes = $this->lead->getChanges(true); | |
$this->assertEquals(0, $changes['points'][1]); | |
} | |
public function testPointsAreMultiplied(): void | |
{ | |
$model = static::getContainer()->get('mautic.lead.model.lead'); | |
$this->lead->adjustPoints(2, Lead::POINTS_MULTIPLY); | |
$model->saveEntity($this->lead); | |
$this->assertEquals(200, $this->lead->getPoints()); | |
$changes = $this->lead->getChanges(true); | |
$this->assertEquals(200, $changes['points'][1]); | |
} | |
public function testPointsAreDivided(): void | |
{ | |
$model = static::getContainer()->get('mautic.lead.model.lead'); | |
$this->lead->adjustPoints(2, Lead::POINTS_DIVIDE); | |
$model->saveEntity($this->lead); | |
$this->assertEquals(50, $this->lead->getPoints()); | |
$changes = $this->lead->getChanges(true); | |
$this->assertEquals(50, $changes['points'][1]); | |
} | |
public function testMixedOperatorPointsAreCalculated(): void | |
{ | |
$model = static::getContainer()->get('mautic.lead.model.lead'); | |
$this->lead->adjustPoints(100, Lead::POINTS_SUBTRACT); | |
$this->lead->adjustPoints(120, Lead::POINTS_ADD); | |
$this->lead->adjustPoints(2, Lead::POINTS_MULTIPLY); | |
$this->lead->adjustPoints(4, Lead::POINTS_DIVIDE); | |
$model->saveEntity($this->lead); | |
$this->assertEquals(60, $this->lead->getPoints()); | |
$changes = $this->lead->getChanges(true); | |
$this->assertEquals(60, $changes['points'][1]); | |
} | |
public function testMixedModelAndRepositorySavesDoNotDoublePoints(): void | |
{ | |
$model = static::getContainer()->get('mautic.lead.model.lead'); | |
$this->lead->adjustPoints(120, Lead::POINTS_ADD); | |
$model->saveEntity($this->lead); | |
// Changes should be stored with points | |
$changes = $this->lead->getChanges(true); | |
$this->assertEquals(220, $changes['points'][1]); | |
// Points should now not be in changes | |
$model->saveEntity($this->lead); | |
$changes = $this->lead->getChanges(true); | |
$this->assertFalse(isset($changes['points'])); | |
// Points should remain the same | |
$model->saveEntity($this->lead); | |
$this->em->getRepository(Lead::class)->saveEntity($this->lead); | |
$this->assertEquals(220, $this->lead->getPoints()); | |
} | |
/** | |
* @param string[]|string $emails | |
* | |
* @dataProvider dataForTestAjaxGetLeadsByFieldValue | |
*/ | |
public function testAjaxGetLeadsByFieldValue($emails, bool $createFlag, int $expectedCount): void | |
{ | |
$this->createLeads($emails, $createFlag); | |
$payload = [ | |
'action' => 'lead:getLeadIdsByFieldValue', | |
'field' => 'email', | |
'value' => $emails, | |
]; | |
$this->client->request(Request::METHOD_GET, '/s/ajax', $payload, [], $this->createAjaxHeaders()); | |
$this->assertEquals(Response::HTTP_OK, $this->client->getResponse()->getStatusCode()); | |
$contentArray = json_decode($this->client->getResponse()->getContent(), true); | |
$this->assertCount($expectedCount, $contentArray['items']); | |
} | |
/** | |
* @return array<string, array<int, int|string|bool|string[]>> | |
*/ | |
public function dataForTestAjaxGetLeadsByFieldValue(): iterable | |
{ | |
yield 'Email passed as string with associated contact' => [ | |
'[email protected]', // Email | |
true, | |
1, // Count | |
]; | |
yield 'Email passed as string without associated contact' => [ | |
'[email protected]', // Email | |
false, | |
0, // Count | |
]; | |
yield 'Email passed as array with associated contacts' => [ | |
['[email protected]', '[email protected]'], // Email | |
true, | |
2, // Count | |
]; | |
yield 'Email passed as array without associated contacts' => [ | |
['[email protected]', '[email protected]'], // Email | |
false, | |
0, // Count | |
]; | |
} | |
/** | |
* @param string[]|string $emails | |
*/ | |
private function createLeads($emails, bool $flag): void | |
{ | |
if (!$flag) { | |
return; | |
} | |
if (!is_array($emails)) { | |
$emails = [$emails]; | |
} | |
foreach ($emails as $email) { | |
$this->createLead($email); | |
} | |
} | |
private function createLead(string $email = ''): Lead | |
{ | |
$lead = new Lead(); | |
$lead->setPoints(100); | |
if ($email) { | |
$lead->setEmail($email); | |
} | |
$this->em->persist($lead); | |
$this->em->flush(); | |
return $lead; | |
} | |
} | |