Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Tests\Unit\Sync\SyncProcess; | |
use Mautic\IntegrationsBundle\Entity\ObjectMapping; | |
use Mautic\IntegrationsBundle\Event\CompletedSyncIterationEvent; | |
use Mautic\IntegrationsBundle\IntegrationEvents; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\MappingManualDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\RemappedObjectDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\UpdatedObjectMappingDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\InputOptionsDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\ObjectChangeDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\ObjectMappingsDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\OrderDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\ReportDAO; | |
use Mautic\IntegrationsBundle\Sync\Helper\MappingHelper; | |
use Mautic\IntegrationsBundle\Sync\Helper\RelationsHelper; | |
use Mautic\IntegrationsBundle\Sync\Helper\SyncDateHelper; | |
use Mautic\IntegrationsBundle\Sync\Notification\Notifier; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\SyncDataExchangeInterface; | |
use Mautic\IntegrationsBundle\Sync\SyncProcess\Direction\Integration\IntegrationSyncProcess; | |
use Mautic\IntegrationsBundle\Sync\SyncProcess\Direction\Internal\MauticSyncProcess; | |
use Mautic\IntegrationsBundle\Sync\SyncProcess\SyncProcess; | |
use Mautic\IntegrationsBundle\Sync\SyncService\SyncServiceInterface; | |
use PHPUnit\Framework\Assert; | |
use PHPUnit\Framework\MockObject\MockObject; | |
use PHPUnit\Framework\TestCase; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
class SyncProcessTest extends TestCase | |
{ | |
/** | |
* @var MockObject|MappingManualDAO | |
*/ | |
private MockObject $mappingManualDAO; | |
/** | |
* @var MockObject|MauticSyncDataExchange | |
*/ | |
private MockObject $internalSyncDataExchange; | |
/** | |
* @var MockObject|SyncDataExchangeInterface | |
*/ | |
private MockObject $integrationSyncDataExchange; | |
/** | |
* @var MockObject|SyncDateHelper | |
*/ | |
private MockObject $syncDateHelper; | |
/** | |
* @var MockObject|MappingHelper | |
*/ | |
private MockObject $mappingHelper; | |
/** | |
* @var MockObject|RelationsHelper | |
*/ | |
private MockObject $relationsHelper; | |
/** | |
* @var MockObject|IntegrationSyncProcess | |
*/ | |
private MockObject $integrationSyncProcess; | |
/** | |
* @var MockObject|MauticSyncProcess | |
*/ | |
private MockObject $mauticSyncProcess; | |
/** | |
* @var MockObject|EventDispatcherInterface | |
*/ | |
private MockObject $eventDispatcher; | |
/** | |
* @var MockObject|Notifier | |
*/ | |
private MockObject $notifier; | |
/** | |
* @var MockObject|InputOptionsDAO | |
*/ | |
private MockObject $inputOptionsDAO; | |
/** | |
* @var MockObject|SyncServiceInterface | |
*/ | |
private MockObject $syncService; | |
private SyncProcess $syncProcess; | |
protected function setUp(): void | |
{ | |
$this->syncDateHelper = $this->createMock(SyncDateHelper::class); | |
$this->mappingHelper = $this->createMock(MappingHelper::class); | |
$this->relationsHelper = $this->createMock(RelationsHelper::class); | |
$this->integrationSyncProcess = $this->createMock(IntegrationSyncProcess::class); | |
$this->mauticSyncProcess = $this->createMock(MauticSyncProcess::class); | |
$this->eventDispatcher = $this->createMock(EventDispatcherInterface::class); | |
$this->notifier = $this->createMock(Notifier::class); | |
$this->mappingManualDAO = $this->createMock(MappingManualDAO::class); | |
$this->integrationSyncDataExchange = $this->createMock(SyncDataExchangeInterface::class); | |
$this->internalSyncDataExchange = $this->createMock(MauticSyncDataExchange::class); | |
$this->inputOptionsDAO = $this->createMock(InputOptionsDAO::class); | |
$this->syncService = $this->createMock(SyncServiceInterface::class); | |
$this->syncProcess = new SyncProcess( | |
$this->syncDateHelper, | |
$this->mappingHelper, | |
$this->relationsHelper, | |
$this->integrationSyncProcess, | |
$this->mauticSyncProcess, | |
$this->eventDispatcher, | |
$this->notifier, | |
$this->mappingManualDAO, | |
$this->internalSyncDataExchange, | |
$this->integrationSyncDataExchange, | |
$this->inputOptionsDAO, | |
$this->syncService | |
); | |
} | |
public function testBatchSyncEventsAreDispatched(): void | |
{ | |
$this->inputOptionsDAO->expects($this->once()) | |
->method('pullIsEnabled') | |
->willReturn(true); | |
$this->inputOptionsDAO->expects($this->once()) | |
->method('pushIsEnabled') | |
->willReturn(true); | |
$this->syncDateHelper->expects($this->once()) | |
->method('setInternalSyncStartDateTime'); | |
// Integration to Mautic | |
// fetch the report from the integration | |
$integrationSyncReport = $this->createMock(ReportDAO::class); | |
$integrationSyncReport->expects($this->exactly(2)) | |
->method('shouldSync') | |
->willReturnOnConsecutiveCalls(true, false); | |
$this->integrationSyncProcess->expects($this->exactly(2)) | |
->method('getSyncReport') | |
->withConsecutive([1], [2]) | |
->willReturn($integrationSyncReport); | |
// generate the order based on the report | |
$integrationSyncOrder = $this->createMock(OrderDAO::class); | |
$integrationSyncOrder->expects($this->once()) | |
->method('shouldSync') | |
->willReturn(true); | |
$this->mauticSyncProcess->expects($this->once()) | |
->method('getSyncOrder') | |
->with($integrationSyncReport) | |
->willReturn($integrationSyncOrder); | |
$integrationSyncOrder->expects($this->once()) | |
->method('getDeletedObjects') | |
->willReturn([new ObjectChangeDAO('foobar', 'foo', 'foo1', 'contact', 1)]); | |
$integrationSyncOrder->expects($this->once()) | |
->method('getRemappedObjects') | |
->willReturn([new RemappedObjectDAO('foobar', 'foo', 'foo1', 'bar', 'bar1')]); | |
// execute the order | |
$objectMappings = $this->createMock(ObjectMappingsDAO::class); | |
$objectMappings->expects($this->once()) | |
->method('getNewMappings') | |
->willReturn([(new ObjectMapping())->setIntegrationObjectName('foo')]); | |
$objectMappings->expects($this->once()) | |
->method('getUpdatedMappings') | |
->willReturn([(new ObjectMapping())->setIntegrationObjectName('bar')]); | |
$this->internalSyncDataExchange->expects($this->once()) | |
->method('executeSyncOrder') | |
->willReturn($objectMappings); | |
$this->eventDispatcher | |
->method('dispatch') | |
->withConsecutive( | |
[ | |
// the integration to mautic batch event should be dispatched | |
$this->callback(function (CompletedSyncIterationEvent $event) { | |
$orderResult = $event->getOrderResults(); | |
Assert::assertCount(1, $orderResult->getUpdatedObjectMappings('bar')); | |
Assert::assertCount(1, $orderResult->getNewObjectMappings('foo')); | |
Assert::assertCount(1, $orderResult->getDeletedObjects('foo')); | |
Assert::assertCount(1, $orderResult->getRemappedObjects('bar')); | |
return true; | |
}), | |
IntegrationEvents::INTEGRATION_BATCH_SYNC_COMPLETED_INTEGRATION_TO_MAUTIC, | |
], | |
[ | |
// the integration to mautic batch event should be dispatched | |
$this->callback(function (CompletedSyncIterationEvent $event) { | |
$orderResult = $event->getOrderResults(); | |
Assert::assertCount(1, $orderResult->getNewObjectMappings('bar')); | |
Assert::assertCount(1, $orderResult->getUpdatedObjectMappings('foo')); | |
return true; | |
}), | |
IntegrationEvents::INTEGRATION_BATCH_SYNC_COMPLETED_MAUTIC_TO_INTEGRATION, | |
] | |
); | |
// Mautic to integration | |
// fetch the report from Mautic | |
$internalSyncReport = $this->createMock(ReportDAO::class); | |
$internalSyncReport->expects($this->exactly(2)) | |
->method('shouldSync') | |
->willReturnOnConsecutiveCalls(true, false); | |
$this->mauticSyncProcess->expects($this->exactly(2)) | |
->method('getSyncReport') | |
->withConsecutive([1], [2]) | |
->willReturn($internalSyncReport); | |
// generate the order based on the report | |
$internalSyncOrder = $this->createMock(OrderDAO::class); | |
$internalSyncOrder->expects($this->once()) | |
->method('shouldSync') | |
->willReturnOnConsecutiveCalls(true); | |
$internalSyncOrder->expects($this->exactly(2)) | |
->method('getObjectMappings') | |
->willReturn([(new ObjectMapping())->setIntegrationObjectName('bar')]); | |
$updatedObjectMapping = new UpdatedObjectMappingDAO('foobar', 'foo', 'foo1', new \DateTime()); | |
$updatedObjectMapping->setObjectMapping((new ObjectMapping())->setIntegrationObjectName('foo')); | |
// Test that getOrderResultsForInternalSync ignores an object with a missing ObjectMapping | |
$updatedObjectMapping2 = new UpdatedObjectMappingDAO('foobar', 'foo', 'foo2', new \DateTime()); | |
$internalSyncOrder->expects($this->exactly(2)) | |
->method('getUpdatedObjectMappings') | |
->willReturn([$updatedObjectMapping, $updatedObjectMapping2]); | |
$internalSyncOrder->expects($this->exactly(2)) | |
->method('getDeletedObjects') | |
->willReturn([]); // currently not supported for Mautic to integration | |
$internalSyncOrder->expects($this->exactly(2)) | |
->method('getRemappedObjects') | |
->willReturn([]); // currently not supported for Mautic to integration | |
$internalSyncOrder->expects($this->once()) | |
->method('getNotifications') | |
->willReturn([]); | |
$internalSyncOrder->expects($this->once()) | |
->method('getSuccessfullySyncedObjects') | |
->willReturn([]); | |
$this->integrationSyncProcess->expects($this->once()) | |
->method('getSyncOrder') | |
->with($internalSyncReport) | |
->willReturn($internalSyncOrder); | |
// execute the order | |
$this->internalSyncDataExchange->expects($this->once()) | |
->method('executeSyncOrder') | |
->willReturn($objectMappings); | |
$this->syncProcess->execute(); | |
} | |
} | |