Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\IntegrationsBundle\Tests\Unit\Helper; | |
| use Mautic\IntegrationsBundle\Exception\InvalidFormOptionException; | |
| use Mautic\IntegrationsBundle\Helper\FieldMergerHelper; | |
| use Mautic\IntegrationsBundle\Integration\Interfaces\ConfigFormSyncInterface; | |
| use Mautic\IntegrationsBundle\Mapping\MappedFieldInfoInterface; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Mapping\ObjectMappingDAO; | |
| use PHPUnit\Framework\TestCase; | |
| class FieldMergerHelperTest extends TestCase | |
| { | |
| public function testNonExistingFieldsAreRemoved(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(true); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| 'syncDirection' => 'bidirectional', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertFalse(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testFieldUnsetIfMappingIsDeleted(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| unset($fields['Lead']['field1']); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertFalse(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testCurrentFieldMappingsAreMerged(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| 'syncDirection' => 'mautic', | |
| ], | |
| ]; | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field1 = $integrationFields['field1']; | |
| $field1->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(true); | |
| $field1->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(true); | |
| $field1->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertEquals($updatedFieldMappings['field1']['mappedField'], $mergedFieldMappings['Lead']['field1']['mappedField']); | |
| $this->assertEquals($updatedFieldMappings['field1']['syncDirection'], $mergedFieldMappings['Lead']['field1']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testCurrentFieldMappingsAreMergedWithJustMappedFieldUpdated(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field4' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field4 */ | |
| $field4 = $integrationFields['field4']; | |
| $field4->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(false); | |
| $field4->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(false); | |
| $field4->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertEquals($updatedFieldMappings['field4']['mappedField'], $mergedFieldMappings['Lead']['field4']['mappedField']); | |
| $this->assertEquals(ObjectMappingDAO::SYNC_TO_MAUTIC, $mergedFieldMappings['Lead']['field4']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testCurrentFieldMappingsAreMergedWithJustSyncDirectionUpdated(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field4' => [ | |
| 'syncDirection' => ObjectMappingDAO::SYNC_TO_INTEGRATION, | |
| ], | |
| ]; | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field4 = $integrationFields['field4']; | |
| $field4->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(false); | |
| $field4->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(true); | |
| $field4->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertEquals($fields['Lead']['field4']['mappedField'], $mergedFieldMappings['Lead']['field4']['mappedField']); | |
| $this->assertEquals($updatedFieldMappings['field4']['syncDirection'], $mergedFieldMappings['Lead']['field4']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testFieldUnsetIfDirectionIsUpdatedWithoutMappedField(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| unset($fields['Lead']['field1']); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => '', | |
| 'syncDirection' => 'bidirectional', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertFalse(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testDefaultSyncDirectionSetWithExisting(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field4 = $integrationFields['field4']; | |
| $field4->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(true); | |
| $field4->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(true); | |
| $field4->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field4' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertEquals(ObjectMappingDAO::SYNC_TO_MAUTIC, $mergedFieldMappings['Lead']['field4']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testDefaultSyncDirectionSetWithBidirectionalSupported(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field1 = $integrationFields['field1']; | |
| $field1->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(true); | |
| $field1->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(true); | |
| $field1->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertEquals(ObjectMappingDAO::SYNC_BIDIRECTIONALLY, $mergedFieldMappings['Lead']['field1']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testDefaultSyncDirectionSetWithIntegrationDirectionalSupported(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| unset($fields['Lead']['field1']); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field1 = $integrationFields['field1']; | |
| $field1->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(true); | |
| $field1->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertEquals(ObjectMappingDAO::SYNC_TO_INTEGRATION, $mergedFieldMappings['Lead']['field1']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testDefaultSyncDirectionSetWithMauticDirectionalSupported(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| unset($fields['Lead']['field1']); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field1 = $integrationFields['field1']; | |
| $field1->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertEquals(ObjectMappingDAO::SYNC_TO_MAUTIC, $mergedFieldMappings['Lead']['field1']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testCurrentSyncDirectionOverwrittenWithSupportedDirectionalSync(): void | |
| { | |
| $fields = $this->getCurrentFieldMappings(); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field1 = $integrationFields['field1']; | |
| $field1->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(true); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| $mergedFieldMappings = $fieldMergerHelper->getFieldMappings(); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field1'])); | |
| $this->assertEquals(ObjectMappingDAO::SYNC_TO_MAUTIC, $mergedFieldMappings['Lead']['field1']['syncDirection']); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field2'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field3'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field4'])); | |
| $this->assertTrue(isset($mergedFieldMappings['Lead']['field5'])); | |
| } | |
| public function testDefaultSyncDirectionThrowsExceptionIfFieldDoesNotHaveSyncDirectionSupportDefined(): void | |
| { | |
| $this->expectException(InvalidFormOptionException::class); | |
| $fields = $this->getCurrentFieldMappings(); | |
| unset($fields['Lead']['field1']); | |
| $integrationObject = $this->getIntegrationObject(); | |
| $integrationFields = $integrationObject->getAllFieldsForMapping('Lead'); | |
| /** @var MappedFieldInfoInterface|\PHPUnit\Framework\MockObject\MockObject $field1 */ | |
| $field1 = $integrationFields['field1']; | |
| $field1->expects($this->once()) | |
| ->method('isBidirectionalSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToIntegrationSyncEnabled') | |
| ->willReturn(false); | |
| $field1->expects($this->once()) | |
| ->method('isToMauticSyncEnabled') | |
| ->willReturn(false); | |
| $fieldMergerHelper = new FieldMergerHelper($integrationObject, $fields); | |
| $updatedFieldMappings = [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_test_field', | |
| ], | |
| ]; | |
| $fieldMergerHelper->mergeSyncFieldMapping('Lead', $updatedFieldMappings); | |
| } | |
| /** | |
| * @return \PHPUnit\Framework\MockObject\MockObject|ConfigFormSyncInterface | |
| */ | |
| private function getIntegrationObject(bool $removeFirstField = false): ConfigFormSyncInterface | |
| { | |
| $field1 = $this->createMock(MappedFieldInfoInterface::class); | |
| $field1->method('getName') | |
| ->willReturn('field one'); | |
| $field2 = $this->createMock(MappedFieldInfoInterface::class); | |
| $field2->method('getName') | |
| ->willReturn('field two'); | |
| $field3 = $this->createMock(MappedFieldInfoInterface::class); | |
| $field3->method('getName') | |
| ->willReturn('field three'); | |
| $field4 = $this->createMock(MappedFieldInfoInterface::class); | |
| $field4->method('getName') | |
| ->willReturn('field four'); | |
| $field5 = $this->createMock(MappedFieldInfoInterface::class); | |
| $field5->method('getName') | |
| ->willReturn('field five'); | |
| $fields = [ | |
| 'field1' => $field1, | |
| 'field2' => $field2, | |
| 'field3' => $field3, | |
| 'field4' => $field4, | |
| 'field5' => $field5, | |
| ]; | |
| if ($removeFirstField) { | |
| unset($fields['field1']); | |
| } | |
| $integrationObject = $this->createMock(ConfigFormSyncInterface::class); | |
| $integrationObject->method('getAllFieldsForMapping') | |
| ->willReturn($fields); | |
| return $integrationObject; | |
| } | |
| private function getCurrentFieldMappings(): array | |
| { | |
| return [ | |
| 'Lead' => [ | |
| 'field1' => [ | |
| 'mappedField' => 'mautic_field1', | |
| 'syncDirection' => ObjectMappingDAO::SYNC_BIDIRECTIONALLY, | |
| ], | |
| 'field2' => [ | |
| 'mappedField' => 'mautic_field2', | |
| 'syncDirection' => ObjectMappingDAO::SYNC_BIDIRECTIONALLY, | |
| ], | |
| 'field3' => [ | |
| 'mappedField' => 'mautic_field3', | |
| 'syncDirection' => ObjectMappingDAO::SYNC_BIDIRECTIONALLY, | |
| ], | |
| 'field4' => [ | |
| 'mappedField' => 'mautic_field4', | |
| 'syncDirection' => ObjectMappingDAO::SYNC_TO_MAUTIC, | |
| ], | |
| 'field5' => [ | |
| 'mappedField' => 'mautic_field5', | |
| 'syncDirection' => ObjectMappingDAO::SYNC_TO_INTEGRATION, | |
| ], | |
| ], | |
| ]; | |
| } | |
| } | |