View source
<?php
namespace Drupal\Tests\entity_reference_revisions\Kernel;
use Drupal\entity_composite_relationship_test\Entity\EntityTestCompositeRelationship;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
use Drupal\Tests\node\Traits\NodeCreationTrait;
class EntityReferenceRevisionsCompositeTest extends EntityKernelTestBase {
use ContentTypeCreationTrait;
use NodeCreationTrait;
public static $modules = array(
'node',
'field',
'entity_reference_revisions',
'entity_composite_relationship_test',
'language',
);
protected $database;
protected $entityTypeManager;
protected $cron;
protected function setUp() {
parent::setUp();
$this
->installEntitySchema('entity_test_composite');
$this
->installSchema('node', [
'node_access',
]);
NodeType::create([
'type' => 'article',
'name' => 'Article',
])
->save();
$field_storage = FieldStorageConfig::create(array(
'field_name' => 'composite_reference',
'entity_type' => 'node',
'type' => 'entity_reference_revisions',
'settings' => array(
'target_type' => 'entity_test_composite',
),
));
$field_storage
->save();
$field = FieldConfig::create(array(
'field_storage' => $field_storage,
'bundle' => 'article',
'translatable' => FALSE,
));
$field
->save();
$this->database = \Drupal::database();
$this->entityTypeManager = \Drupal::entityTypeManager();
$this->cron = \Drupal::service('cron');
}
public function testEntityReferenceRevisionsCompositeRelationship() {
$composite = EntityTestCompositeRelationship::create(array(
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
));
$composite
->save();
$composite_revisions_count = \Drupal::entityQuery('entity_test_composite')
->condition('uuid', $composite
->uuid())
->allRevisions()
->count()
->execute();
$this
->assertEquals(1, $composite_revisions_count);
$node = Node::create(array(
'title' => $this
->randomMachineName(),
'type' => 'article',
));
$node
->save();
$node
->set('composite_reference', $composite);
$this
->assertTrue($node
->hasTranslationChanges());
$node
->save();
$node_revisions_count = \Drupal::entityQuery('node')
->condition('nid', $node
->id())
->allRevisions()
->count()
->execute();
$this
->assertEquals(1, $node_revisions_count);
$composite_revisions_count = \Drupal::entityQuery('entity_test_composite')
->condition('uuid', $composite
->uuid())
->allRevisions()
->count()
->execute();
$this
->assertEquals(1, $composite_revisions_count);
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertEquals($node
->getEntityTypeId(), $composite->parent_type->value);
$this
->assertEquals($node
->id(), $composite->parent_id->value);
$this
->assertEquals('composite_reference', $composite->parent_field_name->value);
$original_composite_revision = $node->composite_reference[0]->target_revision_id;
$original_node_revision = $node
->getRevisionId();
$node
->setTitle('2nd revision');
$node
->setNewRevision();
$node
->save();
$node = Node::load($node
->id());
$this
->assertEquals('2nd revision', $node
->getTitle(), 'New node revision has changed data.');
$this
->assertNotEquals($original_composite_revision, $node->composite_reference[0]->target_revision_id, 'Composite entity got new revision when its host did.');
$node_revisions_count = \Drupal::entityQuery('node')
->condition('nid', $node
->id())
->allRevisions()
->count()
->execute();
$this
->assertEquals(2, $node_revisions_count);
$node = $this->entityTypeManager
->getStorage('node')
->loadRevision($original_node_revision);
$node
->setNewRevision();
$node
->isDefaultRevision(TRUE);
$node
->save();
$node = Node::load($node
->id());
$this
->assertNotEquals('2nd revision', $node
->getTitle(), 'Node did not keep changed title after reversion.');
$this
->assertNotEquals($original_composite_revision, $node->composite_reference[0]->target_revision_id, 'Composite entity got new revision when its host reverted to an old revision.');
$node_storage = $this->entityTypeManager
->getStorage('node');
$node
->set('composite_reference', []);
$this
->assertTrue($node
->hasTranslationChanges());
$changed_composite_reference = $composite;
$changed_composite_reference
->set('name', 'Changing composite reference');
$this
->assertTrue((bool) $changed_composite_reference
->isRevisionTranslationAffected());
$node
->set('composite_reference', $changed_composite_reference);
$node
->setNewRevision();
$this
->assertTrue($node
->hasTranslationChanges());
$node
->save();
$nid = $node
->id();
$node_storage
->resetCache([
$nid,
]);
$node = $node_storage
->load($nid);
$this
->assertEquals('Changing composite reference', $node
->get('composite_reference')->entity
->getName());
$node_revisions_count = $node_storage
->getQuery()
->condition('nid', $nid)
->allRevisions()
->count()
->execute();
$this
->assertEqual($node_revisions_count, 4);
$node_revisions_count = $node_storage
->getQuery()
->condition('nid', $nid)
->allRevisions()
->condition('revision_translation_affected', NULL, 'IS NULL')
->count()
->execute();
$this
->assertEqual($node_revisions_count, 0, 'Node has a revision with revision translation affected set to NULL');
$node
->set('composite_reference', $composite);
$node
->delete();
$this
->assertNotNull(EntityTestCompositeRelationship::load($composite
->id()));
$this->cron
->run();
$this
->assertNull(EntityTestCompositeRelationship::load($composite
->id()));
$composite = EntityTestCompositeRelationship::create([
'name' => $this
->randomMachineName(),
]);
$composite
->save();
$node = Node::create([
'title' => $this
->randomMachineName(),
'type' => 'article',
'composite_reference' => $composite,
]);
$node
->save();
$composite
->delete();
$field_item = $node
->get('composite_reference')
->get(0);
$field_item
->setValue($field_item
->getValue(), FALSE);
$new_revision = $this->entityTypeManager
->getStorage('node')
->createRevision($node);
$this
->assertTrue($new_revision
->get('composite_reference')
->isEmpty());
}
function testCompositeRelationshipWithTranslationNonTranslatableField() {
ConfigurableLanguage::createFromLangcode('de')
->save();
$composite = EntityTestCompositeRelationship::create(array(
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
));
$composite
->addTranslation('de', $composite
->toArray());
$composite
->save();
$node = Node::create(array(
'title' => $this
->randomMachineName(),
'type' => 'article',
'composite_reference' => $composite,
));
$node
->addTranslation('de', $node
->toArray());
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertEquals($node
->getEntityTypeId(), $composite->parent_type->value);
$this
->assertEquals($node
->id(), $composite->parent_id->value);
$this
->assertEquals('composite_reference', $composite->parent_field_name->value);
$this
->assertTrue($composite
->hasTranslation('de'));
$node
->removeTranslation('de');
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this
->assertFalse($composite
->hasTranslation('de'));
$node
->set('langcode', 'de');
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$node
->delete();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNull($composite);
}
function testCompositeRelationshipWithTranslationTranslatableField() {
$field_config = FieldConfig::loadByName('node', 'article', 'composite_reference');
$field_config
->setTranslatable(TRUE);
$field_config
->save();
ConfigurableLanguage::createFromLangcode('de')
->save();
$composite = EntityTestCompositeRelationship::create(array(
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
));
$composite
->addTranslation('de', $composite
->toArray());
$composite
->save();
$node = Node::create(array(
'title' => $this
->randomMachineName(),
'type' => 'article',
'composite_reference' => $composite,
));
$node
->addTranslation('de', $node
->toArray());
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertEquals($node
->getEntityTypeId(), $composite->parent_type->value);
$this
->assertEquals($node
->id(), $composite->parent_id->value);
$this
->assertEquals('composite_reference', $composite->parent_field_name->value);
$node
->removeTranslation('de');
$node
->save();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$node
->delete();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNull($composite);
}
function testCompositeRelationshipWithRevisions() {
$composite = EntityTestCompositeRelationship::create(array(
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
));
$composite
->save();
$node = Node::create(array(
'title' => $this
->randomMachineName(),
'type' => 'article',
'composite_reference' => $composite,
));
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$composite_original_revision_id = $composite
->getRevisionId();
$node_original_revision_id = $node
->getRevisionId();
$this
->assertEquals($node
->getEntityTypeId(), $composite->parent_type->value);
$this
->assertEquals($node
->id(), $composite->parent_id->value);
$this
->assertEquals('composite_reference', $composite->parent_field_name->value);
$node
->setNewRevision(TRUE);
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotEquals($composite_original_revision_id, $composite
->getRevisionId());
$this->entityTypeManager
->getStorage('node')
->deleteRevision($node_original_revision_id);
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$composite_revision = $this->entityTypeManager
->getStorage('entity_test_composite')
->loadRevision($composite_original_revision_id);
$this
->assertNull($composite_revision);
$node
->delete();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNull($composite);
}
function testCompositeRelationshipDefaultRevision() {
$composite = EntityTestCompositeRelationship::create([
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
]);
$composite
->save();
$node = Node::create([
'title' => $this
->randomMachineName(),
'type' => 'article',
'composite_reference' => $composite,
]);
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$composite_original_revision_id = $composite
->getRevisionId();
$node_original_revision_id = $node
->getRevisionId();
$node
->setNewRevision(TRUE);
$node
->save();
$composite2 = EntityTestCompositeRelationship::load($composite
->id());
$composite2_rev_id = $composite2
->getRevisionId();
$this
->assertNotEquals($composite2_rev_id, $composite_original_revision_id);
$composite_original = $this->entityTypeManager
->getStorage('entity_test_composite')
->loadRevision($composite_original_revision_id);
$composite_original
->isDefaultRevision(TRUE);
$composite_original
->save();
$this
->assertEquals($composite_original_revision_id, $composite_original
->getrevisionId());
$this->entityTypeManager
->getStorage('node')
->deleteRevision($node_original_revision_id);
$composite_default = EntityTestCompositeRelationship::load($composite_original
->id());
$this
->assertNotNull($composite_default);
$composite_default_revision = $this->entityTypeManager
->getStorage('entity_test_composite')
->loadRevision($composite_original
->getrevisionId());
$this
->assertNotNull($composite_default_revision);
$composite2_revision = $this->entityTypeManager
->getStorage('entity_test_composite')
->loadRevision($composite2_rev_id);
$this
->assertNotNull($composite2_revision);
}
function testCompositeRelationshipDuplicatedRevisions() {
$composite = EntityTestCompositeRelationship::create([
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
]);
$composite
->save();
$node = Node::create([
'title' => $this
->randomMachineName(),
'type' => 'article',
'composite_reference' => $composite,
]);
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$composite_original_revision_id = $composite
->getRevisionId();
$node_original_revision_id = $node
->getRevisionId();
$node
->setNewRevision(TRUE);
$node
->save();
$composite2 = EntityTestCompositeRelationship::load($composite
->id());
$composite2_rev_id = $composite2
->getRevisionId();
$this
->assertNotEquals($composite2_rev_id, $composite_original_revision_id);
$this->database
->update('node__composite_reference')
->fields([
'composite_reference_target_revision_id' => $composite_original_revision_id,
])
->condition('revision_id', $node
->getRevisionId())
->execute();
$this->database
->update('node_revision__composite_reference')
->fields([
'composite_reference_target_revision_id' => $composite_original_revision_id,
])
->condition('revision_id', $node
->getRevisionId())
->execute();
$this->entityTypeManager
->getStorage('node')
->deleteRevision($node_original_revision_id);
$composite2 = EntityTestCompositeRelationship::load($composite2
->id());
$this
->assertNotNull($composite2);
$composite_original_revision = $this->entityTypeManager
->getStorage('entity_test_composite')
->loadRevision($composite_original_revision_id);
$this
->assertNotNull($composite_original_revision);
$composite2_revision = $this->entityTypeManager
->getStorage('entity_test_composite')
->loadRevision($composite2_rev_id);
$this
->assertNotNull($composite2_revision);
$node
->delete();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite2
->id());
$this
->assertNull($composite);
}
public function testCompositeDeleteAfterRemovingReference() {
list($composite, $node) = $this
->assignCompositeToNode();
$node
->set('composite_reference', NULL);
$node
->save();
$node
->delete();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNull($composite);
}
public function testCompositeDeleteAfterRemovingReferenceWithRevisions() {
list($composite, $node) = $this
->assignCompositeToNode();
$node
->set('composite_reference', NULL);
$node
->setNewRevision();
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$node
->delete();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNull($composite);
}
public function testCompositeDeleteAfterChangingParent() {
list($composite, $node) = $this
->assignCompositeToNode();
$node
->set('composite_reference', NULL);
$node
->setNewRevision();
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$composite
->setNewRevision(TRUE);
$composite
->save();
$second_node = Node::create([
'title' => 'Second node',
'type' => 'article',
'composite_reference' => $composite,
]);
$second_node
->save();
$second_node
->set('composite_reference', NULL);
$second_node
->setNewRevision(TRUE);
$second_node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this
->assertRevisionCount(2, 'entity_test_composite', $composite
->id());
$this
->assertRevisionCount(2, 'node', $node
->id());
$this
->assertRevisionCount(2, 'node', $second_node
->id());
$second_node
->delete();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$node
->delete();
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNull($composite);
}
public function testCompositeDeleteRevisionAfterChangingParent() {
list($composite, $node) = $this
->assignCompositeToNode();
$node
->set('composite_reference', NULL);
$node
->setNewRevision();
$node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$composite
->setNewRevision(TRUE);
$composite
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$second_node = Node::create([
'title' => 'Second node',
'type' => 'article',
'composite_reference' => $composite,
]);
$second_node
->save();
$second_node
->set('composite_reference', NULL);
$second_node
->setNewRevision(TRUE);
$second_node
->save();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this
->assertRevisionCount(2, 'entity_test_composite', $composite
->id());
$this
->assertRevisionCount(2, 'node', $node
->id());
$this
->assertRevisionCount(2, 'node', $second_node
->id());
$node
->delete();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this
->assertRevisionCount(1, 'entity_test_composite', $composite
->id());
}
public function testCompositeDeleteAfterDuplicatingParent() {
list($composite, $node) = $this
->assignCompositeToNode();
$node
->setNewRevision(TRUE);
$node
->save();
$duplicate_node = $node
->createDuplicate();
$duplicate_node
->save();
$duplicate_node
->setNewRevision(TRUE);
$duplicate_node
->save();
$this
->assertRevisionCount(3, 'entity_test_composite', $composite
->id());
$this
->assertRevisionCount(2, 'node', $node
->id());
$this
->assertRevisionCount(2, 'node', $duplicate_node
->id());
$duplicate_node
->delete();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
$this->cron
->run();
$composite = EntityTestCompositeRelationship::load($composite
->id());
$this
->assertNotNull($composite);
}
protected function assertRevisionCount($expected, $entity_type_id, $entity_id) {
$id_field = \Drupal::entityTypeManager()
->getDefinition($entity_type_id)
->getKey('id');
$revision_count = \Drupal::entityQuery($entity_type_id)
->condition($id_field, $entity_id)
->allRevisions()
->count()
->execute();
$this
->assertEquals($expected, $revision_count);
}
protected function assignCompositeToNode($node_type = 'article') {
$composite = EntityTestCompositeRelationship::create([
'uuid' => $this
->randomMachineName(),
'name' => $this
->randomMachineName(),
]);
$composite
->save();
$node = Node::create([
'title' => $this
->randomMachineName(),
'type' => $node_type,
'composite_reference' => $composite,
]);
$node
->save();
return [
$composite,
$node,
];
}
}