annotate core/modules/link/tests/src/Kernel/LinkItemTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\link\Kernel;
Chris@0 4
Chris@0 5 use Drupal\Component\Utility\UrlHelper;
Chris@0 6 use Drupal\Core\Field\FieldItemListInterface;
Chris@0 7 use Drupal\Core\Field\FieldItemInterface;
Chris@0 8 use Drupal\Core\Url;
Chris@0 9 use Drupal\entity_test\Entity\EntityTest;
Chris@0 10 use Drupal\field\Entity\FieldConfig;
Chris@0 11 use Drupal\field\Entity\FieldStorageConfig;
Chris@0 12 use Drupal\Tests\field\Kernel\FieldKernelTestBase;
Chris@0 13 use Drupal\link\LinkItemInterface;
Chris@0 14
Chris@0 15 /**
Chris@0 16 * Tests the new entity API for the link field type.
Chris@0 17 *
Chris@0 18 * @group link
Chris@0 19 */
Chris@0 20 class LinkItemTest extends FieldKernelTestBase {
Chris@0 21
Chris@0 22 /**
Chris@0 23 * Modules to enable.
Chris@0 24 *
Chris@0 25 * @var array
Chris@0 26 */
Chris@0 27 public static $modules = ['link'];
Chris@0 28
Chris@0 29 protected function setUp() {
Chris@0 30 parent::setUp();
Chris@0 31
Chris@0 32 // Create a generic, external, and internal link fields for validation.
Chris@0 33 FieldStorageConfig::create([
Chris@0 34 'field_name' => 'field_test',
Chris@0 35 'entity_type' => 'entity_test',
Chris@0 36 'type' => 'link',
Chris@0 37 ])->save();
Chris@0 38 FieldConfig::create([
Chris@0 39 'entity_type' => 'entity_test',
Chris@0 40 'field_name' => 'field_test',
Chris@0 41 'bundle' => 'entity_test',
Chris@0 42 'settings' => ['link_type' => LinkItemInterface::LINK_GENERIC],
Chris@0 43 ])->save();
Chris@0 44 FieldStorageConfig::create([
Chris@0 45 'field_name' => 'field_test_external',
Chris@0 46 'entity_type' => 'entity_test',
Chris@0 47 'type' => 'link',
Chris@0 48 ])->save();
Chris@0 49 FieldConfig::create([
Chris@0 50 'entity_type' => 'entity_test',
Chris@0 51 'field_name' => 'field_test_external',
Chris@0 52 'bundle' => 'entity_test',
Chris@0 53 'settings' => ['link_type' => LinkItemInterface::LINK_EXTERNAL],
Chris@0 54 ])->save();
Chris@0 55 FieldStorageConfig::create([
Chris@0 56 'field_name' => 'field_test_internal',
Chris@0 57 'entity_type' => 'entity_test',
Chris@0 58 'type' => 'link',
Chris@0 59 ])->save();
Chris@0 60 FieldConfig::create([
Chris@0 61 'entity_type' => 'entity_test',
Chris@0 62 'field_name' => 'field_test_internal',
Chris@0 63 'bundle' => 'entity_test',
Chris@0 64 'settings' => ['link_type' => LinkItemInterface::LINK_INTERNAL],
Chris@0 65 ])->save();
Chris@0 66 }
Chris@0 67
Chris@0 68 /**
Chris@0 69 * Tests using entity fields of the link field type.
Chris@0 70 */
Chris@0 71 public function testLinkItem() {
Chris@0 72 // Create entity.
Chris@0 73 $entity = EntityTest::create();
Chris@0 74 $url = 'https://www.drupal.org?test_param=test_value';
Chris@0 75 $parsed_url = UrlHelper::parse($url);
Chris@0 76 $title = $this->randomMachineName();
Chris@0 77 $class = $this->randomMachineName();
Chris@0 78 $entity->field_test->uri = $parsed_url['path'];
Chris@0 79 $entity->field_test->title = $title;
Chris@0 80 $entity->field_test->first()->get('options')->set('query', $parsed_url['query']);
Chris@0 81 $entity->field_test->first()->get('options')->set('attributes', ['class' => $class]);
Chris@0 82 $this->assertEquals([
Chris@0 83 'query' => $parsed_url['query'],
Chris@0 84 'attributes' => [
Chris@0 85 'class' => $class,
Chris@0 86 ],
Chris@0 87 'external' => TRUE,
Chris@0 88 ], $entity->field_test->first()->getUrl()->getOptions());
Chris@0 89 $entity->name->value = $this->randomMachineName();
Chris@0 90 $entity->save();
Chris@0 91
Chris@0 92 // Verify that the field value is changed.
Chris@0 93 $id = $entity->id();
Chris@0 94 $entity = EntityTest::load($id);
Chris@0 95 $this->assertTrue($entity->field_test instanceof FieldItemListInterface, 'Field implements interface.');
Chris@0 96 $this->assertTrue($entity->field_test[0] instanceof FieldItemInterface, 'Field item implements interface.');
Chris@0 97 $this->assertEqual($entity->field_test->uri, $parsed_url['path']);
Chris@0 98 $this->assertEqual($entity->field_test[0]->uri, $parsed_url['path']);
Chris@0 99 $this->assertEqual($entity->field_test->title, $title);
Chris@0 100 $this->assertEqual($entity->field_test[0]->title, $title);
Chris@0 101 $this->assertEqual($entity->field_test->options['attributes']['class'], $class);
Chris@0 102 $this->assertEqual($entity->field_test->options['query'], $parsed_url['query']);
Chris@0 103
Chris@0 104 // Update only the entity name property to check if the link field data will
Chris@0 105 // remain intact.
Chris@0 106 $entity->name->value = $this->randomMachineName();
Chris@0 107 $entity->save();
Chris@0 108 $id = $entity->id();
Chris@0 109 $entity = EntityTest::load($id);
Chris@0 110 $this->assertEqual($entity->field_test->uri, $parsed_url['path']);
Chris@0 111 $this->assertEqual($entity->field_test->options['attributes']['class'], $class);
Chris@0 112 $this->assertEqual($entity->field_test->options['query'], $parsed_url['query']);
Chris@0 113
Chris@0 114 // Verify changing the field value.
Chris@0 115 $new_url = 'https://www.drupal.org';
Chris@0 116 $new_title = $this->randomMachineName();
Chris@0 117 $new_class = $this->randomMachineName();
Chris@0 118 $entity->field_test->uri = $new_url;
Chris@0 119 $entity->field_test->title = $new_title;
Chris@0 120 $entity->field_test->first()->get('options')->set('query', NULL);
Chris@0 121 $entity->field_test->first()->get('options')->set('attributes', ['class' => $new_class]);
Chris@0 122 $this->assertEqual($entity->field_test->uri, $new_url);
Chris@0 123 $this->assertEqual($entity->field_test->title, $new_title);
Chris@0 124 $this->assertEqual($entity->field_test->options['attributes']['class'], $new_class);
Chris@0 125 $this->assertNull($entity->field_test->options['query']);
Chris@0 126
Chris@0 127 // Read changed entity and assert changed values.
Chris@0 128 $entity->save();
Chris@0 129 $entity = EntityTest::load($id);
Chris@0 130 $this->assertEqual($entity->field_test->uri, $new_url);
Chris@0 131 $this->assertEqual($entity->field_test->title, $new_title);
Chris@0 132 $this->assertEqual($entity->field_test->options['attributes']['class'], $new_class);
Chris@0 133
Chris@0 134 // Check that if we only set uri the default values for title and options
Chris@0 135 // are also initialized.
Chris@0 136 $entity->field_test = ['uri' => 'internal:/node/add'];
Chris@0 137 $this->assertEqual($entity->field_test->uri, 'internal:/node/add');
Chris@0 138 $this->assertNull($entity->field_test->title);
Chris@0 139 $this->assertIdentical($entity->field_test->options, []);
Chris@0 140
Chris@18 141 // Check that if we set uri and options then the default values are properly
Chris@18 142 // initialized.
Chris@0 143 $entity->field_test = [
Chris@0 144 'uri' => 'internal:/node/add',
Chris@18 145 'options' => ['query' => NULL],
Chris@0 146 ];
Chris@0 147 $this->assertEqual($entity->field_test->uri, 'internal:/node/add');
Chris@0 148 $this->assertNull($entity->field_test->title);
Chris@0 149 $this->assertNull($entity->field_test->options['query']);
Chris@0 150
Chris@0 151 // Check that if we set the direct value of link field it correctly set the
Chris@0 152 // uri and the default values of the field.
Chris@0 153 $entity->field_test = 'internal:/node/add';
Chris@0 154 $this->assertEqual($entity->field_test->uri, 'internal:/node/add');
Chris@0 155 $this->assertNull($entity->field_test->title);
Chris@0 156 $this->assertIdentical($entity->field_test->options, []);
Chris@0 157
Chris@0 158 // Check that setting options to NULL does not trigger an error when
Chris@0 159 // calling getUrl();
Chris@0 160 $entity->field_test->options = NULL;
Chris@0 161 $this->assertInstanceOf(Url::class, $entity->field_test[0]->getUrl());
Chris@0 162
Chris@0 163 // Check that setting LinkItem value NULL doesn't generate any error or
Chris@0 164 // warning.
Chris@0 165 $entity->field_test[0] = NULL;
Chris@0 166 $this->assertNull($entity->field_test[0]->getValue());
Chris@0 167
Chris@0 168 // Test the generateSampleValue() method for generic, external, and internal
Chris@0 169 // link types.
Chris@0 170 $entity = EntityTest::create();
Chris@0 171 $entity->field_test->generateSampleItems();
Chris@0 172 $entity->field_test_external->generateSampleItems();
Chris@0 173 $entity->field_test_internal->generateSampleItems();
Chris@0 174 $this->entityValidateAndSave($entity);
Chris@0 175 }
Chris@0 176
Chris@18 177 /**
Chris@18 178 * Tests the deprecated behavior of LinkItem::setValue().
Chris@18 179 *
Chris@18 180 * @group legacy
Chris@18 181 * @expectedDeprecation Support for passing options as a serialized string is deprecated in 8.7.0 and will be removed before Drupal 9.0.0. Pass them as an array instead. See https://www.drupal.org/node/2961643.
Chris@18 182 */
Chris@18 183 public function testSerializedOptions() {
Chris@18 184 // Check that if we set uri and options then the default values are
Chris@18 185 // properly initialized.
Chris@18 186 $entity = EntityTest::create();
Chris@18 187 $entity->set('field_test', [
Chris@18 188 'uri' => 'internal:/node/add',
Chris@18 189 'options' => serialize(['query' => NULL]),
Chris@18 190 ]);
Chris@18 191 $this->assertEquals('internal:/node/add', $entity->get('field_test')->uri);
Chris@18 192 $this->assertNull($entity->get('field_test')->title);
Chris@18 193 $this->assertNull($entity->get('field_test')->options['query']);
Chris@18 194 }
Chris@18 195
Chris@0 196 }