0b5d7b19f9878eb12ca4cd41a8256d433edfaa41
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Entity / RevisionableContentEntityBaseTest.php
1 <?php
2
3 namespace Drupal\KernelTests\Core\Entity;
4
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;
10
11 /**
12  * @coversDefaultClass \Drupal\Core\Entity\RevisionableContentEntityBase
13  * @group Entity
14  */
15 class RevisionableContentEntityBaseTest extends EntityKernelTestBase {
16
17   /**
18    * {@inheritdoc}
19    */
20   public static $modules = ['entity_test_revlog', 'system', 'user'];
21
22   /**
23    * {@inheritdoc}
24    */
25   protected function setUp() {
26     parent::setUp();
27     $this->installEntitySchema('entity_test_mul_revlog');
28   }
29
30   /**
31    * Tests the correct functionality CRUD operations of entity revisions.
32    */
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']);
37     $user->save();
38     /** @var \Drupal\entity_test_mul_revlog\Entity\EntityTestMulWithRevisionLog $entity */
39     $entity = EntityTestMulWithRevisionLog::create([
40       'type' => $entity_type,
41     ]);
42
43     // Save the entity, this creates the first revision.
44     $entity->save();
45     $revision_ids[] = $entity->getRevisionId();
46     $this->assertItemsTableCount(1, $definition);
47
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');
52
53     $revision_id = $entity->getRevisionId();
54     $revision_ids[] = $revision_id;
55
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());
62
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();
68
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();
74     }
75     $this->assertItemsTableCount(6, $definition);
76
77     $this->assertEqual(6, count($revision_ids));
78
79     // Delete the first 3 revisions.
80     foreach (range(0, 2) as $key) {
81       $storage->deleteRevision($revision_ids[$key]);
82     }
83
84     // We should have only data for three revisions.
85     $this->assertItemsTableCount(3, $definition);
86   }
87
88   /**
89    * Tests the behavior of the "revision_default" flag.
90    *
91    * @covers \Drupal\Core\Entity\ContentEntityBase::wasDefaultRevision
92    */
93   public function testWasDefaultRevision() {
94     $entity_type_id = 'entity_test_mul_revlog';
95     $entity = EntityTestMulWithRevisionLog::create([
96       'type' => $entity_type_id,
97     ]);
98
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());
104
105     // Check that a new entity is always flagged as a default revision on save,
106     // regardless of its default revision status.
107     $entity->save();
108     $this->assertTrue($entity->wasDefaultRevision());
109
110     // Check that a pending revision is not flagged as default.
111     $entity->setNewRevision();
112     $entity->isDefaultRevision(FALSE);
113     $entity->save();
114     $this->assertFalse($entity->wasDefaultRevision());
115
116     // Check that a default revision is flagged as such.
117     $entity->setNewRevision();
118     $entity->isDefaultRevision(TRUE);
119     $entity->save();
120     $this->assertTrue($entity->wasDefaultRevision());
121
122     // Check that a manually set value for the "revision_default" flag is
123     // ignored on save.
124     $entity->setNewRevision();
125     $entity->isDefaultRevision(FALSE);
126     $entity->set('revision_default', TRUE);
127     $this->assertTrue($entity->wasDefaultRevision());
128     $entity->save();
129     $this->assertFalse($entity->wasDefaultRevision());
130
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());
137     }
138
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());
143
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,
148     ]);
149     $entity2->save();
150     $this->assertTrue($entity2->wasDefaultRevision());
151     $entity2->isDefaultRevision(FALSE);
152     $entity2->save();
153     $this->assertTrue($entity2->wasDefaultRevision());
154   }
155
156   /**
157    * Asserts the amount of items on entity related tables.
158    *
159    * @param int $count
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.
163    */
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());
169   }
170
171   /**
172    * Creates a new revision in the entity of this test class.
173    *
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.
182    */
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);
188     $entity->save();
189   }
190
191 }