File size: 4,262 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
<?php

namespace Mautic\LeadBundle\Tests\Tracker;

use Mautic\CacheBundle\Cache\CacheProvider;
use Mautic\CoreBundle\Helper\CoreParametersHelper;
use Mautic\LeadBundle\Entity\Lead;
use Mautic\LeadBundle\Entity\LeadDevice;
use Mautic\LeadBundle\Tracker\DeviceTracker;
use Mautic\LeadBundle\Tracker\Factory\DeviceDetectorFactory\DeviceDetectorFactory;
use Mautic\LeadBundle\Tracker\Service\DeviceCreatorService\DeviceCreatorService;
use Mautic\LeadBundle\Tracker\Service\DeviceTrackingService\DeviceTrackingServiceInterface;
use Monolog\Logger;
use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\DependencyInjection\ContainerInterface;

class DeviceTrackerTest extends \PHPUnit\Framework\TestCase
{
    private DeviceCreatorService $deviceCreatorService;

    private DeviceDetectorFactory $deviceDetectorFactory;

    /**
     * @var DeviceTrackingServiceInterface
     */
    private \PHPUnit\Framework\MockObject\MockObject $deviceTrackingService;

    /**
     * @var Logger
     */
    private \PHPUnit\Framework\MockObject\MockObject $logger;

    /**
     * @var string
     */
    private $userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36';

    protected function setUp(): void
    {
        $createCacheItem = \Closure::bind(
            function ($key) {
                $item        = new CacheItem();
                $item->key   = $key;
                $item->isHit = false;

                return $item;
            },
            $this,
            CacheItem::class
        );

        $cacheAdapter = $this->createMock(TagAwareAdapterInterface::class);
        $cacheAdapter->expects($this->atLeastOnce())
          ->method('getItem')
          ->withAnyParameters()
          ->willReturn($createCacheItem('test'));
        $cacheAdapter->expects($this->atLeastOnce())
          ->method('save')
          ->willReturn(true);

        $coreParametersHelper = $this->createMock(CoreParametersHelper::class);
        $coreParametersHelper->expects($this->once())
          ->method('get')
          ->with($this->equalTo('cache_adapter'))
          ->willReturn('mautic.cache.adapter.filesystem');

        $container = $this->createMock(ContainerInterface::class);
        $container
          ->expects($this->once())
          ->method('has')
          ->with($this->equalTo('mautic.cache.adapter.filesystem'))
          ->willReturn(true);
        $container
          ->expects($this->once())
          ->method('get')
          ->with($this->equalTo('mautic.cache.adapter.filesystem'))
          ->willReturn($cacheAdapter);

        $cacheProvider               = new CacheProvider($coreParametersHelper, $container);
        $this->deviceDetectorFactory = new DeviceDetectorFactory($cacheProvider);
        $this->deviceCreatorService  = new DeviceCreatorService();
        $this->deviceTrackingService = $this->getMockBuilder(DeviceTrackingServiceInterface::class)
            ->disableOriginalConstructor()
            ->getMock();

        $this->logger = $this->getMockBuilder(Logger::class)
            ->disableOriginalConstructor()
            ->getMock();
    }

    public function testDeviceCreatedByUserAgent(): void
    {
        $lead    = new Lead();
        $device  = new LeadDevice();
        $device->setDeviceBrand('apple');

        $this->deviceTrackingService->expects($this->once())
            ->method('trackCurrentDevice')
            ->willReturn($device);

        $tracker = new DeviceTracker($this->deviceCreatorService, $this->deviceDetectorFactory, $this->deviceTrackingService, $this->logger);

        $device = $tracker->createDeviceFromUserAgent($lead, $this->userAgent);
        $this->assertEquals('3dfc9e6dff07948058df37455718cb98', $device->getSignature());

        // Subsequent calls should not create a new tracking ID
        $device2 = $tracker->createDeviceFromUserAgent($lead, $this->userAgent);
        $this->assertEquals($device->getTrackingId(), $device2->getTrackingId());
        $this->assertEquals('apple', $device2->getDeviceBrand());
        $this->assertEquals($device->getSignature(), $device2->getSignature());
    }
}