Commit 261fb648 authored by alexpott's avatar alexpott

Issue #1887654 by tim.plunkett, damiankloip, Berdir, marthinal, xjm: Creating...

Issue #1887654 by tim.plunkett, damiankloip, Berdir, marthinal, xjm: Creating a config entity with an existing machine name shouldn't work.
parent 36adc62b
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
namespace Drupal\Core\Config\Entity; namespace Drupal\Core\Config\Entity;
use Drupal\Component\Utility\String;
use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityMalformedException; use Drupal\Core\Entity\EntityMalformedException;
use Drupal\Core\Entity\EntityStorageControllerBase; use Drupal\Core\Entity\EntityStorageControllerBase;
...@@ -14,6 +15,7 @@ ...@@ -14,6 +15,7 @@
use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Config\StorageInterface; use Drupal\Core\Config\StorageInterface;
use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Entity\Query\QueryFactory; use Drupal\Core\Entity\Query\QueryFactory;
use Drupal\Component\Uuid\UuidInterface; use Drupal\Component\Uuid\UuidInterface;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
...@@ -344,9 +346,13 @@ public function save(EntityInterface $entity) { ...@@ -344,9 +346,13 @@ public function save(EntityInterface $entity) {
$id = $entity->getOriginalId(); $id = $entity->getOriginalId();
} }
$config = $this->configFactory->get($prefix . $id); $config = $this->configFactory->get($prefix . $id);
$is_new = $config->isNew();
if (!$is_new && !isset($entity->original)) { // Prevent overwriting an existing configuration file if the entity is new.
if ($entity->isNew() && !$config->isNew()) {
throw new EntityStorageException(String::format('@type entity with ID @id already exists.', array('@type' => $this->entityType, '@id' => $id)));
}
if (!$config->isNew() && !isset($entity->original)) {
$this->resetCache(array($id)); $this->resetCache(array($id));
$entity->original = $this->load($id); $entity->original = $this->load($id);
} }
...@@ -372,7 +378,7 @@ public function save(EntityInterface $entity) { ...@@ -372,7 +378,7 @@ public function save(EntityInterface $entity) {
$config->set($key, $value); $config->set($key, $value);
} }
if (!$is_new) { if (!$config->isNew()) {
$return = SAVED_UPDATED; $return = SAVED_UPDATED;
$config->save(); $config->save();
$entity->postSave($this, TRUE); $entity->postSave($this, TRUE);
......
...@@ -31,28 +31,6 @@ public static function getInfo() { ...@@ -31,28 +31,6 @@ public static function getInfo() {
); );
} }
function setUp() {
parent::setUp();
// Add the basic_html filter format from the standard install profile.
$filter_format_storage_controller = $this->container->get('entity.manager')->getStorageController('filter_format');
$filter_format = $filter_format_storage_controller->create(array(
'format' => 'basic_html',
'name' => 'Basic HTML',
'status' => TRUE,
'roles' => array('authenticated'),
), 'filter_format');
$filter_format->setFilterConfig('filter_html', array(
'module' => 'filter',
'status' => TRUE,
'settings' => array(
'allowed_html' => '<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <h4> <h5> <h6> <p> <span> <img>',
),
));
$filter_format->save();
}
/** /**
* Tests comment preview. * Tests comment preview.
*/ */
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
namespace Drupal\config\Tests; namespace Drupal\config\Tests;
use Drupal\Core\Entity\EntityMalformedException; use Drupal\Core\Entity\EntityMalformedException;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Language\Language; use Drupal\Core\Language\Language;
use Drupal\simpletest\WebTestBase; use Drupal\simpletest\WebTestBase;
...@@ -135,24 +136,18 @@ function testCRUD() { ...@@ -135,24 +136,18 @@ function testCRUD() {
$this->assertIdentical($config_test->isNew(), FALSE); $this->assertIdentical($config_test->isNew(), FALSE);
$this->assertIdentical($config_test->getOriginalId(), $expected['id']); $this->assertIdentical($config_test->getOriginalId(), $expected['id']);
// Re-create the entity with the same ID and verify updated status. // Ensure that creating an entity with the same id as an existing one is not
// possible.
$same_id = entity_create('config_test', array( $same_id = entity_create('config_test', array(
'id' => $config_test->id(), 'id' => $config_test->id(),
)); ));
$this->assertIdentical($same_id->isNew(), TRUE); $this->assertIdentical($same_id->isNew(), TRUE);
$status = $same_id->save(); try {
$this->assertIdentical($status, SAVED_UPDATED); $same_id->save();
$this->fail('Not possible to overwrite an entity entity.');
// Verify that the entity was overwritten. } catch (EntityStorageException $e) {
$same_id = entity_load('config_test', $config_test->id()); $this->pass('Not possible to overwrite an entity entity.');
$this->assertIdentical($same_id->id(), $config_test->id()); }
$this->assertIdentical($same_id->label(), NULL);
$this->assertNotEqual($same_id->uuid(), $config_test->uuid());
// Delete the overridden entity first.
$same_id->delete();
// Revert to previous state.
$config_test->save();
// Verify that renaming the ID returns correct status and properties. // Verify that renaming the ID returns correct status and properties.
$ids = array($expected['id'], 'second_' . $this->randomName(4), 'third_' . $this->randomName(4)); $ids = array($expected['id'], 'second_' . $this->randomName(4), 'third_' . $this->randomName(4));
......
...@@ -316,12 +316,6 @@ protected function preSaveNew(EntityStorageControllerInterface $storage_controll ...@@ -316,12 +316,6 @@ protected function preSaveNew(EntityStorageControllerInterface $storage_controll
)); ));
} }
// Ensure the field name is unique (we do not care about deleted fields).
if ($prior_field = $storage_controller->load($this->id)) {
$message = 'Attempt to create field name %name which already exists.';
throw new FieldException(format_string($message, array('%name' => $this->name)));
}
// Disallow reserved field names. This can't prevent all field name // Disallow reserved field names. This can't prevent all field name
// collisions with existing entity properties, but some is better than // collisions with existing entity properties, but some is better than
// none. // none.
......
...@@ -346,10 +346,6 @@ public function preSave(EntityStorageControllerInterface $storage_controller) { ...@@ -346,10 +346,6 @@ public function preSave(EntityStorageControllerInterface $storage_controller) {
$field_type_manager = \Drupal::service('plugin.manager.field.field_type'); $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
if ($this->isNew()) { if ($this->isNew()) {
// Ensure the field instance is unique within the bundle.
if ($prior_instance = $storage_controller->load($this->id())) {
throw new FieldException(format_string('Attempt to create an instance of field %name on bundle @bundle that already has an instance of that field.', array('%name' => $this->field->name, '@bundle' => $this->bundle)));
}
// Set the default instance settings. // Set the default instance settings.
$this->settings += $field_type_manager->getDefaultInstanceSettings($this->field->type); $this->settings += $field_type_manager->getDefaultInstanceSettings($this->field->type);
// Notify the entity storage controller. // Notify the entity storage controller.
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
namespace Drupal\field\Tests; namespace Drupal\field\Tests;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\field\FieldException; use Drupal\field\FieldException;
class CrudTest extends FieldUnitTestBase { class CrudTest extends FieldUnitTestBase {
...@@ -70,7 +71,7 @@ function testCreateField() { ...@@ -70,7 +71,7 @@ function testCreateField() {
entity_create('field_entity', $field_definition)->save(); entity_create('field_entity', $field_definition)->save();
$this->fail(t('Cannot create two fields with the same name.')); $this->fail(t('Cannot create two fields with the same name.'));
} }
catch (FieldException $e) { catch (EntityStorageException $e) {
$this->pass(t('Cannot create two fields with the same name.')); $this->pass(t('Cannot create two fields with the same name.'));
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
namespace Drupal\field\Tests; namespace Drupal\field\Tests;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\field\FieldException; use Drupal\field\FieldException;
class FieldInstanceCrudTest extends FieldUnitTestBase { class FieldInstanceCrudTest extends FieldUnitTestBase {
...@@ -90,7 +91,7 @@ function testCreateFieldInstance() { ...@@ -90,7 +91,7 @@ function testCreateFieldInstance() {
entity_create('field_instance', $this->instance_definition)->save(); entity_create('field_instance', $this->instance_definition)->save();
$this->fail(t('Cannot create two instances with the same field / bundle combination.')); $this->fail(t('Cannot create two instances with the same field / bundle combination.'));
} }
catch (FieldException $e) { catch (EntityStorageException $e) {
$this->pass(t('Cannot create two instances with the same field / bundle combination.')); $this->pass(t('Cannot create two instances with the same field / bundle combination.'));
} }
......
...@@ -10,6 +10,7 @@ display: ...@@ -10,6 +10,7 @@ display:
field: type field: type
id: type id: type
table: node_field_data table: node_field_data
plugin_id: node_type
provider: node provider: node
display_plugin: default display_plugin: default
display_title: Master display_title: Master
......
...@@ -142,6 +142,8 @@ protected function createTests() { ...@@ -142,6 +142,8 @@ protected function createTests() {
// Create a new View instance with config values. // Create a new View instance with config values.
$values = \Drupal::config('views.view.test_view_storage')->get(); $values = \Drupal::config('views.view.test_view_storage')->get();
$values['id'] = 'test_view_storage_new';
unset($values['uuid']);
$created = $this->controller->create($values); $created = $this->controller->create($values);
$this->assertTrue($created instanceof View, 'Created object is a View.'); $this->assertTrue($created instanceof View, 'Created object is a View.');
...@@ -157,7 +159,6 @@ protected function createTests() { ...@@ -157,7 +159,6 @@ protected function createTests() {
} }
// Check the UUID of the loaded View. // Check the UUID of the loaded View.
$created->set('id', 'test_view_storage_new');
$created->save(); $created->save();
$created_loaded = entity_load('view', 'test_view_storage_new'); $created_loaded = entity_load('view', 'test_view_storage_new');
$this->assertIdentical($created->uuid(), $created_loaded->uuid(), 'The created UUID has been saved correctly.'); $this->assertIdentical($created->uuid(), $created_loaded->uuid(), 'The created UUID has been saved correctly.');
......
base_table: node
core: '8'
description: ''
status: '1'
display:
default:
display_options:
fields:
type:
field: type
id: type
table: node_field_data
plugin_id: node_type
provider: node
display_plugin: default
display_title: Master
id: default
position: '0'
label: ''
id: test_field_type
tag: ''
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment