Version 1
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Entity / EntityTypeTest.php
diff --git a/web/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php b/web/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
new file mode 100644 (file)
index 0000000..d1045f5
--- /dev/null
@@ -0,0 +1,441 @@
+<?php
+
+namespace Drupal\Tests\Core\Entity;
+
+use Drupal\Core\Entity\EntityType;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Entity\EntityType
+ * @group Entity
+ */
+class EntityTypeTest extends UnitTestCase {
+
+  /**
+   * Sets up an EntityType object for a given set of values.
+   *
+   * @param array $definition
+   *   An array of values to use for the EntityType.
+   *
+   * @return \Drupal\Core\Entity\EntityTypeInterface
+   */
+  protected function setUpEntityType($definition) {
+    $definition += [
+      'id' => 'example_entity_type',
+    ];
+    return new EntityType($definition);
+  }
+
+  /**
+   * @covers ::get
+   *
+   * @dataProvider providerTestGet
+   */
+  public function testGet(array $defintion, $key, $expected) {
+    $entity_type = $this->setUpEntityType($defintion);
+    $this->assertSame($expected, $entity_type->get($key));
+  }
+
+  /**
+   * @covers ::set
+   * @covers ::get
+   *
+   * @dataProvider providerTestSet
+   */
+  public function testSet($key, $value) {
+    $entity_type = $this->setUpEntityType([]);
+    $this->assertInstanceOf('Drupal\Core\Entity\EntityTypeInterface', $entity_type->set($key, $value));
+    $this->assertSame($value, $entity_type->get($key));
+    $this->assertNoPublicProperties($entity_type);
+  }
+
+  /**
+   * Tests the getKeys() method.
+   *
+   * @dataProvider providerTestGetKeys
+   */
+  public function testGetKeys($entity_keys, $expected) {
+    $entity_type = $this->setUpEntityType(['entity_keys' => $entity_keys]);
+    $this->assertSame($expected + ['default_langcode' => 'default_langcode'], $entity_type->getKeys());
+  }
+
+  /**
+   * Tests the getKey() method.
+   *
+   * @dataProvider providerTestGetKeys
+   */
+  public function testGetKey($entity_keys, $expected) {
+    $entity_type = $this->setUpEntityType(['entity_keys' => $entity_keys]);
+    $this->assertSame($expected['bundle'], $entity_type->getKey('bundle'));
+    $this->assertSame(FALSE, $entity_type->getKey('bananas'));
+  }
+
+  /**
+   * Tests the hasKey() method.
+   *
+   * @dataProvider providerTestGetKeys
+   */
+  public function testHasKey($entity_keys, $expected) {
+    $entity_type = $this->setUpEntityType(['entity_keys' => $entity_keys]);
+    $this->assertSame(!empty($expected['bundle']), $entity_type->hasKey('bundle'));
+    $this->assertSame(!empty($expected['id']), $entity_type->hasKey('id'));
+    $this->assertSame(FALSE, $entity_type->hasKey('bananas'));
+  }
+
+  /**
+   * Provides test data for testGet.
+   */
+  public function providerTestGet() {
+    return [
+      [[], 'provider', NULL],
+      [['provider' => ''], 'provider', ''],
+      [['provider' => 'test'], 'provider', 'test'],
+      [[], 'something_additional', NULL],
+      [['something_additional' => ''], 'something_additional', ''],
+      [['something_additional' => 'additional'], 'something_additional', 'additional'],
+    ];
+  }
+
+  /**
+   * Provides test data for testSet.
+   */
+  public function providerTestSet() {
+    return [
+      ['provider', NULL],
+      ['provider', ''],
+      ['provider', 'test'],
+      ['something_additional', NULL],
+      ['something_additional', ''],
+      ['something_additional', 'additional'],
+    ];
+  }
+
+  /**
+   * Provides test data.
+   */
+  public function providerTestGetKeys() {
+    return [
+      [[], ['revision' => '', 'bundle' => '', 'langcode' => '']],
+      [['id' => 'id'], ['id' => 'id', 'revision' => '', 'bundle' => '', 'langcode' => '']],
+      [['bundle' => 'bundle'], ['bundle' => 'bundle', 'revision' => '', 'langcode' => '']],
+    ];
+  }
+
+  /**
+   * Tests the isRevisionable() method.
+   */
+  public function testIsRevisionable() {
+    $entity_type = $this->setUpEntityType(['entity_keys' => ['id' => 'id']]);
+    $this->assertFalse($entity_type->isRevisionable());
+    $entity_type = $this->setUpEntityType(['entity_keys' => ['id' => 'id', 'revision' => FALSE]]);
+    $this->assertFalse($entity_type->isRevisionable());
+    $entity_type = $this->setUpEntityType(['entity_keys' => ['id' => 'id', 'revision' => TRUE]]);
+    $this->assertTrue($entity_type->isRevisionable());
+  }
+
+  /**
+   * Tests the getHandler() method.
+   */
+  public function testGetHandler() {
+    $controller = $this->getTestHandlerClass();
+    $entity_type = $this->setUpEntityType([
+      'handlers' => [
+        'storage' => $controller,
+        'form' => [
+          'default' => $controller,
+        ],
+      ],
+    ]);
+    $this->assertSame($controller, $entity_type->getHandlerClass('storage'));
+    $this->assertSame($controller, $entity_type->getHandlerClass('form', 'default'));
+  }
+
+  /**
+   * Tests the getStorageClass() method.
+   */
+  public function testGetStorageClass() {
+    $controller = $this->getTestHandlerClass();
+    $entity_type = $this->setUpEntityType([
+      'handlers' => [
+        'storage' => $controller,
+      ],
+    ]);
+    $this->assertSame($controller, $entity_type->getStorageClass());
+  }
+
+  /**
+   * Tests the setStorageClass() method.
+   */
+  public function testSetStorageClass() {
+    $controller = $this->getTestHandlerClass();
+    $entity_type = $this->setUpEntityType([]);
+    $this->assertSame($entity_type, $entity_type->setStorageClass($controller));
+  }
+
+  /**
+   * Tests the getListBuilderClass() method.
+   */
+  public function testGetListBuilderClass() {
+    $controller = $this->getTestHandlerClass();
+    $entity_type = $this->setUpEntityType([
+      'handlers' => [
+        'list_builder' => $controller,
+      ],
+    ]);
+    $this->assertSame($controller, $entity_type->getListBuilderClass());
+  }
+
+  /**
+   * Tests the getAccessControlClass() method.
+   */
+  public function testGetAccessControlClass() {
+    $controller = $this->getTestHandlerClass();
+    $entity_type = $this->setUpEntityType([
+      'handlers' => [
+        'access' => $controller,
+      ],
+    ]);
+    $this->assertSame($controller, $entity_type->getAccessControlClass());
+  }
+
+  /**
+   * Tests the getFormClass() method.
+   */
+  public function testGetFormClass() {
+    $controller = $this->getTestHandlerClass();
+    $operation = 'default';
+    $entity_type = $this->setUpEntityType([
+      'handlers' => [
+        'form' => [
+          $operation => $controller,
+        ],
+      ],
+    ]);
+    $this->assertSame($controller, $entity_type->getFormClass($operation));
+  }
+
+  /**
+   * Tests the hasFormClasses() method.
+   */
+  public function testHasFormClasses() {
+    $controller = $this->getTestHandlerClass();
+    $operation = 'default';
+    $entity_type1 = $this->setUpEntityType([
+      'handlers' => [
+        'form' => [
+          $operation => $controller,
+        ],
+      ],
+    ]);
+    $entity_type2 = $this->setUpEntityType([
+      'handlers' => [],
+    ]);
+    $this->assertTrue($entity_type1->hasFormClasses());
+    $this->assertFalse($entity_type2->hasFormClasses());
+  }
+
+  /**
+   * Tests the getViewBuilderClass() method.
+   */
+  public function testGetViewBuilderClass() {
+    $controller = $this->getTestHandlerClass();
+    $entity_type = $this->setUpEntityType([
+      'handlers' => [
+        'view_builder' => $controller,
+      ],
+    ]);
+    $this->assertSame($controller, $entity_type->getViewBuilderClass());
+  }
+
+  /**
+   * @covers ::__construct
+   */
+  public function testIdExceedsMaxLength() {
+    $id = $this->randomMachineName(33);
+    $message = 'Attempt to create an entity type with an ID longer than 32 characters: ' . $id;
+    $this->setExpectedException('Drupal\Core\Entity\Exception\EntityTypeIdLengthException', $message);
+    $this->setUpEntityType(['id' => $id]);
+  }
+
+  /**
+   * @covers ::getOriginalClass
+   */
+  public function testgetOriginalClassUnchanged() {
+    $class = $this->randomMachineName();
+    $entity_type = $this->setUpEntityType(['class' => $class]);
+    $this->assertEquals($class, $entity_type->getOriginalClass());
+  }
+
+  /**
+   * @covers ::setClass
+   * @covers ::getOriginalClass
+   */
+  public function testgetOriginalClassChanged() {
+    $class = $this->randomMachineName();
+    $entity_type = $this->setUpEntityType(['class' => $class]);
+    $entity_type->setClass($this->randomMachineName());
+    $this->assertEquals($class, $entity_type->getOriginalClass());
+  }
+
+  /**
+   * @covers ::id
+   */
+  public function testId() {
+    $id = $this->randomMachineName(32);
+    $entity_type = $this->setUpEntityType(['id' => $id]);
+    $this->assertEquals($id, $entity_type->id());
+  }
+
+  /**
+   * @covers ::getLabel
+   */
+  public function testGetLabel() {
+    $translatable_label = new TranslatableMarkup($this->randomMachineName());
+    $entity_type = $this->setUpEntityType(['label' => $translatable_label]);
+    $this->assertSame($translatable_label, $entity_type->getLabel());
+
+    $label = $this->randomMachineName();
+    $entity_type = $this->setUpEntityType(['label' => $label]);
+    $this->assertSame($label, $entity_type->getLabel());
+  }
+
+  /**
+   * @covers ::getGroupLabel
+   */
+  public function testGetGroupLabel() {
+    $translatable_group_label = new TranslatableMarkup($this->randomMachineName());
+    $entity_type = $this->setUpEntityType(['group_label' => $translatable_group_label]);
+    $this->assertSame($translatable_group_label, $entity_type->getGroupLabel());
+
+    $default_label = $this->randomMachineName();
+    $entity_type = $this->setUpEntityType(['group_label' => $default_label]);
+    $this->assertSame($default_label, $entity_type->getGroupLabel());
+
+    $default_label = new TranslatableMarkup('Other', [], ['context' => 'Entity type group']);
+    $entity_type = $this->setUpEntityType(['group_label' => $default_label]);
+    $this->assertSame($default_label, $entity_type->getGroupLabel());
+  }
+
+  /**
+   * @covers ::getCollectionLabel
+   */
+  public function testGetCollectionLabel() {
+    $translatable_label = new TranslatableMarkup('Entity test collection', [], [], $this->getStringTranslationStub());
+    $entity_type = $this->setUpEntityType(['label_collection' => $translatable_label]);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('Entity test collection', $entity_type->getCollectionLabel());
+  }
+
+  /**
+   * @covers ::getSingularLabel
+   */
+  public function testGetSingularLabel() {
+    $translatable_label = new TranslatableMarkup('entity test singular', [], [], $this->getStringTranslationStub());
+    $entity_type = $this->setUpEntityType(['label_singular' => $translatable_label]);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('entity test singular', $entity_type->getSingularLabel());
+  }
+
+  /**
+   * @covers ::getSingularLabel
+   */
+  public function testGetSingularLabelDefault() {
+    $entity_type = $this->setUpEntityType(['label' => 'Entity test Singular']);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('entity test singular', $entity_type->getSingularLabel());
+  }
+
+  /**
+   * @covers ::getPluralLabel
+   */
+  public function testGetPluralLabel() {
+    $translatable_label = new TranslatableMarkup('entity test plural', [], [], $this->getStringTranslationStub());
+    $entity_type = $this->setUpEntityType(['label_plural' => $translatable_label]);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('entity test plural', $entity_type->getPluralLabel());
+  }
+
+  /**
+   * @covers ::getPluralLabel
+   */
+  public function testGetPluralLabelDefault() {
+    $entity_type = $this->setUpEntityType(['label' => 'Entity test Plural']);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('entity test plural entities', $entity_type->getPluralLabel());
+  }
+
+  /**
+   * @covers ::getCountLabel
+   */
+  public function testGetCountLabel() {
+    $entity_type = $this->setUpEntityType(['label_count' => ['singular' => 'one entity test', 'plural' => '@count entity test']]);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('one entity test', $entity_type->getCountLabel(1));
+    $this->assertEquals('2 entity test', $entity_type->getCountLabel(2));
+    $this->assertEquals('200 entity test', $entity_type->getCountLabel(200));
+  }
+
+  /**
+   * @covers ::getCountLabel
+   */
+  public function testGetCountLabelDefault() {
+    $entity_type = $this->setUpEntityType(['label' => 'Entity test Plural']);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('1 entity test plural', $entity_type->getCountLabel(1));
+    $this->assertEquals('2 entity test plural entities', $entity_type->getCountLabel(2));
+    $this->assertEquals('200 entity test plural entities', $entity_type->getCountLabel(200));
+  }
+
+  /**
+   * Gets a mock controller class name.
+   *
+   * @return string
+   *   A mock controller class name.
+   */
+  protected function getTestHandlerClass() {
+    return get_class($this->getMockForAbstractClass('Drupal\Core\Entity\EntityHandlerBase'));
+  }
+
+  /**
+   * @covers ::setLinkTemplate
+   */
+  public function testSetLinkTemplateWithInvalidPath() {
+    $entity_type = $this->setUpEntityType(['id' => $this->randomMachineName()]);
+    $this->setExpectedException(\InvalidArgumentException::class);
+    $entity_type->setLinkTemplate('test', 'invalid-path');
+  }
+
+  /**
+   * Tests the constraint methods.
+   *
+   * @covers ::getConstraints
+   * @covers ::setConstraints
+   * @covers ::addConstraint
+   */
+  public function testConstraintMethods() {
+    $definition = [
+      'constraints' => [
+        'EntityChanged' => [],
+      ],
+    ];
+    $entity_type = $this->setUpEntityType($definition);
+    $this->assertEquals($definition['constraints'], $entity_type->getConstraints());
+    $entity_type->addConstraint('Test');
+    $this->assertEquals($definition['constraints'] + ['Test' => NULL], $entity_type->getConstraints());
+    $entity_type->setConstraints([]);
+    $this->assertEquals([], $entity_type->getConstraints());
+  }
+
+  /**
+   * Asserts there on no public properties on the object instance.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   */
+  protected function assertNoPublicProperties(EntityTypeInterface $entity_type) {
+    $reflection = new \ReflectionObject($entity_type);
+    $this->assertEmpty($reflection->getProperties(\ReflectionProperty::IS_PUBLIC));
+  }
+
+}