Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\CoreBundle\Tests\Command; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\LeadBundle\Entity\Lead; | |
class CleanupMaintenanceCommandTest extends MauticMysqlTestCase | |
{ | |
protected $useCleanupRollback = false; | |
/** | |
* @throws \Exception | |
*/ | |
public function testCleanupMaintenanceCommand(): void | |
{ | |
$inactiveLead = $this->createLead('-1 year'); | |
$contactId = $inactiveLead->getId(); | |
$this->testSymfonyCommand('mautic:maintenance:cleanup', ['--days-old' => 180, '--no-interaction' => true]); | |
$this->assertNull( | |
static::getContainer()->get('mautic.lead.model.lead')->getEntity($contactId), | |
'Purge an unidentified lead that is considered inactive' | |
); | |
// get last row sql query from audit_log table | |
$sql = 'SELECT * FROM '.MAUTIC_TABLE_PREFIX.'audit_log ORDER BY id DESC LIMIT 1'; | |
$stmt = $this->em->getConnection()->prepare($sql); | |
$result = $stmt->executeQuery()->fetchAssociative(); | |
$this->assertEquals('core', $result['bundle']); | |
$this->assertEquals('maintenance', $result['object']); | |
$this->assertEquals('cleanup', $result['action']); | |
$this->assertEquals('a:2:{s:7:"options";a:4:{s:8:"days-old";i:180;s:9:"lock_mode";s:3:"pid";s:14:"no-interaction";b:1;s:3:"env";s:4:"test";}s:5:"stats";a:1:{s:8:"Visitors";i:1;}}', $result['details']); | |
$activeLead = $this->createLead('-170 days'); | |
$contactId = $activeLead->getId(); | |
$this->testSymfonyCommand('mautic:maintenance:cleanup', ['--days-old' => 180, '--no-interaction' => true]); | |
$this->assertNotNull( | |
static::getContainer()->get('mautic.lead.model.lead')->getEntity($contactId), | |
'Keep an unidentified lead that is still considered active' | |
); | |
} | |
/** | |
* @throws \Exception | |
*/ | |
public function testGdprMaintenanceCommand(): void | |
{ | |
$identified = '-4 years'; | |
$lastActive = '-2 years'; | |
$NotPurgeableContact = $this->createLead($lastActive, $identified); | |
$contactId = $NotPurgeableContact->getId(); | |
$this->testSymfonyCommand('mautic:maintenance:cleanup', ['--gdpr' => 1, '--no-interaction' => true]); | |
$this->assertNotNull( | |
$this->getContainer()->get('mautic.lead.model.lead')->getEntity($contactId), | |
'Keep an identified contact that is still considered active.' | |
); | |
$lastActive = '-4 years'; | |
$purgeableContact = $this->createLead($lastActive, $identified); | |
$contactId = $purgeableContact->getId(); | |
$this->testSymfonyCommand('mautic:maintenance:cleanup', ['--gdpr' => 1, '--no-interaction' => true]); | |
$this->assertNull( | |
$this->getContainer()->get('mautic.lead.model.lead')->getEntity($contactId), | |
'Purge an identified contact that is considered inactive' | |
); | |
$this->setUpSymfony($this->configParams + ['gdpr_user_purge_threshold' => '1825']); | |
$NotPurgeableContact = $this->createLead($lastActive, $identified); | |
$contactId = $NotPurgeableContact->getId(); | |
$this->testSymfonyCommand('mautic:maintenance:cleanup', ['--gdpr' => 1, '--no-interaction' => true]); | |
$this->assertNotNull( | |
$this->getContainer()->get('mautic.lead.model.lead')->getEntity($contactId), | |
'Keep an identified contact that is still considered active because of custom "gdpr_user_purge_threshold".' | |
); | |
} | |
/** | |
* @throws \Doctrine\ORM\Exception\ORMException | |
* @throws \Doctrine\ORM\OptimisticLockException | |
*/ | |
protected function createLead(string $lastActive, ?string $identified = null): Lead | |
{ | |
$lead = new Lead(); | |
$lead->setLastActive(new \DateTime($lastActive)); | |
if (is_string($identified)) { | |
$lead->setDateIdentified(new \DateTime($identified)); | |
} | |
$this->em->persist($lead); | |
$this->em->flush(); | |
return $lead; | |
} | |
} | |