You are here

public function LinkItemTest::testLinkItem in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/link/src/Tests/LinkItemTest.php \Drupal\link\Tests\LinkItemTest::testLinkItem()

Tests using entity fields of the link field type.

File

core/modules/link/src/Tests/LinkItemTest.php, line 74
Contains \Drupal\link\Tests\LinkItemTest.

Class

LinkItemTest
Tests the new entity API for the link field type.

Namespace

Drupal\link\Tests

Code

public function testLinkItem() {

  // Create entity.
  $entity = entity_create('entity_test');
  $url = 'https://www.drupal.org?test_param=test_value';
  $parsed_url = UrlHelper::parse($url);
  $title = $this
    ->randomMachineName();
  $class = $this
    ->randomMachineName();
  $entity->field_test->uri = $parsed_url['path'];
  $entity->field_test->title = $title;
  $entity->field_test
    ->first()
    ->get('options')
    ->set('query', $parsed_url['query']);
  $entity->field_test
    ->first()
    ->get('options')
    ->set('attributes', array(
    'class' => $class,
  ));
  $entity->name->value = $this
    ->randomMachineName();
  $entity
    ->save();

  // Verify that the field value is changed.
  $id = $entity
    ->id();
  $entity = entity_load('entity_test', $id);
  $this
    ->assertTrue($entity->field_test instanceof FieldItemListInterface, 'Field implements interface.');
  $this
    ->assertTrue($entity->field_test[0] instanceof FieldItemInterface, 'Field item implements interface.');
  $this
    ->assertEqual($entity->field_test->uri, $parsed_url['path']);
  $this
    ->assertEqual($entity->field_test[0]->uri, $parsed_url['path']);
  $this
    ->assertEqual($entity->field_test->title, $title);
  $this
    ->assertEqual($entity->field_test[0]->title, $title);
  $this
    ->assertEqual($entity->field_test->options['attributes']['class'], $class);
  $this
    ->assertEqual($entity->field_test->options['query'], $parsed_url['query']);

  // Update only the entity name property to check if the link field data will
  // remain intact.
  $entity->name->value = $this
    ->randomMachineName();
  $entity
    ->save();
  $id = $entity
    ->id();
  $entity = entity_load('entity_test', $id);
  $this
    ->assertEqual($entity->field_test->uri, $parsed_url['path']);
  $this
    ->assertEqual($entity->field_test->options['attributes']['class'], $class);
  $this
    ->assertEqual($entity->field_test->options['query'], $parsed_url['query']);

  // Verify changing the field value.
  $new_url = 'https://www.drupal.org';
  $new_title = $this
    ->randomMachineName();
  $new_class = $this
    ->randomMachineName();
  $entity->field_test->uri = $new_url;
  $entity->field_test->title = $new_title;
  $entity->field_test
    ->first()
    ->get('options')
    ->set('query', NULL);
  $entity->field_test
    ->first()
    ->get('options')
    ->set('attributes', array(
    'class' => $new_class,
  ));
  $this
    ->assertEqual($entity->field_test->uri, $new_url);
  $this
    ->assertEqual($entity->field_test->title, $new_title);
  $this
    ->assertEqual($entity->field_test->options['attributes']['class'], $new_class);
  $this
    ->assertNull($entity->field_test->options['query']);

  // Read changed entity and assert changed values.
  $entity
    ->save();
  $entity = entity_load('entity_test', $id);
  $this
    ->assertEqual($entity->field_test->uri, $new_url);
  $this
    ->assertEqual($entity->field_test->title, $new_title);
  $this
    ->assertEqual($entity->field_test->options['attributes']['class'], $new_class);

  // Check that if we only set uri the default values for title and options
  // are also initialized.
  $entity->field_test = [
    'uri' => 'internal:/node/add',
  ];
  $this
    ->assertEqual($entity->field_test->uri, 'internal:/node/add');
  $this
    ->assertNull($entity->field_test->title);
  $this
    ->assertIdentical($entity->field_test->options, []);

  // Check that if set uri and serialize options then the default values are
  // properly initialized.
  $entity->field_test = [
    'uri' => 'internal:/node/add',
    'options' => serialize([
      'query' => NULL,
    ]),
  ];
  $this
    ->assertEqual($entity->field_test->uri, 'internal:/node/add');
  $this
    ->assertNull($entity->field_test->title);
  $this
    ->assertNull($entity->field_test->options['query']);

  // Check that if we set the direct value of link field it correctly set the
  // uri and the default values of the field.
  $entity->field_test = 'internal:/node/add';
  $this
    ->assertEqual($entity->field_test->uri, 'internal:/node/add');
  $this
    ->assertNull($entity->field_test->title);
  $this
    ->assertIdentical($entity->field_test->options, []);

  // Check that setting LinkItem value NULL doesn't generate any error or
  // warning.
  $entity->field_test[0] = NULL;
  $this
    ->assertNull($entity->field_test[0]
    ->getValue());

  // Test the generateSampleValue() method for generic, external, and internal
  // link types.
  $entity = entity_create('entity_test');
  $entity->field_test
    ->generateSampleItems();
  $entity->field_test_external
    ->generateSampleItems();
  $entity->field_test_internal
    ->generateSampleItems();
  $this
    ->entityValidateAndSave($entity);
}