diff --git a/tests/src/Kernel/DynamicEntityReferenceConfigEntityTest.php b/tests/src/Kernel/DynamicEntityReferenceConfigEntityTest.php new file mode 100644 index 0000000..f3f51c3 --- /dev/null +++ b/tests/src/Kernel/DynamicEntityReferenceConfigEntityTest.php @@ -0,0 +1,345 @@ +installConfig(['config_test']); + $this->installEntitySchema('entity_test_rev'); + } + + /** + * Helper method to setup field and field storages. + */ + protected function setUpField() { + // Create a field. + $this->fieldStorage = FieldStorageConfig::create([ + 'field_name' => $this->fieldName, + 'type' => 'dynamic_entity_reference', + 'entity_type' => $this->entityType, + 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, + 'settings' => [ + 'exclude_entity_types' => FALSE, + 'entity_type_ids' => $this->referencedEntityTypes, + ], + ]); + $this->fieldStorage->save(); + + $this->fieldConfig = FieldConfig::create([ + 'field_name' => $this->fieldName, + 'entity_type' => $this->entityType, + 'bundle' => $this->bundle, + 'label' => 'Field test', + 'settings' => [], + ]); + $this->fieldConfig->save(); + } + + /** + * Config entity only configurable DER field. + */ + public function testConfigurableField() { + $this->setUpField(); + + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'foo', + 'label' => 'Foo', + 'style' => 'bar', + ]); + $referenced_entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEquals($violations->count(), 0, 'Validation passes.'); + } + + /** + * Content entity and config entity configurable DER field. + */ + public function testMixedConfigurableField() { + $this->referencedEntityTypes[] = 'entity_test_rev'; + $this->setUpField(); + + // Check config entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'foo', + 'label' => 'Foo', + 'style' => 'bar', + ]); + $referenced_entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + + // Check content entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('entity_test_rev') + ->create(['type' => $this->bundle]); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + } + + /** + * Config entity only base DER field. + */ + public function testBaseField() { + // @see dynamic_entity_reference_entity_test_entity_base_field_info() + $this->fieldName = 'dynamic_references'; + $state = $this->container->get('state'); + $state->set('dynamic_entity_reference_entity_test_entities', [$this->entityType, 'config_test']); + $state->set('dynamic_entity_reference_entity_test_cardinality', 1); + $state->set('dynamic_entity_reference_entity_test_exclude', [$this->entityType]); + $this->enableModules(['dynamic_entity_reference_entity_test']); + $this->container->get('entity.definition_update_manager')->applyUpdates(); + + // Reference a config entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'foo', + 'label' => 'Foo', + 'style' => 'bar', + ]); + $referenced_entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + } + + /** + * Config entity only revisionable base DER field. + */ + public function testRevisionableBaseField() { + // @see dynamic_entity_reference_entity_test_entity_base_field_info() + $this->fieldName = 'dynamic_references'; + $state = $this->container->get('state'); + + // Make this base field revisionable. + $state->set('dynamic_entity_reference_entity_test_revisionable', TRUE); + $state->set('dynamic_entity_reference_entity_test_entities', [$this->entityType, 'config_test']); + $state->set('dynamic_entity_reference_entity_test_cardinality', 1); + $state->set('dynamic_entity_reference_entity_test_exclude', [$this->entityType]); + $this->enableModules(['dynamic_entity_reference_entity_test']); + $this->container->get('entity.definition_update_manager')->applyUpdates(); + + // Reference a config entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'foo', + 'label' => 'Foo', + 'style' => 'bar', + ]); + $referenced_entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + + // Save the entity and update. + $entity->save(); + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'bar', + 'label' => 'Bar', + 'style' => 'foo', + ]); + $referenced_entity->save(); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + $entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->load($entity->id()); + $referenced = $entity->{$this->fieldName}->referencedEntities(); + $this->assertEquals(1, count($referenced)); + $this->assertEquals('bar', $referenced[0]->id()); + } + + /** + * Content entity and config entity base DER field. + */ + public function testMixedBaseField() { + // @see dynamic_entity_reference_entity_test_entity_base_field_info() + $this->fieldName = 'dynamic_references'; + $state = $this->container->get('state'); + $state->set('dynamic_entity_reference_entity_test_entities', [$this->entityType, 'config_test', 'entity_test_mul']); + $state->set('dynamic_entity_reference_entity_test_cardinality', 1); + $state->set('dynamic_entity_reference_entity_test_exclude', [$this->entityType]); + $this->enableModules(['dynamic_entity_reference_entity_test']); + $this->container->get('entity.definition_update_manager')->applyUpdates(); + + // Reference a config entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'foo', + 'label' => 'Foo', + 'style' => 'bar', + ]); + $referenced_entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + + // Reference a content entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('entity_test_mul') + ->create(['type' => $this->bundle]); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + } + + /** + * Content entity and config entity revisionable base DER field. + */ + public function testMixedRevisionableBaseField() { + // @see dynamic_entity_reference_entity_test_entity_base_field_info() + $this->fieldName = 'dynamic_references'; + $state = $this->container->get('state'); + + // Make this base field revisionable. + $state->set('dynamic_entity_reference_entity_test_revisionable', TRUE); + $state->set('dynamic_entity_reference_entity_test_entities', [$this->entityType, 'config_test', 'entity_test_mul']); + $state->set('dynamic_entity_reference_entity_test_cardinality', 1); + $state->set('dynamic_entity_reference_entity_test_exclude', [$this->entityType]); + $this->enableModules(['dynamic_entity_reference_entity_test']); + $this->container->get('entity.definition_update_manager')->applyUpdates(); + + // Reference a config entity. + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('config_test') + ->create([ + 'id' => 'foo', + 'label' => 'Foo', + 'style' => 'bar', + ]); + $referenced_entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->create(['type' => $this->bundle]); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + + // Save the entity and update to use a content entity. + $entity->save(); + $referenced_entity = $this->container->get('entity_type.manager') + ->getStorage('entity_test_mul') + ->create(['type' => $this->bundle]); + $referenced_entity->save(); + $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); + $entity->{$this->fieldName}->target_id = $referenced_entity->id(); + $violations = $entity->{$this->fieldName}->validate(); + $this->assertEmpty($violations->count(), 'Validation passes.'); + $entity->save(); + $entity = $this->container->get('entity_type.manager') + ->getStorage($this->entityType) + ->load($entity->id()); + $referenced = $entity->{$this->fieldName}->referencedEntities(); + $this->assertEquals(1, count($referenced)); + $this->assertEquals($referenced_entity->id(), $referenced[0]->id()); + } + +} diff --git a/tests/src/Kernel/DynamicEntityReferenceFieldTest.php b/tests/src/Kernel/DynamicEntityReferenceFieldTest.php index a8b97d3..1d48e1e 100644 --- a/tests/src/Kernel/DynamicEntityReferenceFieldTest.php +++ b/tests/src/Kernel/DynamicEntityReferenceFieldTest.php @@ -414,30 +414,4 @@ class DynamicEntityReferenceFieldTest extends EntityKernelTestBase { $this->assertEquals($entities[1]->id(), $referenced_entity->id()); } - /** - * Test config entity reference. - */ - public function testConfigEntities() { - // Update field storage to allow config entity references. - $storage = $this->container->get('entity_type.manager')->getStorage('field_storage_config')->load($this->entityType . '.' . $this->fieldName); - $entity_types = [ - $this->entityType, - 'field_config', - ]; - $storage->setSetting('entity_type_ids', $entity_types); - $storage->save(); - - // Reference a field configuration (a config entity). - $referenced_entity = $this->container->get('entity_type.manager') - ->getStorage('field_config') - ->load($this->entityType . '.' . $this->bundle . '.' . $this->fieldName); - $entity = $this->container->get('entity_type.manager') - ->getStorage($this->entityType) - ->create(['type' => $this->bundle]); - $entity->{$this->fieldName}->target_type = $referenced_entity->getEntityTypeId(); - $entity->{$this->fieldName}->target_id = $referenced_entity->id(); - $violations = $entity->{$this->fieldName}->validate(); - $this->assertEquals($violations->count(), 0, 'Validation passes.'); - } - }