Spaces:
No application file
No application file
mautic
/
app
/bundles
/LeadBundle
/Tests
/Tracker
/Service
/DeviceTrackingService
/DeviceTrackingServiceTest.php
declare(strict_types=1); | |
namespace Mautic\LeadBundle\Tests\Tracker\Service\DeviceTrackingService; | |
use Doctrine\ORM\EntityManagerInterface; | |
use Mautic\CoreBundle\Helper\CookieHelper; | |
use Mautic\CoreBundle\Helper\RandomHelper\RandomHelperInterface; | |
use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\LeadBundle\Entity\LeadDevice; | |
use Mautic\LeadBundle\Entity\LeadDeviceRepository; | |
use Mautic\LeadBundle\Tracker\Service\DeviceTrackingService\DeviceTrackingService; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
final class DeviceTrackingServiceTest extends \PHPUnit\Framework\TestCase | |
{ | |
private \PHPUnit\Framework\MockObject\MockObject $cookieHelperMock; | |
private \PHPUnit\Framework\MockObject\MockObject $entityManagerMock; | |
private \PHPUnit\Framework\MockObject\MockObject $randomHelperMock; | |
private \PHPUnit\Framework\MockObject\MockObject $leadDeviceRepositoryMock; | |
private \PHPUnit\Framework\MockObject\MockObject $requestStackMock; | |
private \PHPUnit\Framework\MockObject\MockObject $security; | |
protected function setUp(): void | |
{ | |
$this->cookieHelperMock = $this->createMock(CookieHelper::class); | |
$this->entityManagerMock = $this->createMock(EntityManagerInterface::class); | |
$this->randomHelperMock = $this->createMock(RandomHelperInterface::class); | |
$this->leadDeviceRepositoryMock = $this->createMock(LeadDeviceRepository::class); | |
$this->requestStackMock = $this->createMock(RequestStack::class); | |
$this->security = $this->createMock(CorePermissions::class); | |
} | |
public function testIsTrackedTrue(): void | |
{ | |
$trackingId = 'randomTrackingId'; | |
$requestMock = $this->createMock(Request::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn($trackingId); | |
$leadDeviceMock = $this->createMock(LeadDevice::class); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->expects($this->once()) | |
->method('getByTrackingId') | |
->with($trackingId) | |
->willReturn($leadDeviceMock); | |
$this->assertTrue($this->getDeviceTrackingService()->isTracked()); | |
} | |
public function testIsTrackedFalse(): void | |
{ | |
$trackingId = 'randomTrackingId'; | |
$requestMock = $this->createMock(Request::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn($trackingId); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->expects($this->once()) | |
->method('getByTrackingId') | |
->with($trackingId) | |
->willReturn(null); | |
$this->assertFalse($this->getDeviceTrackingService()->isTracked()); | |
} | |
public function testGetTrackedDeviceCookie(): void | |
{ | |
$trackingId = 'randomTrackingId'; | |
$leadDeviceMock = $this->createMock(LeadDevice::class); | |
$requestMock = $this->createMock(Request::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn($trackingId); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->expects($this->once()) | |
->method('getByTrackingId') | |
->with($trackingId) | |
->willReturn($leadDeviceMock); | |
$this->assertSame($leadDeviceMock, $this->getDeviceTrackingService()->getTrackedDevice()); | |
} | |
public function testGetTrackedDeviceGetFromRequest(): void | |
{ | |
$trackingId = 'randomTrackingId'; | |
$requestMock = $this->createMock(Request::class); | |
$leadDeviceMock = $this->createMock(LeadDevice::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn(null); | |
$requestMock->expects($this->once()) | |
->method('get') | |
->with('mautic_device_id', null) | |
->willReturn($trackingId); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->expects($this->once()) | |
->method('getByTrackingId') | |
->with($trackingId) | |
->willReturn($leadDeviceMock); | |
$this->assertSame($leadDeviceMock, $this->getDeviceTrackingService()->getTrackedDevice()); | |
} | |
public function testGetTrackedDeviceNoTrackingId(): void | |
{ | |
$requestMock = $this->createMock(Request::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn(null); | |
$requestMock->expects($this->once()) | |
->method('get') | |
->with('mautic_device_id', null) | |
->willReturn(null); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->expects($this->never()) | |
->method('getByTrackingId'); | |
$this->assertNull($this->getDeviceTrackingService()->getTrackedDevice()); | |
} | |
public function testGetTrackedDeviceNoRequest(): void | |
{ | |
$deviceTrackingService = $this->getDeviceTrackingService(); | |
$this->assertNull($deviceTrackingService->getTrackedDevice()); | |
} | |
/** | |
* Test tracking device with already tracked current device. | |
*/ | |
public function testTrackCurrentDeviceAlreadyTracked(): void | |
{ | |
$leadDeviceMock = $this->createMock(LeadDevice::class); | |
$trackingId = 'randomTrackingId'; | |
$trackedLeadDeviceMock = $this->createMock(LeadDevice::class); | |
$requestMock = $this->createMock(Request::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn($trackingId); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->expects($this->once()) | |
->method('getByTrackingId') | |
->with($trackingId) | |
->willReturn($trackedLeadDeviceMock); | |
$deviceTrackingService = $this->getDeviceTrackingService(); | |
$deviceTrackingService->trackCurrentDevice($leadDeviceMock, false); | |
} | |
/** | |
* Test tracking device with already tracked current device, replace existing tracking. | |
*/ | |
public function testTrackCurrentDeviceAlreadyTrackedReplaceExistingTracking(): void | |
{ | |
$leadDeviceMock = $this->createMock(LeadDevice::class); | |
$trackedLeadDeviceMock = $this->createMock(LeadDevice::class); | |
$requestMock = $this->createMock(Request::class); | |
$trackingId = 'randomTrackingId'; | |
$uniqueTrackingIdentifier = '1234567890abcdefghij123'; | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn($trackingId); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
$this->leadDeviceRepositoryMock->method('getByTrackingId') | |
->withConsecutive([$trackingId]) | |
->willReturnOnConsecutiveCalls($trackedLeadDeviceMock); | |
$this->randomHelperMock->expects($this->once()) | |
->method('generate') | |
->with(23) | |
->willReturn($uniqueTrackingIdentifier); | |
$this->entityManagerMock->expects($this->once()) | |
->method('persist') | |
->with($leadDeviceMock); | |
// index 0-3 for leadDeviceRepository::findOneBy | |
$leadDeviceMock->method('getTrackingId') | |
->willReturnOnConsecutiveCalls(null, $uniqueTrackingIdentifier); | |
$leadDeviceMock->expects($this->once()) | |
->method('setTrackingId') | |
->with($uniqueTrackingIdentifier) | |
->willReturn($leadDeviceMock); | |
$leadDeviceMock->expects($this->exactly(2)) | |
->method('getLead') | |
->willReturn(new Lead()); | |
$this->cookieHelperMock->method('setCookie') | |
->withConsecutive(['mautic_device_id', $uniqueTrackingIdentifier, 31_536_000]); | |
$deviceTrackingService = $this->getDeviceTrackingService(); | |
$deviceTrackingService->trackCurrentDevice($leadDeviceMock, true); | |
} | |
/** | |
* Test tracking device without already tracked current device. | |
*/ | |
public function testTrackCurrentDeviceNotTrackedYet(): void | |
{ | |
$leadDeviceMock = $this->createMock(LeadDevice::class); | |
$uniqueTrackingIdentifier = '1234567890abcdefghij123'; | |
$requestMock = $this->createMock(Request::class); | |
$this->requestStackMock->expects($this->once()) | |
->method('getCurrentRequest') | |
->willReturn($requestMock); | |
$this->cookieHelperMock->expects($this->once()) | |
->method('getCookie') | |
->with('mautic_device_id', null) | |
->willReturn(null); | |
$requestMock->expects($this->once()) | |
->method('get') | |
->with('mautic_device_id', null) | |
->willReturn(null); | |
$this->randomHelperMock->expects($this->once()) | |
->method('generate') | |
->with(23) | |
->willReturn($uniqueTrackingIdentifier); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(true); | |
// index 0-3 for leadDeviceRepository::findOneBy | |
$leadDeviceMock->method('getTrackingId') | |
->willReturnOnConsecutiveCalls(null, $uniqueTrackingIdentifier); | |
$leadDeviceMock->expects($this->once()) | |
->method('setTrackingId') | |
->with($uniqueTrackingIdentifier) | |
->willReturn($leadDeviceMock); | |
$leadDeviceMock->expects($this->exactly(2)) | |
->method('getLead') | |
->willReturn(new Lead()); | |
$this->cookieHelperMock->method('setCookie') | |
->withConsecutive(['mautic_device_id', $uniqueTrackingIdentifier, 31_536_000]); | |
$this->entityManagerMock->expects($this->once()) | |
->method('persist') | |
->with($leadDeviceMock); | |
$this->entityManagerMock->expects($this->once()) | |
->method('flush'); | |
$deviceTrackingService = $this->getDeviceTrackingService(); | |
$deviceTrackingService->trackCurrentDevice($leadDeviceMock, false); | |
} | |
/** | |
* Test that a user is not tracked. | |
*/ | |
public function testUserIsNotTracked(): void | |
{ | |
$this->leadDeviceRepositoryMock->expects($this->never()) | |
->method('getByTrackingId'); | |
$this->security->expects($this->once()) | |
->method('isAnonymous') | |
->willReturn(false); | |
$this->getDeviceTrackingService()->getTrackedDevice(); | |
} | |
private function getDeviceTrackingService(): DeviceTrackingService | |
{ | |
return new DeviceTrackingService( | |
$this->cookieHelperMock, | |
$this->entityManagerMock, | |
$this->leadDeviceRepositoryMock, | |
$this->randomHelperMock, | |
$this->requestStackMock, | |
$this->security | |
); | |
} | |
} | |