getMockBuilder(Lead::class) ->getMock(); $lead->expects($this->once()) ->method('getChannelRules') ->willReturn( [ 'sms' => [ 'dnc' => DoNotContact::IS_CONTACTABLE, ], 'email' => [ 'dnc' => DoNotContact::IS_CONTACTABLE, ], ] ); $log = $this->getMockBuilder(LeadEventLog::class) ->getMock(); $log->method('getLead') ->willReturn($lead); $log->method('getId') ->willReturn(1); $lead2 = $this->getMockBuilder(Lead::class) ->getMock(); $lead2->expects($this->once()) ->method('getChannelRules') ->willReturn( [ 'email' => [ 'dnc' => DoNotContact::IS_CONTACTABLE, ], 'sms' => [ 'dnc' => DoNotContact::UNSUBSCRIBED, ], ] ); $log2 = $this->getMockBuilder(LeadEventLog::class) ->getMock(); $log2->method('getLead') ->willReturn($lead2); $log2->method('getId') ->willReturn(2); $logs = new ArrayCollection([$log, $log2]); $event = new Event(); $builder = new PreferenceBuilder($logs, $event, ['email' => [], 'sms' => [], 'push' => []], new NullLogger()); $preferences = $builder->getChannelPreferences(); $this->assertCount(3, $preferences); $this->assertTrue(isset($preferences['email'])); $this->assertTrue(isset($preferences['sms'])); $this->assertTrue(isset($preferences['push'])); /** @var ChannelPreferences $emailLogs */ $email = $preferences['email']; // First priority $emailLogs = $email->getLogsByPriority(1); $this->assertCount(1, $emailLogs); $this->assertEquals(2, $emailLogs->first()->getId()); // Second priority $emailLogs = $email->getLogsByPriority(2); $this->assertCount(1, $emailLogs); $this->assertEquals(1, $emailLogs->first()->getId()); // First priority for SMS which should just be one /** @var ChannelPreferences $smsLogs */ $sms = $preferences['sms']; $smsLogs = $sms->getLogsByPriority(1); $this->assertCount(1, $smsLogs); $this->assertEquals(1, $smsLogs->first()->getId()); // None for second priority because of DNC $smsLogs = $sms->getLogsByPriority(2); $this->assertCount(0, $smsLogs); // No one had push enabled but it should be defined $push = $preferences['push']; $pushLogs = $push->getLogsByPriority(1); $this->assertCount(0, $pushLogs); } public function testLogIsRemovedFromAllChannels(): void { $lead = $this->getMockBuilder(Lead::class) ->getMock(); $lead->expects($this->once()) ->method('getChannelRules') ->willReturn( [ 'sms' => [ 'dnc' => DoNotContact::IS_CONTACTABLE, ], 'email' => [ 'dnc' => DoNotContact::IS_CONTACTABLE, ], ] ); $log = $this->getMockBuilder(LeadEventLog::class) ->getMock(); $log->method('getLead') ->willReturn($lead); $log->method('getId') ->willReturn(1); $logs = new ArrayCollection([$log]); $event = new Event(); $builder = new PreferenceBuilder($logs, $event, ['email' => [], 'sms' => [], 'push' => []], new NullLogger()); $preferences = $builder->getChannelPreferences(); /** @var ChannelPreferences $sms */ $sms = $preferences['sms']; $smsLogs = $sms->getLogsByPriority(1); $this->assertCount(1, $smsLogs); /** @var ChannelPreferences $email */ $email = $preferences['email']; $emailLogs = $email->getLogsByPriority(2); $this->assertCount(1, $emailLogs); $builder->removeLogFromAllChannels($log); $preferences = $builder->getChannelPreferences(); /** @var ChannelPreferences $sms */ $sms = $preferences['sms']; $smsLogs = $sms->getLogsByPriority(1); $this->assertCount(0, $smsLogs); /** @var ChannelPreferences $email */ $email = $preferences['email']; $emailLogs = $email->getLogsByPriority(2); $this->assertCount(0, $emailLogs); } }