multiversion-8.x-1.0-beta34/tests/src/Functional/ConflictTrackerTest.php
tests/src/Functional/ConflictTrackerTest.php
<?php namespace Drupal\Tests\multiversion\Functional; /** * Test the methods on the ConflictTracker class. * * @group multiversion */ class ConflictTrackerTest extends MultiversionFunctionalTestBase { /** * @var \Drupal\multiversion\Workspace\ConflictTracker; */ protected $conflictTracker; /** * @var \Drupal\Core\Entity\EntityStorageInterface; */ protected $storage; /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); $this->conflictTracker = \Drupal::service('workspace.conflict_tracker'); $this->storage = $this->entityTypeManager->getStorage('entity_test_rev'); } /** * Tests the Conflict Tracker. */ public function testConflictTracker() { $entity_1_conflicts = $this->checkEntityConflicts(); $entity_2_conflicts = $this->checkEntityConflicts(6); $all_entities_conflicts = $entity_1_conflicts + $entity_2_conflicts; $all_tracker_conflicts = $this->conflictTracker->getAll(); $this->assertEqual($all_entities_conflicts, $all_tracker_conflicts, 'Both entities conflicts are tracked in workspace conflict tracker.'); $entity_1_uuid = array_keys($entity_1_conflicts)[0]; $this->resolveConflicts($entity_1_uuid); // Check that after all conflicts have been resolved for entity 1 it is remove completely from the tracker. $all_tracker_conflicts = $this->conflictTracker->getAll(); $this->assertEqual($entity_2_conflicts, $all_tracker_conflicts, 'Workspace conflicts only contain Entity 1\'s conflicts after Entity 2\' conflicts resolved.'); } /** * Checks the conflict tracker for one entity. * * @return array * keys - uuid of entity * values - The conflicts array as returned from ConflictTracker::get(). */ protected function checkEntityConflicts($revision_start = 0) { /** @var \Drupal\entity_test\Entity\EntityTest $entity */ $entity = $this->storage->create(); $uuid = $entity->uuid(); // Create a conflict scenario to fully test the parsing. // Initial revision. $entity->save(); $revs[] = $entity->_rev->value; $entity->save(); $revs[] = $entity->_rev->value; $entity->save(); $revs[] = $leaf_one = $entity->_rev->value; // Create a new branch from the second revision. $entity = $this->storage->loadRevision($revision_start + 2); $entity->save(); $revs[] = $entity->_rev->value; // Continue the last branch. $entity = $this->storage->loadRevision($revision_start + 4); $entity->save(); $revs[] = $entity->_rev->value; // Create a new branch based on the first revision. $entity = $this->storage->loadRevision($revision_start + 1); $entity->save(); $revs[] = $entity->_rev->value; $expected_conflicts = [ $revs[2] => 'available', $revs[5] => 'available', ]; $tracker_conflicts = $this->conflictTracker->get($uuid); $this->assertEqual($tracker_conflicts, $expected_conflicts, 'Tracker conflicts are correct'); return [$uuid => $tracker_conflicts]; } /** * Resolve a conflict and make sure it removed from the tracker. * * @param $uuid * The uuid of entity to resolve a conflict for. */ protected function resolveConflicts($uuid) { // Get the conflicts for this entity. $expected_conflicts = $this->conflictTracker->get($uuid); $revs = array_keys($expected_conflicts); foreach ($revs as $rev) { // Load and delete one of the revisions in conflict $record = \Drupal::service('multiversion.entity_index.rev')->get("$uuid:$rev"); $revision = $this->storage->loadRevision($record['revision_id']); $revision->delete(); // Unset the expected conflict for the revision just deleted. unset($expected_conflicts[$rev]); $tracker_conflicts = $this->conflictTracker->get($uuid); $this->assertEqual($tracker_conflicts, $expected_conflicts, 'Resolved conflict removed correctly.'); } $this->assertEqual($tracker_conflicts, [], 'All conflicts resolved for entity.'); } }