--- /dev/null
+<?php
+
+namespace Drupal\entity_reference_revisions\Tests;
+
+use Drupal\field_ui\Tests\FieldUiTestTrait;
+use Drupal\node\Entity\Node;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the entity_reference_revisions configuration.
+ *
+ * @group entity_reference_revisions
+ */
+class EntityReferenceRevisionsAdminTest extends WebTestBase {
+
+ use FieldUiTestTrait;
+ use EntityReferenceRevisionsCoreVersionUiTestTrait;
+
+ /**
+ * Modules to enable.
+ *
+ * @var array
+ */
+ public static $modules = array(
+ 'node',
+ 'field',
+ 'entity_reference_revisions',
+ 'field_ui',
+ 'block',
+ );
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp() {
+ parent::setUp();
+ // Create paragraphs and article content types.
+ $this->drupalCreateContentType(array('type' => 'entity_revisions', 'name' => 'Entity revisions'));
+ $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+ // Place the breadcrumb, tested in fieldUIAddNewField().
+ $this->drupalPlaceBlock('system_breadcrumb_block');
+ $admin_user = $this->drupalCreateUser(array(
+ 'administer site configuration',
+ 'administer nodes',
+ 'create article content',
+ 'administer content types',
+ 'administer node fields',
+ 'administer node display',
+ 'administer node form display',
+ 'edit any article content',
+ ));
+ $this->drupalLogin($admin_user);
+ }
+
+ /**
+ * Tests the entity reference revisions configuration.
+ */
+ public function testEntityReferenceRevisions() {
+ // Create a test target node used as entity reference by another test node.
+ $node_target = Node::create([
+ 'title' => 'Target node',
+ 'type' => 'article',
+ 'body' => 'Target body text',
+ 'uuid' => '2d04c2b4-9c3d-4fa6-869e-ecb6fa5c9410',
+ ]);
+ $node_target->save();
+
+ // Add an entity reference revisions field to entity_revisions content type
+ // with $node_target as default value.
+ $storage_edit = ['settings[target_type]' => 'node', 'cardinality' => '-1'];
+ $field_edit = [
+ 'settings[handler_settings][target_bundles][article]' => TRUE,
+ 'default_value_input[field_entity_reference_revisions][0][target_id]' => $node_target->label() . ' (' . $node_target->id() . ')',
+ ];
+ static::fieldUIAddNewField('admin/structure/types/manage/entity_revisions', 'entity_reference_revisions', 'Entity reference revisions', 'entity_reference_revisions', $storage_edit, $field_edit);
+ \Drupal::service('entity_field.manager')->clearCachedFieldDefinitions();
+ $this->assertText('Saved Entity reference revisions configuration.');
+
+ // Resave the target node, so that the default revision is not the one we
+ // want to use.
+ $revision_id = $node_target->getRevisionId();
+ $node_target_after = Node::load($node_target->id());
+ $node_target_after->setNewRevision();
+ $node_target_after->save();
+ $this->assertTrue($node_target_after->getRevisionId() != $revision_id);
+
+ // Create an article.
+ $title = $this->randomMachineName();
+ $edit = array(
+ 'title[0][value]' => $title,
+ 'body[0][value]' => 'Revision 1',
+ );
+ $this->drupalPostNodeForm('node/add/article', $edit, t('Save and publish'));
+ $this->assertText($title);
+ $this->assertText('Revision 1');
+ $node = $this->drupalGetNodeByTitle($title);
+
+ // Check if when creating an entity revisions content the default entity
+ // reference is set, add also the above article as a new reference.
+ $this->drupalGet('node/add/entity_revisions');
+ $this->assertFieldByName('field_entity_reference_revisions[0][target_id]', $node_target->label() . ' (' . $node_target->id() . ')');
+ $edit = [
+ 'title[0][value]' => 'Entity reference revision content',
+ 'field_entity_reference_revisions[1][target_id]' => $node->label() . ' (' . $node->id() . ')',
+ ];
+ $this->drupalPostNodeForm(NULL, $edit, t('Save and publish'));
+ $this->assertLinkByHref('node/' . $node_target->id());
+ $this->assertText('Entity revisions Entity reference revision content has been created.');
+ $this->assertText('Entity reference revision content');
+ $this->assertText($title);
+ $this->assertText('Revision 1');
+
+ // Create 2nd revision of the article.
+ $edit = array(
+ 'body[0][value]' => 'Revision 2',
+ 'revision' => TRUE,
+ );
+ $this->drupalPostNodeForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published'));
+ $this->assertText($title);
+ $this->assertText('Revision 2');
+
+ // View the Entity reference content and make sure it still has revision 1.
+ $node = $this->drupalGetNodeByTitle('Entity reference revision content');
+ $this->drupalGet('node/' . $node->id());
+ $this->assertText($title);
+ $this->assertText('Revision 1');
+ $this->assertNoText('Revision 2');
+
+ // Make sure the non-revisionable entities are not selectable as referenced
+ // entities.
+ $edit = array(
+ 'new_storage_type' => 'entity_reference_revisions',
+ 'label' => 'Entity reference revisions field',
+ 'field_name' => 'entity_ref_revisions_field',
+ );
+ $this->drupalPostForm('admin/structure/types/manage/entity_revisions/fields/add-field', $edit, t('Save and continue'));
+ $this->assertNoOption('edit-settings-target-type', 'user');
+ $this->assertOption('edit-settings-target-type', 'node');
+
+ // Check ERR default value and property definitions label are set properly.
+ $field_definition = $node->getFieldDefinition('field_entity_reference_revisions');
+ $default_value = $field_definition->toArray()['default_value'];
+ $this->assertEqual($default_value[0]['target_uuid'], $node_target->uuid());
+ $this->assertEqual($default_value[0]['target_revision_id'], $revision_id);
+ $properties = $field_definition->getFieldStorageDefinition()->getPropertyDefinitions();
+ $this->assertEqual((string) $properties['target_revision_id']->getLabel(), 'Content revision ID');
+ $this->assertEqual((string) $properties['target_id']->getLabel(), 'Content ID');
+ $this->assertEqual((string) $properties['entity']->getLabel(), 'Content');
+ }
+
+ /**
+ * Tests target bundle settings for an entity reference revisions field.
+ */
+ public function testMultipleTargetBundles() {
+ // Create a couple of content types for the ERR field to point to.
+ $target_types = [];
+ for ($i = 0; $i < 2; $i++) {
+ $target_types[$i] = $this->drupalCreateContentType([
+ 'type' => strtolower($this->randomMachineName()),
+ 'name' => 'Test type ' . $i
+ ]);
+ }
+
+ // Create a new field that can point to either target content type.
+ $node_type_path = 'admin/structure/types/manage/entity_revisions';
+
+ // Generate a random field name, must be only lowercase characters.
+ $field_name = strtolower($this->randomMachineName());
+
+ $field_edit = [];
+ $storage_edit = ['settings[target_type]' => 'node', 'cardinality' => '-1'];
+ $field_edit['settings[handler_settings][target_bundles][' . $target_types[0]->id() . ']'] = TRUE;
+ $field_edit['settings[handler_settings][target_bundles][' . $target_types[1]->id() . ']'] = TRUE;
+
+ $this->fieldUIAddNewField($node_type_path, $field_name, 'Entity reference revisions', 'entity_reference_revisions', $storage_edit, $field_edit);
+
+ // Deleting one of these content bundles at this point should only delete
+ // that bundle's body field. Test that there is no second field that will
+ // be deleted.
+ $this->drupalGet('/admin/structure/types/manage/' . $target_types[0]->id() . '/delete');
+ $this->assertNoFieldByXPath('(//details[@id="edit-entity-deletes"]//ul[@data-drupal-selector="edit-field-config"]/li)[2]');
+ }
+
+}