Spaces:
No application file
No application file
mautic
/
app
/bundles
/IntegrationsBundle
/Tests
/Unit
/Sync
/SyncDataExchange
/MauticSyncDataExchangeTest.php
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Tests\Unit\Sync\SyncDataExchange; | |
use Mautic\IntegrationsBundle\Entity\FieldChangeRepository; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\MappingManualDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\InputOptionsDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\FieldDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\ObjectDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Request\RequestDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Value\NormalizedValueDAO; | |
use Mautic\IntegrationsBundle\Sync\Helper\MappingHelper; | |
use Mautic\IntegrationsBundle\Sync\Helper\SyncDateHelper; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Helper\FieldHelper; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\Executioner\OrderExecutioner; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\ReportBuilder\FullObjectReportBuilder; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\ReportBuilder\PartialObjectReportBuilder; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange; | |
use Mautic\LeadBundle\Entity\Lead; | |
use PHPUnit\Framework\Assert; | |
use PHPUnit\Framework\MockObject\MockObject; | |
use PHPUnit\Framework\TestCase; | |
class MauticSyncDataExchangeTest extends TestCase | |
{ | |
/** | |
* @var MockObject|FieldChangeRepository | |
*/ | |
private MockObject $fieldChangeRepository; | |
/** | |
* @var MockObject|FieldHelper | |
*/ | |
private MockObject $fieldHelper; | |
/** | |
* @var MockObject|MappingHelper | |
*/ | |
private MockObject $mappingHelper; | |
/** | |
* @var MockObject|FullObjectReportBuilder | |
*/ | |
private MockObject $fullObjectReportBuilder; | |
/** | |
* @var MockObject|PartialObjectReportBuilder | |
*/ | |
private MockObject $partialObjectReportBuilder; | |
/** | |
* @var MockObject|OrderExecutioner | |
*/ | |
private MockObject $orderExecutioner; | |
private MauticSyncDataExchange $mauticSyncDataExchange; | |
/** | |
* @var SyncDateHelper&MockObject | |
*/ | |
private MockObject $syncDateHelper; | |
protected function setUp(): void | |
{ | |
$this->fieldChangeRepository = $this->createMock(FieldChangeRepository::class); | |
$this->fieldHelper = $this->createMock(FieldHelper::class); | |
$this->mappingHelper = $this->createMock(MappingHelper::class); | |
$this->fullObjectReportBuilder = $this->createMock(FullObjectReportBuilder::class); | |
$this->partialObjectReportBuilder = $this->createMock(PartialObjectReportBuilder::class); | |
$this->orderExecutioner = $this->createMock(OrderExecutioner::class); | |
$this->syncDateHelper = $this->createMock(SyncDateHelper::class); | |
$this->mauticSyncDataExchange = new MauticSyncDataExchange( | |
$this->fieldChangeRepository, | |
$this->fieldHelper, | |
$this->mappingHelper, | |
$this->fullObjectReportBuilder, | |
$this->partialObjectReportBuilder, | |
$this->orderExecutioner, | |
$this->syncDateHelper | |
); | |
} | |
public function testFirstTimeSyncUsesFullObjectBuilder(): void | |
{ | |
$inputOptionsDAO = new InputOptionsDAO( | |
[ | |
'integration' => 'foobar', | |
'first-time-sync' => true, | |
] | |
); | |
$requestDAO = new RequestDAO('foobar', 1, $inputOptionsDAO); | |
$this->fullObjectReportBuilder->expects($this->once()) | |
->method('buildReport') | |
->with($requestDAO); | |
$this->partialObjectReportBuilder->expects($this->never()) | |
->method('buildReport') | |
->with($requestDAO); | |
$this->mauticSyncDataExchange->getSyncReport($requestDAO); | |
} | |
public function testSyncingSpecificMauticIdsUseFullObjectBuilder(): void | |
{ | |
$inputOptionsDAO = new InputOptionsDAO( | |
[ | |
'integration' => 'foobar', | |
'mautic-object-id' => [1, 2, 3], | |
] | |
); | |
$requestDAO = new RequestDAO('foobar', 1, $inputOptionsDAO); | |
$this->fullObjectReportBuilder->expects($this->once()) | |
->method('buildReport') | |
->with($requestDAO); | |
$this->partialObjectReportBuilder->expects($this->never()) | |
->method('buildReport') | |
->with($requestDAO); | |
$this->mauticSyncDataExchange->getSyncReport($requestDAO); | |
} | |
public function testUseOfPartialObjectBuilder(): void | |
{ | |
$inputOptionsDAO = new InputOptionsDAO( | |
[ | |
'integration' => 'foobar', | |
] | |
); | |
$requestDAO = new RequestDAO('foobar', 1, $inputOptionsDAO); | |
$this->fullObjectReportBuilder->expects($this->never()) | |
->method('buildReport') | |
->with($requestDAO); | |
$this->partialObjectReportBuilder->expects($this->once()) | |
->method('buildReport') | |
->with($requestDAO); | |
$this->mauticSyncDataExchange->getSyncReport($requestDAO); | |
} | |
public function testGetConflictedInternalObjectWithNoObjectId(): void | |
{ | |
$mappingManualDao = new MappingManualDAO('IntegrationA'); | |
$integrationObjectDao = new ObjectDAO('Lead', 'some-SF-ID'); | |
$this->mappingHelper->expects($this->once()) | |
->method('findMauticObject') | |
->with($mappingManualDao, 'lead', $integrationObjectDao) | |
->willReturn(new ObjectDAO('lead', null)); | |
// No need to make the DB query when ID is null. | |
$this->fieldChangeRepository->expects($this->never()) | |
->method('findChangesForObject'); | |
$internalObjectDao = $this->mauticSyncDataExchange->getConflictedInternalObject($mappingManualDao, 'lead', $integrationObjectDao); | |
Assert::assertSame('lead', $internalObjectDao->getObject()); | |
Assert::assertNull($internalObjectDao->getObjectId()); | |
} | |
public function testGetConflictedInternalObjectWithObjectId(): void | |
{ | |
$mappingManualDao = new MappingManualDAO('IntegrationA'); | |
$integrationObjectDao = new ObjectDAO('Lead', 'some-SF-ID'); | |
$fieldChange = [ | |
'modified_at' => '2020-08-25 17:20:00', | |
'column_type' => 'text', | |
'column_value' => 'some-field-value', | |
'column_name' => 'some-field-name', | |
]; | |
$this->mappingHelper->expects($this->once()) | |
->method('findMauticObject') | |
->with($mappingManualDao, 'lead', $integrationObjectDao) | |
->willReturn(new ObjectDAO('lead', 123)); | |
$this->mappingHelper->method('getMauticEntityClassName') | |
->with('lead') | |
->willReturn(Lead::class); | |
$this->fieldHelper->method('getFieldChangeObject') | |
->with($fieldChange) | |
->willReturn(new FieldDAO('some-field-name', new NormalizedValueDAO('type', 'some-field-value'))); | |
$this->fieldChangeRepository->expects($this->once()) | |
->method('findChangesForObject') | |
->with('IntegrationA', Lead::class, 123) | |
->willReturn([$fieldChange]); | |
$internalObjectDao = $this->mauticSyncDataExchange->getConflictedInternalObject($mappingManualDao, 'lead', $integrationObjectDao); | |
Assert::assertSame('lead', $internalObjectDao->getObject()); | |
Assert::assertSame(123, $internalObjectDao->getObjectId()); | |
Assert::assertCount(1, $internalObjectDao->getFields()); | |
} | |
} | |