mautic / app /bundles /LeadBundle /Tests /Command /DeduplicateCommandFunctionalTest.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
declare(strict_types=1);
namespace Mautic\LeadBundle\Tests\Command;
use Doctrine\DBAL\Query\Expression\CompositeExpression;
use Mautic\CoreBundle\Test\MauticMysqlTestCase;
use Mautic\LeadBundle\Command\DeduplicateCommand;
use Mautic\LeadBundle\Entity\Lead;
use Mautic\LeadBundle\Entity\LeadField;
use PHPUnit\Framework\Assert;
final class DeduplicateCommandFunctionalTest extends MauticMysqlTestCase
{
protected $useCleanupRollback = false;
protected function setUp(): void
{
if ('testDeduplicateCommandWithAnotherUniqueFieldAndAnd' === $this->getName()) {
$this->configParams['contact_unique_identifiers_operator'] = CompositeExpression::TYPE_AND;
}
parent::setUp();
}
public function testDeduplicateCommandWithUniqueEmail(): void
{
$contactRepository = $this->em->getRepository(Lead::class);
$contactDeduper = static::getContainer()->get('mautic.lead.deduper');
Assert::assertSame(0, $contactRepository->count([]), 'Some contacts were forgotten to remove from other tests');
$this->saveContact('[email protected]'); // 1
$this->saveContact('[email protected]'); // 1
$this->saveContact('[email protected]'); // 1
$this->saveContact('[email protected]'); // 1
$this->saveContact('[email protected]'); // 2
$this->saveContact('[email protected]'); // 2
$this->saveContact('[email protected]'); // 3
$this->em->flush();
Assert::assertSame(7, $contactRepository->count([]));
Assert::assertSame(
2,
$contactDeduper->countDuplicatedContacts(array_keys($contactDeduper->getUniqueFields('lead'))),
'The deduper should see and process only 2 duplicated contacts. The third is unique.'
);
$output = $this->testSymfonyCommand(DeduplicateCommand::NAME);
Assert::assertSame(3, $contactRepository->count([]), $output->getDisplay());
}
public function testDeduplicateCommandWithAnotherUniqueFieldAndAnd(): void
{
$contactRepository = $this->em->getRepository(Lead::class);
$fieldRepository = $this->em->getRepository(LeadField::class);
Assert::assertSame(0, $contactRepository->count([]), 'Some contacts were forgotten to remove from other tests');
$this->saveContact('[email protected]', '111111111'); // 1
$this->saveContact('[email protected]', '111111111'); // 1
$this->saveContact('[email protected]', '222222222'); // 2
$this->saveContact('[email protected]', '222222222'); // 2
$this->saveContact('[email protected]', '333333333'); // 3
$this->saveContact('[email protected]', '333333333'); // 3
$this->saveContact('[email protected]', '4444444444'); // 4
$this->saveContact('[email protected]', '4444444444'); // 5
$phoneField = $fieldRepository->findOneBy(['alias' => 'phone']);
\assert($phoneField instanceof LeadField);
$phoneField->setIsUniqueIdentifer(true);
$phoneField->setLabel('Cell phone'); // Testing also field with more words.
$this->em->persist($phoneField);
$this->em->flush();
Assert::assertSame(8, $contactRepository->count([]));
$output = $this->testSymfonyCommand(DeduplicateCommand::NAME);
Assert::assertSame(5, $contactRepository->count([]), $output->getDisplay());
}
public function testDeduplicateCommandWithAnotherUniqueFieldAndOr(): void
{
$contactRepository = $this->em->getRepository(Lead::class);
$fieldRepository = $this->em->getRepository(LeadField::class);
Assert::assertSame(0, $contactRepository->count([]), 'Some contacts were forgotten to remove from other tests');
$this->saveContact('[email protected]', '111111111'); // 1
$this->saveContact('[email protected]', '111111111'); // 1
$this->saveContact('[email protected]', '222222222'); // 1
$this->saveContact('[email protected]', '222222222'); // 1
$this->saveContact('[email protected]', '333333333'); // 2
$this->saveContact('[email protected]', '333333333'); // 2
$this->saveContact('[email protected]', '4444444444'); // 3
$this->saveContact('[email protected]', '4444444444'); // 3
$phoneField = $fieldRepository->findOneBy(['alias' => 'phone']);
\assert($phoneField instanceof LeadField);
$phoneField->setIsUniqueIdentifer(true);
$phoneField->setLabel('Cell phone'); // Testing also field with more words.
$this->em->persist($phoneField);
$this->em->flush();
Assert::assertSame(8, $contactRepository->count([]));
$output = $this->testSymfonyCommand(DeduplicateCommand::NAME);
Assert::assertSame(3, $contactRepository->count([]), $output->getDisplay());
}
private function saveContact(string $email, string $phone = null): Lead
{
$contact = new Lead();
$contact->setEmail($email);
$contact->setPhone($phone);
$contact->setDateIdentified(new \DateTime());
$this->em->persist($contact);
return $contact;
}
}