diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php index d696a94..3d01fb7 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php @@ -598,6 +598,12 @@ protected function doDeleteRevisionFieldItems(ContentEntityInterface $revision) ->condition($this->revisionKey, $revision->getRevisionId()) ->execute(); $this->deleteRevisionFromDedicatedTables($revision); + + if ($this->revisionDataTable) { + $this->database->delete($this->revisionDataTable) + ->condition($this->revisionKey, $revision->getRevisionId()) + ->execute(); + } } /** diff --git a/core/modules/node/src/Tests/NodeRevisionsTest.php b/core/modules/node/src/Tests/NodeRevisionsTest.php index c50110d..1982266 100644 --- a/core/modules/node/src/Tests/NodeRevisionsTest.php +++ b/core/modules/node/src/Tests/NodeRevisionsTest.php @@ -195,6 +195,7 @@ public function testRevisions() { ['%revision-date' => format_date($nodes[1]->getRevisionCreationTime()), '@type' => 'Basic page', '%title' => $nodes[1]->label()]), 'Revision deleted.'); $this->assertTrue(db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid and vid = :vid', [':nid' => $node->id(), ':vid' => $nodes[1]->getRevisionId()])->fetchField() == 0, 'Revision not found.'); + $this->assertTrue(db_query('SELECT COUNT(vid) FROM {node_field_revision} WHERE nid = :nid and vid = :vid', [':nid' => $node->id(), ':vid' => $nodes[1]->getRevisionId()])->fetchField() == 0, 'Field revision not found.'); // Set the revision timestamp to an older date to make sure that the // confirmation message correctly displays the stored revision date. diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityApiTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityApiTest.php index 744121e..b32e78d 100644 --- a/core/tests/Drupal/KernelTests/Core/Entity/EntityApiTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityApiTest.php @@ -101,6 +101,9 @@ protected function assertCRUD($entity_type, UserInterface $user1) { if ($revision_table = $definition->getRevisionTable()) { $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_table . '}')->fetchField(), 'Data table was emptied'); } + if ($revision_data_table = $definition->getRevisionDataTable()) { + $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_data_table . '}')->fetchField(), 'Data table was emptied'); + } // Test deleting a list of entities not indexed by entity id. $entities = []; @@ -126,6 +129,9 @@ protected function assertCRUD($entity_type, UserInterface $user1) { if ($revision_table = $definition->getRevisionTable()) { $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_table . '}')->fetchField(), 'Data table was emptied'); } + if ($revision_data_table = $definition->getRevisionDataTable()) { + $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_data_table . '}')->fetchField(), 'Data table was emptied'); + } } /** diff --git a/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php b/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php index b78a588..38257ee 100644 --- a/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/RevisionableContentEntityBaseTest.php @@ -2,7 +2,7 @@ namespace Drupal\KernelTests\Core\Entity; -use Drupal\entity_test_revlog\Entity\EntityTestWithRevisionLog; +use Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog; use Drupal\KernelTests\KernelTestBase; use Drupal\user\Entity\User; @@ -18,39 +18,109 @@ class RevisionableContentEntityBaseTest extends KernelTestBase { public static $modules = ['entity_test_revlog', 'system', 'user']; /** + * The entity where revisions will be created. + * + * @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog + */ + protected $entity; + + /** + * The user author of the revisions. + * + * @var \Drupal\user\UserInterface + */ + protected $user; + + /** + * The definition and metada of the entity being tested. + * + * @var Drupal\Core\Entity\EntityTypeInterface + */ + protected $definition; + + + /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); - $this->installEntitySchema('entity_test_revlog'); + $this->installEntitySchema('entity_test_mul_revlog'); $this->installEntitySchema('user'); $this->installSchema('system', 'sequences'); } public function testRevisionableContentEntity() { - $user = User::create(['name' => 'test name']); - $user->save(); - /** @var \Drupal\entity_test_revlog\Entity\EntityTestWithRevisionLog $entity */ - $entity = EntityTestWithRevisionLog::create([ - 'type' => 'entity_test_revlog', - ]); - $entity->save(); - - $entity->setNewRevision(TRUE); - $random_timestamp = rand(1e8, 2e8); - $entity->setRevisionCreationTime($random_timestamp); - $entity->setRevisionUserId($user->id()); - $entity->setRevisionLogMessage('This is my log message'); - $entity->save(); + $this->user = User::create(['name' => 'test name']); + $this->user->save(); + $entity_type = 'entity_test_mul_revlog'; + $this->definition = \Drupal::entityManager()->getDefinition($entity_type); + /** @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog $entity */ + $this->entity = EntityTestMulWithRevisionLog::create(['type' => $entity_type]); + + // Save the entity, this creates the first revision. + $this->entity->save(); + $revision_ids[] = $this->entity->getRevisionId(); + $this->assertItemsTableCount(1); - $revision_id = $entity->getRevisionId(); + // Create the second revision. + $random_timestamp = rand(1e8, 2e8); + $this->createRevision($random_timestamp, 'This is my log message'); + $this->assertItemsTableCount(2); + $revision_ids[] = $this->entity->getRevisionId(); - $entity = \Drupal::entityTypeManager()->getStorage('entity_test_revlog')->loadRevision($revision_id); + $storage = \Drupal::entityTypeManager()->getStorage('entity_test_mul_revlog'); + $entity = $storage->loadRevision($this->entity->getRevisionId()); $this->assertEquals($random_timestamp, $entity->getRevisionCreationTime()); - $this->assertEquals($user->id(), $entity->getRevisionUserId()); - $this->assertEquals($user->id(), $entity->getRevisionUser()->id()); + $this->assertEquals($this->user->id(), $entity->getRevisionUserId()); + $this->assertEquals($this->user->id(), $entity->getRevisionUser()->id()); $this->assertEquals('This is my log message', $entity->getRevisionLogMessage()); + + // Create another 3 revisions. + foreach (range(1, 3) as $count) { + $timestamp = rand(1e8, 2e8); + $this->createRevision($timestamp, 'This is my log message number: ' . $count); + $revision_ids[] = $this->entity->getRevisionId(); + } + $this->assertItemsTableCount(5); + + $this->assertEqual(5, count($revision_ids)); + + // Delete the first 3 revisions. + foreach (range(0, 2) as $key) { + $storage->deleteRevision($revision_ids[$key]); + } + + // We should have only data for two revisions. + $this->assertItemsTableCount(2); + } + + /** + * Asserts the ammount of items on entity related tables. + * + * @param int $count + */ + protected function assertItemsTableCount($count) { + $this->assertEqual(1, db_query('SELECT COUNT(*) FROM {' . $this->definition->getBaseTable() . '}')->fetchField()); + $this->assertEqual(1, db_query('SELECT COUNT(*) FROM {' . $this->definition->getDataTable() . '}')->fetchField()); + $this->assertEqual($count, db_query('SELECT COUNT(*) FROM {' . $this->definition->getRevisionTable() . '}')->fetchField()); + $this->assertEqual($count, db_query('SELECT COUNT(*) FROM {' . $this->definition->getRevisionDataTable() . '}')->fetchField()); + } + + /** + * Creates a new revision in the entity of this test class. + * + * @param int $timestamp + * The timestamp of the new revision. + * @param string $log_message + * The log message of the new revision. + */ + protected function createRevision($timestamp, $log_message) { + $this->entity->setNewRevision(TRUE); + $this->entity->setRevisionCreationTime($timestamp); + $this->entity->setRevisionUserId($this->user->id()); + $this->entity->setRevisionLogMessage($log_message); + $this->entity->save(); } }