3 namespace Drupal\KernelTests\Core\Entity;
5 use Drupal\entity_test\Entity\EntityTestMul;
6 use Drupal\entity_test\Entity\EntityTestMulRev;
7 use Drupal\language\Entity\ConfigurableLanguage;
10 * Tests proper revision propagation of entities.
14 class EntityRevisionTranslationTest extends EntityKernelTestBase {
19 public static $modules = ['language'];
24 protected function setUp() {
27 // Enable some additional languages.
28 ConfigurableLanguage::createFromLangcode('de')->save();
29 ConfigurableLanguage::createFromLangcode('it')->save();
31 $this->installEntitySchema('entity_test_mul');
32 $this->installEntitySchema('entity_test_mulrev');
36 * Tests if the translation object has the right revision id after new revision.
38 public function testNewRevisionAfterTranslation() {
39 $user = $this->createUser();
41 // Create a test entity.
42 $entity = EntityTestMulRev::create([
43 'name' => $this->randomString(),
44 'user_id' => $user->id(),
48 $old_rev_id = $entity->getRevisionId();
50 $translation = $entity->addTranslation('de');
51 $translation->setNewRevision();
54 $this->assertTrue($translation->getRevisionId() > $old_rev_id, 'The saved translation in new revision has a newer revision id.');
55 $this->assertTrue($this->reloadEntity($entity)->getRevisionId() > $old_rev_id, 'The entity from the storage has a newer revision id.');
59 * Tests if the translation object has the right revision id after new revision.
61 public function testRevertRevisionAfterTranslation() {
62 $user = $this->createUser();
63 $storage = $this->entityManager->getStorage('entity_test_mulrev');
65 // Create a test entity.
66 $entity = EntityTestMulRev::create([
67 'name' => $this->randomString(),
68 'user_id' => $user->id(),
72 $old_rev_id = $entity->getRevisionId();
74 $translation = $entity->addTranslation('de');
75 $translation->setNewRevision();
78 $entity = $this->reloadEntity($entity);
80 $this->assertTrue($entity->hasTranslation('de'));
82 $entity = $storage->loadRevision($old_rev_id);
84 $entity->setNewRevision();
85 $entity->isDefaultRevision(TRUE);
88 $entity = $this->reloadEntity($entity);
90 $this->assertFalse($entity->hasTranslation('de'));
94 * Tests the translation values when saving a pending revision.
96 public function testTranslationValuesWhenSavingPendingRevisions() {
97 $user = $this->createUser();
98 $storage = $this->entityManager->getStorage('entity_test_mulrev');
100 // Create a test entity and a translation for it.
101 $entity = EntityTestMulRev::create([
102 'name' => 'default revision - en',
103 'user_id' => $user->id(),
106 $entity->addTranslation('de', ['name' => 'default revision - de']);
109 // Create a pending revision for the entity and change a field value for
111 $pending_revision = $this->reloadEntity($entity);
113 $pending_revision->setNewRevision();
114 $pending_revision->isDefaultRevision(FALSE);
116 $pending_revision->name = 'pending revision - en';
117 $pending_revision->save();
119 $pending_revision_translation = $pending_revision->getTranslation('de');
120 $pending_revision_translation->name = 'pending revision - de';
121 $pending_revision_translation->save();
123 $pending_revision_id = $pending_revision->getRevisionId();
124 $pending_revision = $storage->loadRevision($pending_revision_id);
126 // Change the value of the field in the default language, save the pending
127 // revision and check that the value of the field in the second language is
128 // also taken from the pending revision, *not* from the default revision.
129 $pending_revision->name = 'updated pending revision - en';
130 $pending_revision->save();
132 $pending_revision = $storage->loadRevision($pending_revision_id);
134 $this->assertEquals($pending_revision->name->value, 'updated pending revision - en');
135 $this->assertEquals($pending_revision->getTranslation('de')->name->value, 'pending revision - de');
139 * Tests changing the default revision flag is propagated to all translations.
141 public function testDefaultRevision() {
142 // Create a test entity with a translation, which will internally trigger
143 // entity cloning for the new translation and create references for some of
144 // the entity properties.
145 $entity = EntityTestMulRev::create([
146 'name' => 'original',
149 $translation = $entity->addTranslation('de');
152 // Assert that the entity is in the default revision.
153 $this->assertTrue($entity->isDefaultRevision());
154 $this->assertTrue($translation->isDefaultRevision());
156 // Change the default revision flag on one of the entity translations and
157 // assert that the change is propagated to all entity translation objects.
158 $translation->isDefaultRevision(FALSE);
159 $this->assertFalse($entity->isDefaultRevision());
160 $this->assertFalse($translation->isDefaultRevision());
164 * @covers \Drupal\Core\Entity\RevisionableInterface::setNewRevision
166 public function testSetNewRevision() {
167 $user = $this->createUser();
169 // All revisionable entity variations have to have the same results.
170 foreach (entity_test_entity_types(ENTITY_TEST_TYPES_REVISABLE) as $entity_type) {
171 $this->installEntitySchema($entity_type);
173 $entity = entity_create($entity_type, [
175 'user_id' => $user->id(),
179 $entity_id = $entity->id();
180 $entity_rev_id = $entity->getRevisionId();
181 $entity = entity_load($entity_type, $entity_id, TRUE);
183 $entity->setNewRevision(TRUE);
184 $entity->setNewRevision(FALSE);
186 $entity = entity_load($entity_type, $entity_id, TRUE);
188 $this->assertEquals($entity_rev_id, $entity->getRevisionId(), 'A new entity revision was not created.');
193 * Tests that revision translations are correctly detected.
195 * @covers \Drupal\Core\Entity\ContentEntityStorageBase::isAnyStoredRevisionTranslated
197 public function testIsAnyStoredRevisionTranslated() {
198 /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
199 $storage = $this->entityManager->getStorage('entity_test_mul');
200 $method = new \ReflectionMethod(get_class($storage), 'isAnyStoredRevisionTranslated');
201 $method->setAccessible(TRUE);
203 // Check that a non-revisionable new entity is handled correctly.
204 $entity = EntityTestMul::create();
205 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
206 $this->assertFalse($method->invoke($storage, $entity));
207 $entity->addTranslation('it');
208 $this->assertNotEmpty($entity->getTranslationLanguages(FALSE));
209 $this->assertFalse($method->invoke($storage, $entity));
211 // Check that not yet stored translations are handled correctly.
212 $entity = EntityTestMul::create();
214 $entity->addTranslation('it');
215 $this->assertNotEmpty($entity->getTranslationLanguages(FALSE));
216 $this->assertFalse($method->invoke($storage, $entity));
218 // Check that removed translations are handled correctly.
220 $entity->removeTranslation('it');
221 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
222 $this->assertTrue($method->invoke($storage, $entity));
224 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
225 $this->assertFalse($method->invoke($storage, $entity));
226 $entity->addTranslation('de');
227 $entity->removeTranslation('de');
228 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
229 $this->assertFalse($method->invoke($storage, $entity));
231 // Check that a non-revisionable not translated entity is handled correctly.
232 $entity = EntityTestMul::create();
234 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
235 $this->assertFalse($method->invoke($storage, $entity));
237 // Check that a non-revisionable translated entity is handled correctly.
238 $entity->addTranslation('it');
240 $this->assertNotEmpty($entity->getTranslationLanguages(FALSE));
241 $this->assertTrue($method->invoke($storage, $entity));
243 /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
244 $storage = $this->entityManager->getStorage('entity_test_mulrev');
246 // Check that a revisionable new entity is handled correctly.
247 $entity = EntityTestMulRev::create();
248 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
249 $this->assertFalse($method->invoke($storage, $entity));
250 $entity->addTranslation('it');
251 $this->assertNotEmpty($entity->getTranslationLanguages(FALSE));
252 $this->assertFalse($method->invoke($storage, $entity));
254 // Check that a revisionable not translated entity is handled correctly.
255 $entity = EntityTestMulRev::create();
257 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
258 $this->assertFalse($method->invoke($storage, $entity));
260 // Check that a revisionable translated pending revision is handled
262 /** @var \Drupal\Core\Entity\ContentEntityInterface $new_revision */
263 $new_revision = $storage->createRevision($entity, FALSE);
264 $new_revision->addTranslation('it');
265 $new_revision->save();
266 /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
267 $entity = $storage->loadUnchanged($entity->id());
268 $this->assertEmpty($entity->getTranslationLanguages(FALSE));
269 $this->assertNotEmpty($new_revision->getTranslationLanguages(FALSE));
270 $this->assertTrue($method->invoke($storage, $entity));
272 // Check that a revisionable translated default revision is handled
274 $new_revision->isDefaultRevision(TRUE);
275 $new_revision->save();
276 /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
277 $entity = $storage->loadUnchanged($entity->id());
278 $this->assertNotEmpty($entity->getTranslationLanguages(FALSE));
279 $this->assertNotEmpty($new_revision->getTranslationLanguages(FALSE));
280 $this->assertTrue($method->invoke($storage, $entity));