X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Ftests%2FDrupal%2FKernelTests%2FCore%2FEntity%2FEntityRevisionsTest.php;fp=web%2Fcore%2Ftests%2FDrupal%2FKernelTests%2FCore%2FEntity%2FEntityRevisionsTest.php;h=e5407fcc968e0bcf4d09ba5e3d666e971121a243;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/tests/Drupal/KernelTests/Core/Entity/EntityRevisionsTest.php b/web/core/tests/Drupal/KernelTests/Core/Entity/EntityRevisionsTest.php new file mode 100644 index 000000000..e5407fcc9 --- /dev/null +++ b/web/core/tests/Drupal/KernelTests/Core/Entity/EntityRevisionsTest.php @@ -0,0 +1,264 @@ +installEntitySchema('entity_test_mulrev'); + } + + /** + * Test getLoadedRevisionId() returns the correct ID throughout the process. + */ + public function testLoadedRevisionId() { + // Create a basic EntityTestMulRev entity and save it. + $entity = EntityTestMulRev::create(); + $entity->save(); + + // Load the created entity and create a new revision. + $loaded = EntityTestMulRev::load($entity->id()); + $loaded->setNewRevision(TRUE); + + // Before saving, the loaded Revision ID should be the same as the created + // entity, not the same as the loaded entity (which does not have a revision + // ID yet). + $this->assertEquals($entity->getRevisionId(), $loaded->getLoadedRevisionId()); + $this->assertNotEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + $this->assertSame(NULL, $loaded->getRevisionId()); + + // After updating the loaded Revision ID the result should be the same. + $loaded->updateLoadedRevisionId(); + $this->assertEquals($entity->getRevisionId(), $loaded->getLoadedRevisionId()); + $this->assertNotEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + $this->assertSame(NULL, $loaded->getRevisionId()); + + $loaded->save(); + + // In entity_test_entity_update() the loaded Revision ID was stored in + // state. This should be the same as we had before calling $loaded->save(). + /** @var \Drupal\Core\Entity\ContentEntityInterface $loaded_original */ + $loadedRevisionId = \Drupal::state()->get('entity_test.loadedRevisionId'); + $this->assertEquals($entity->getRevisionId(), $loadedRevisionId); + $this->assertNotEquals($loaded->getRevisionId(), $loadedRevisionId); + + // The revision ID and loaded Revision ID should be different for the two + // versions of the entity, but the same for a saved entity. + $this->assertNotEquals($loaded->getRevisionId(), $entity->getRevisionId()); + $this->assertNotEquals($loaded->getLoadedRevisionId(), $entity->getLoadedRevisionId()); + $this->assertEquals($entity->getRevisionId(), $entity->getLoadedRevisionId()); + $this->assertEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + } + + /** + * Tests the loaded revision ID after an entity re-save, clone and duplicate. + */ + public function testLoadedRevisionIdWithNoNewRevision() { + // Create a basic EntityTestMulRev entity and save it. + $entity = EntityTestMulRev::create(); + $entity->save(); + + // Load the created entity and create a new revision. + $loaded = EntityTestMulRev::load($entity->id()); + $loaded->setNewRevision(TRUE); + $loaded->save(); + + // Make a change to the loaded entity. + $loaded->set('name', 'dublin'); + + // The revision id and loaded Revision id should still be the same. + $this->assertEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + + $loaded->save(); + + // After saving, the loaded Revision id set in entity_test_entity_update() + // and returned from the entity should be the same as the entity's revision + // id because a new revision wasn't created, the existing revision was + // updated. + $loadedRevisionId = \Drupal::state()->get('entity_test.loadedRevisionId'); + $this->assertEquals($loaded->getRevisionId(), $loadedRevisionId); + $this->assertEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + + // Creating a clone should keep the loaded Revision ID. + $clone = clone $loaded; + $this->assertSame($loaded->getLoadedRevisionId(), $clone->getLoadedRevisionId()); + + // Creating a duplicate should set a NULL loaded Revision ID. + $duplicate = $loaded->createDuplicate(); + $this->assertSame(NULL, $duplicate->getLoadedRevisionId()); + } + + /** + * Tests the loaded revision ID for translatable entities. + */ + public function testTranslatedLoadedRevisionId() { + ConfigurableLanguage::createFromLangcode('fr')->save(); + + // Create a basic EntityTestMulRev entity and save it. + $entity = EntityTestMulRev::create(); + $entity->save(); + + // Load the created entity and create a new revision. + $loaded = EntityTestMulRev::load($entity->id()); + $loaded->setNewRevision(TRUE); + $loaded->save(); + + // Check it all works with translations. + $french = $loaded->addTranslation('fr'); + // Adding a revision should return the same for each language. + $this->assertEquals($french->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertEquals($loaded->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertEquals($loaded->getLoadedRevisionId(), $french->getLoadedRevisionId()); + $french->save(); + // After saving nothing should change. + $this->assertEquals($french->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertEquals($loaded->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertEquals($loaded->getLoadedRevisionId(), $french->getLoadedRevisionId()); + $first_revision_id = $french->getRevisionId(); + $french->setNewRevision(); + // Setting a new revision will reset the loaded Revision ID. + $this->assertEquals($first_revision_id, $french->getLoadedRevisionId()); + $this->assertEquals($first_revision_id, $loaded->getLoadedRevisionId()); + $this->assertNotEquals($french->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertGreaterThan($french->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertNotEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + $this->assertGreaterThan($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + $french->save(); + // Saving the new revision will reset the origin revision ID again. + $this->assertEquals($french->getRevisionId(), $french->getLoadedRevisionId()); + $this->assertEquals($loaded->getRevisionId(), $loaded->getLoadedRevisionId()); + } + + /** + * Tests re-saving the entity in entity_test_entity_insert(). + */ + public function testSaveInHookEntityInsert() { + // Create an entity which will be saved again in entity_test_entity_insert(). + $entity = EntityTestMulRev::create(['name' => 'EntityLoadedRevisionTest']); + $entity->save(); + $loadedRevisionId = \Drupal::state()->get('entity_test.loadedRevisionId'); + $this->assertEquals($entity->getLoadedRevisionId(), $loadedRevisionId); + $this->assertEquals($entity->getRevisionId(), $entity->getLoadedRevisionId()); + } + + /** + * Tests that latest revisions are working as expected. + * + * @covers ::isLatestRevision + */ + public function testIsLatestRevision() { + // Create a basic EntityTestMulRev entity and save it. + $entity = EntityTestMulRev::create(); + $entity->save(); + $this->assertTrue($entity->isLatestRevision()); + + // Load the created entity and create a new pending revision. + $pending_revision = EntityTestMulRev::load($entity->id()); + $pending_revision->setNewRevision(TRUE); + $pending_revision->isDefaultRevision(FALSE); + + // The pending revision should still be marked as the latest one before it + // is saved. + $this->assertTrue($pending_revision->isLatestRevision()); + $pending_revision->save(); + $this->assertTrue($pending_revision->isLatestRevision()); + + // Load the default revision and check that it is not marked as the latest + // revision. + $default_revision = EntityTestMulRev::load($entity->id()); + $this->assertFalse($default_revision->isLatestRevision()); + } + + /** + * Tests that latest affected revisions are working as expected. + * + * The latest revision affecting a particular translation behaves as the + * latest revision for monolingual entities. + * + * @covers ::isLatestTranslationAffectedRevision + * @covers \Drupal\Core\Entity\ContentEntityStorageBase::getLatestRevisionId + * @covers \Drupal\Core\Entity\ContentEntityStorageBase::getLatestTranslationAffectedRevisionId + */ + public function testIsLatestAffectedRevisionTranslation() { + ConfigurableLanguage::createFromLangcode('it')->save(); + + // Create a basic EntityTestMulRev entity and save it. + $entity = EntityTestMulRev::create(); + $entity->setName($this->randomString()); + $entity->save(); + $this->assertTrue($entity->isLatestTranslationAffectedRevision()); + + // Load the created entity and create a new pending revision. + $pending_revision = EntityTestMulRev::load($entity->id()); + $pending_revision->setName($this->randomString()); + $pending_revision->setNewRevision(TRUE); + $pending_revision->isDefaultRevision(FALSE); + + // Check that no revision affecting Italian is available, given that no + // Italian translation has been created yet. + /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */ + $storage = $this->entityManager->getStorage($entity->getEntityTypeId()); + $this->assertNull($storage->getLatestTranslationAffectedRevisionId($entity->id(), 'it')); + $this->assertEquals($pending_revision->getLoadedRevisionId(), $storage->getLatestRevisionId($entity->id())); + + // The pending revision should still be marked as the latest affected one + // before it is saved. + $this->assertTrue($pending_revision->isLatestTranslationAffectedRevision()); + $pending_revision->save(); + $this->assertTrue($pending_revision->isLatestTranslationAffectedRevision()); + + // Load the default revision and check that it is not marked as the latest + // (translation-affected) revision. + $default_revision = EntityTestMulRev::load($entity->id()); + $this->assertFalse($default_revision->isLatestRevision()); + $this->assertFalse($default_revision->isLatestTranslationAffectedRevision()); + + // Add a translation in a new pending revision and verify that both the + // English and Italian revision translations are the latest affected + // revisions for their respective languages, while the English revision is + // not the latest revision. + /** @var \Drupal\entity_test\Entity\EntityTestMulRev $en_revision */ + $en_revision = clone $pending_revision; + /** @var \Drupal\entity_test\Entity\EntityTestMulRev $it_revision */ + $it_revision = $pending_revision->addTranslation('it'); + $it_revision->setName($this->randomString()); + $it_revision->setNewRevision(TRUE); + $it_revision->isDefaultRevision(FALSE); + // @todo Remove this once the "original" property works with revisions. See + // https://www.drupal.org/project/drupal/issues/2859042. + $it_revision->original = $storage->loadRevision($it_revision->getLoadedRevisionId()); + $it_revision->save(); + $this->assertTrue($it_revision->isLatestRevision()); + $this->assertTrue($it_revision->isLatestTranslationAffectedRevision()); + $this->assertFalse($en_revision->isLatestRevision()); + $this->assertTrue($en_revision->isLatestTranslationAffectedRevision()); + } + +}