3 namespace Drupal\KernelTests\Core\Entity;
5 use Drupal\Core\Entity\EntityInterface;
6 use Drupal\Core\Entity\EntityTypeInterface;
7 use Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog;
8 use Drupal\user\Entity\User;
9 use Drupal\user\UserInterface;
12 * @coversDefaultClass \Drupal\Core\Entity\RevisionableContentEntityBase
15 class RevisionableContentEntityBaseTest extends EntityKernelTestBase {
20 public static $modules = ['entity_test_revlog', 'system', 'user'];
25 protected function setUp() {
27 $this->installEntitySchema('entity_test_mul_revlog');
31 * Tests the correct functionality CRUD operations of entity revisions.
33 public function testRevisionableContentEntity() {
34 $entity_type = 'entity_test_mul_revlog';
35 $definition = \Drupal::entityManager()->getDefinition($entity_type);
36 $user = User::create(['name' => 'test name']);
38 /** @var \Drupal\entity_test_mul_revlog\Entity\EntityTestMulWithRevisionLog $entity */
39 $entity = EntityTestMulWithRevisionLog::create([
40 'type' => $entity_type,
43 // Save the entity, this creates the first revision.
45 $revision_ids[] = $entity->getRevisionId();
46 $this->assertItemsTableCount(1, $definition);
48 // Create the second revision.
49 $entity->setNewRevision(TRUE);
50 $random_timestamp = rand(1e8, 2e8);
51 $this->createRevision($entity, $user, $random_timestamp, 'This is my log message');
53 $revision_id = $entity->getRevisionId();
54 $revision_ids[] = $revision_id;
56 $storage = \Drupal::entityTypeManager()->getStorage('entity_test_mul_revlog');
57 $entity = $storage->loadRevision($revision_id);
58 $this->assertEquals($random_timestamp, $entity->getRevisionCreationTime());
59 $this->assertEquals($user->id(), $entity->getRevisionUserId());
60 $this->assertEquals($user->id(), $entity->getRevisionUser()->id());
61 $this->assertEquals('This is my log message', $entity->getRevisionLogMessage());
63 // Create the third revision.
64 $random_timestamp = rand(1e8, 2e8);
65 $this->createRevision($entity, $user, $random_timestamp, 'This is my log message');
66 $this->assertItemsTableCount(3, $definition);
67 $revision_ids[] = $entity->getRevisionId();
69 // Create another 3 revisions.
70 foreach (range(1, 3) as $count) {
71 $timestamp = rand(1e8, 2e8);
72 $this->createRevision($entity, $user, $timestamp, 'This is my log message number: ' . $count);
73 $revision_ids[] = $entity->getRevisionId();
75 $this->assertItemsTableCount(6, $definition);
77 $this->assertEqual(6, count($revision_ids));
79 // Delete the first 3 revisions.
80 foreach (range(0, 2) as $key) {
81 $storage->deleteRevision($revision_ids[$key]);
84 // We should have only data for three revisions.
85 $this->assertItemsTableCount(3, $definition);
89 * Tests the behavior of the "revision_default" flag.
91 * @covers \Drupal\Core\Entity\ContentEntityBase::wasDefaultRevision
93 public function testWasDefaultRevision() {
94 $entity_type_id = 'entity_test_mul_revlog';
95 $entity = EntityTestMulWithRevisionLog::create([
96 'type' => $entity_type_id,
99 // Checks that in a new entity ::wasDefaultRevision() always matches
100 // ::isDefaultRevision().
101 $this->assertEquals($entity->isDefaultRevision(), $entity->wasDefaultRevision());
102 $entity->isDefaultRevision(FALSE);
103 $this->assertEquals($entity->isDefaultRevision(), $entity->wasDefaultRevision());
105 // Check that a new entity is always flagged as a default revision on save,
106 // regardless of its default revision status.
108 $this->assertTrue($entity->wasDefaultRevision());
110 // Check that a pending revision is not flagged as default.
111 $entity->setNewRevision();
112 $entity->isDefaultRevision(FALSE);
114 $this->assertFalse($entity->wasDefaultRevision());
116 // Check that a default revision is flagged as such.
117 $entity->setNewRevision();
118 $entity->isDefaultRevision(TRUE);
120 $this->assertTrue($entity->wasDefaultRevision());
122 // Check that a manually set value for the "revision_default" flag is
124 $entity->setNewRevision();
125 $entity->isDefaultRevision(FALSE);
126 $entity->set('revision_default', TRUE);
127 $this->assertTrue($entity->wasDefaultRevision());
129 $this->assertFalse($entity->wasDefaultRevision());
131 // Check that the default revision status was stored correctly.
132 $storage = $this->entityManager->getStorage($entity_type_id);
133 foreach ([TRUE, FALSE, TRUE, FALSE] as $index => $expected) {
134 /** @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog $revision */
135 $revision = $storage->loadRevision($index + 1);
136 $this->assertEquals($expected, $revision->wasDefaultRevision());
139 // Check that the default revision is flagged correctly.
140 /** @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog $entity */
141 $entity = $storage->loadUnchanged($entity->id());
142 $this->assertTrue($entity->wasDefaultRevision());
144 // Check that the "revision_default" flag cannot be changed once set.
145 /** @var \Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog $entity2 */
146 $entity2 = EntityTestMulWithRevisionLog::create([
147 'type' => $entity_type_id,
150 $this->assertTrue($entity2->wasDefaultRevision());
151 $entity2->isDefaultRevision(FALSE);
153 $this->assertTrue($entity2->wasDefaultRevision());
157 * Asserts the amount of items on entity related tables.
160 * The number of items expected to be in revisions related tables.
161 * @param \Drupal\Core\Entity\EntityTypeInterface $definition
162 * The definition and metadata of the entity being tested.
164 protected function assertItemsTableCount($count, EntityTypeInterface $definition) {
165 $this->assertEqual(1, db_query('SELECT COUNT(*) FROM {' . $definition->getBaseTable() . '}')->fetchField());
166 $this->assertEqual(1, db_query('SELECT COUNT(*) FROM {' . $definition->getDataTable() . '}')->fetchField());
167 $this->assertEqual($count, db_query('SELECT COUNT(*) FROM {' . $definition->getRevisionTable() . '}')->fetchField());
168 $this->assertEqual($count, db_query('SELECT COUNT(*) FROM {' . $definition->getRevisionDataTable() . '}')->fetchField());
172 * Creates a new revision in the entity of this test class.
174 * @param \Drupal\Core\Entity\EntityInterface $entity
175 * The entity where revision will be created.
176 * @param \Drupal\user\UserInterface $user
177 * The author of the new revision.
178 * @param int $timestamp
179 * The timestamp of the new revision.
180 * @param string $log_message
181 * The log message of the new revision.
183 protected function createRevision(EntityInterface $entity, UserInterface $user, $timestamp, $log_message) {
184 $entity->setNewRevision(TRUE);
185 $entity->setRevisionCreationTime($timestamp);
186 $entity->setRevisionUserId($user->id());
187 $entity->setRevisionLogMessage($log_message);