File size: 3,594 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php

declare(strict_types=1);

namespace Mautic\CampaignBundle\Tests\Command;

use Mautic\CampaignBundle\Command\CampaignDeleteEventLogsCommand;
use Mautic\CampaignBundle\Entity\Campaign;
use Mautic\CampaignBundle\Entity\Event;
use Mautic\CampaignBundle\Entity\LeadEventLog;
use Mautic\CoreBundle\Test\MauticMysqlTestCase;
use Mautic\LeadBundle\Entity\Lead;
use PHPUnit\Framework\Assert;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Tester\ApplicationTester;

class CampaignDeleteEventLogsCommandFunctionalTest extends MauticMysqlTestCase
{
    public function testWithEventIds(): void
    {
        $exitCode = $this->createDataAndRunCommand(false);
        Assert::assertSame(0, $exitCode);

        $campaign = $this->em->getRepository(Campaign::class)->findAll();
        Assert::assertCount(1, $campaign);

        $eventLogs = $this->em->getRepository(LeadEventLog::class)->findAll();
        Assert::assertCount(0, $eventLogs);
    }

    public function testWithCampaignId(): void
    {
        $exitCode = $this->createDataAndRunCommand(true);

        Assert::assertSame(0, $exitCode);

        $campaign = $this->em->getRepository(Campaign::class)->findAll();
        Assert::assertCount(0, $campaign);

        $eventLogs = $this->em->getRepository(LeadEventLog::class)->findAll();
        Assert::assertCount(0, $eventLogs);
    }

    private function createApplicationTester(): ApplicationTester
    {
        $application = new Application(self::$kernel);
        $application->setAutoExit(false);

        return new ApplicationTester($application);
    }

    private function createDataAndRunCommand(bool $usingCampaign): int
    {
        $applicationTester = $this->createApplicationTester();
        $lead              = $this->createLead();
        $campaign          = $this->createCampaign();
        $event1            = $this->createEvent('Event 1', $campaign);
        $event2            = $this->createEvent('Event 2', $campaign);
        $this->createEventLog($lead, $event1);
        $this->createEventLog($lead, $event2);

        $commandData = ['command' => CampaignDeleteEventLogsCommand::COMMAND_NAME];
        if ($usingCampaign) {
            $commandData['--campaign-id'] = $campaign->getId();
        } else {
            $commandData['campaign_event_ids'] = [$event1->getId(), $event2->getId()];
        }

        $exitCode = $applicationTester->run($commandData);

        return $exitCode;
    }

    private function createLead(): Lead
    {
        $lead = new Lead();
        $lead->setFirstname('Test');
        $this->em->persist($lead);
        $this->em->flush();

        return $lead;
    }

    private function createCampaign(): Campaign
    {
        $campaign = new Campaign();
        $campaign->setName('My campaign');
        $this->em->persist($campaign);
        $this->em->flush();

        return $campaign;
    }

    private function createEvent(string $name, Campaign $campaign): Event
    {
        $event = new Event();
        $event->setName($name);
        $event->setCampaign($campaign);
        $event->setType('email.send');
        $event->setEventType('action');
        $this->em->persist($event);
        $this->em->flush();

        return $event;
    }

    private function createEventLog(Lead $lead, Event $event): LeadEventLog
    {
        $leadEventLog = new LeadEventLog();
        $leadEventLog->setLead($lead);
        $leadEventLog->setEvent($event);
        $this->em->persist($leadEventLog);
        $this->em->flush();

        return $leadEventLog;
    }
}