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; } }