View source  
  <?php
namespace Drupal\Tests\acquia_contenthub\Kernel\EventSubscriber\ExportUnownedContentOnDualConfigSites;
use Acquia\ContentHubClient\CDF\CDFObject;
use Acquia\ContentHubClient\CDFAttribute;
use Acquia\ContentHubClient\CDFDocument;
use Acquia\ContentHubClient\ContentHubClient;
use Drupal\acquia_contenthub\Event\PrunePublishCdfEntitiesEvent;
use Drupal\acquia_contenthub\PubSubModuleStatusChecker;
use Drupal\acquia_contenthub_subscriber\EventSubscriber\PrunePublishEntities\PruneImportedEntitiesFromExport;
use Drupal\acquia_contenthub_subscriber\SubscriberTracker;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
class PruneImportedEntitiesFromExportTest extends EntityKernelTestBase {
  
  private $checker;
  
  private $event;
  
  public static $modules = [
    'user',
    'field',
    'depcalc',
    'acquia_contenthub',
    PubSubModuleStatusChecker::ACQUIA_CONTENTHUB_SUBSCRIBER_MODULE_ID,
  ];
  
  private $tracker;
  
  private $client;
  
  private $document;
  
  private $thisSiteOrigin;
  
  private $untrackedUnownedUuid;
  
  private $untrackedOwnedUuid;
  
  private $trackedUnownedUuid;
  
  private $otherSiteOrigin;
  
  private $database;
  
  protected function setUp() {
    parent::setUp();
    $time = time();
    $entity_type = 'user';
    $this->database = \Drupal::database();
    $this->thisSiteOrigin = 'this_site_uuid';
    $this->otherSiteOrigin = 'some-other-origin';
    $this->untrackedOwnedUuid = 'some-uuid-1';
    $this->trackedUnownedUuid = 'some-uuid-2';
    $this->untrackedUnownedUuid = 'some-uuid-3';
    $this
      ->installEntitySchema($entity_type);
    $this
      ->installSchema($entity_type, [
      'users_data',
    ]);
    $this
      ->installSchema('acquia_contenthub_subscriber', 'acquia_contenthub_subscriber_import_tracking');
    $this
      ->createUser([
      'uuid' => $this->untrackedUnownedUuid,
      'name' => 'foo',
      'mail' => 'foo@foo.com',
    ]);
    $tracked_objects = [
      $this->trackedUnownedUuid => new CDFObject($entity_type, $this->trackedUnownedUuid, $time, $time, $this->otherSiteOrigin, []),
    ];
    $untracked_objects = [
      $this->untrackedOwnedUuid => new CDFObject($entity_type, $this->untrackedOwnedUuid, $time, $time, $this->thisSiteOrigin, []),
      $this->untrackedUnownedUuid => new CDFObject($entity_type, $this->untrackedUnownedUuid, $time, $time, $this->otherSiteOrigin, []),
    ];
    $untracked_objects[$this->untrackedUnownedUuid]
      ->addAttribute('entity_type', CDFAttribute::TYPE_ARRAY_STRING, $entity_type);
    $untracked_objects[$this->untrackedUnownedUuid]
      ->addAttribute('hash', CDFAttribute::TYPE_ARRAY_STRING, $this->otherSiteOrigin);
    $this
      ->trackImportedCdf(...array_values($tracked_objects));
    $this->tracker = new SubscriberTracker($this->database);
    $this->checker = $this
      ->prophesize(PubSubModuleStatusChecker::class);
    $this->checker
      ->siteHasDualConfiguration()
      ->willReturn(TRUE);
    $this->client = $this
      ->prophesize(ContentHubClient::class);
    $this->client
      ->getEntities()
      ->withArguments([
      array_keys($untracked_objects),
    ])
      ->willReturn(new CDFDocument(...array_values($untracked_objects)));
    $this->document = new CDFDocument(...array_values(array_merge($tracked_objects, $untracked_objects)));
    $this->event = new PrunePublishCdfEntitiesEvent($this->client
      ->reveal(), $this->document, $this->thisSiteOrigin);
  }
  
  public function testIfSiteHasDualConfigurationEntitiesOriginatedElsewhereWontBeExported() : void {
    
    $this
      ->assertFalse($this->tracker
      ->isTracked($this->untrackedOwnedUuid));
    $this
      ->assertTrue($this->tracker
      ->isTracked($this->trackedUnownedUuid));
    $this
      ->assertFalse($this->tracker
      ->isTracked($this->untrackedUnownedUuid));
    $this
      ->triggerEvent($this->event);
    $document = $this->event
      ->getDocument();
    
    $this
      ->assertTrue($document
      ->hasEntity($this->untrackedOwnedUuid));
    
    $this
      ->assertFalse($document
      ->hasEntity($this->trackedUnownedUuid));
    $this
      ->assertTrue($this->tracker
      ->isTracked($this->trackedUnownedUuid));
    
    $this
      ->assertFalse($document
      ->hasEntity($this->untrackedUnownedUuid));
  }
  
  private function triggerEvent(PrunePublishCdfEntitiesEvent $event) : void {
    $handler = new PruneImportedEntitiesFromExport($this->tracker, $this->checker
      ->reveal(), \Drupal::service('entity.repository'));
    $handler
      ->onPrunePublishCdfEntitiesIfSiteHasDualConfiguration($event);
  }
  
  private function trackImportedCdf(CDFObject ...$objects) : void {
    $query = $this->database
      ->insert('acquia_contenthub_subscriber_import_tracking')
      ->fields([
      'entity_uuid',
      'entity_type',
      'entity_id',
      'first_imported',
      'last_imported',
      'hash',
      'status',
    ]);
    foreach ($objects as $object) {
      $query
        ->values([
        $object
          ->getUuid(),
        $object
          ->getType(),
        1,
        date('c'),
        date('c'),
        'some-hash-value',
        SubscriberTracker::IMPORTED,
      ]);
    }
    $query
      ->execute();
  }
}