Chris@17
|
1 <?php
|
Chris@17
|
2
|
Chris@17
|
3 namespace Drupal\Tests\link\Kernel;
|
Chris@17
|
4
|
Chris@17
|
5 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@17
|
6 use Drupal\field\Entity\FieldConfig;
|
Chris@17
|
7 use Drupal\link\LinkItemInterface;
|
Chris@17
|
8 use Drupal\entity_test\Entity\EntityTest;
|
Chris@17
|
9 use Drupal\Component\Utility\UrlHelper;
|
Chris@17
|
10 use Drupal\Tests\field\Kernel\FieldKernelTestBase;
|
Chris@17
|
11
|
Chris@17
|
12 /**
|
Chris@17
|
13 * Tests link field serialization.
|
Chris@17
|
14 *
|
Chris@17
|
15 * @group link
|
Chris@17
|
16 */
|
Chris@17
|
17 class LinkItemSerializationTest extends FieldKernelTestBase {
|
Chris@17
|
18
|
Chris@17
|
19 /**
|
Chris@17
|
20 * {@inheritdoc}
|
Chris@17
|
21 */
|
Chris@17
|
22 public static $modules = ['link', 'serialization'];
|
Chris@17
|
23
|
Chris@17
|
24 /**
|
Chris@17
|
25 * The serializer service.
|
Chris@17
|
26 *
|
Chris@17
|
27 * @var \Symfony\Component\Serializer\SerializerInterface
|
Chris@17
|
28 */
|
Chris@17
|
29 protected $serializer;
|
Chris@17
|
30
|
Chris@17
|
31 /**
|
Chris@17
|
32 * {@inheritdoc}
|
Chris@17
|
33 */
|
Chris@17
|
34 protected function setUp() {
|
Chris@17
|
35 parent::setUp();
|
Chris@17
|
36
|
Chris@17
|
37 $this->installEntitySchema('user');
|
Chris@17
|
38 $this->serializer = \Drupal::service('serializer');
|
Chris@17
|
39
|
Chris@17
|
40 // Create a generic, external, and internal link fields for validation.
|
Chris@17
|
41 FieldStorageConfig::create([
|
Chris@17
|
42 'entity_type' => 'entity_test',
|
Chris@17
|
43 'field_name' => 'field_test',
|
Chris@17
|
44 'type' => 'link',
|
Chris@17
|
45 ])->save();
|
Chris@17
|
46
|
Chris@17
|
47 FieldConfig::create([
|
Chris@17
|
48 'entity_type' => 'entity_test',
|
Chris@17
|
49 'field_name' => 'field_test',
|
Chris@17
|
50 'bundle' => 'entity_test',
|
Chris@17
|
51 'settings' => ['link_type' => LinkItemInterface::LINK_GENERIC],
|
Chris@17
|
52 ])->save();
|
Chris@17
|
53 }
|
Chris@17
|
54
|
Chris@17
|
55 /**
|
Chris@17
|
56 * Tests the serialization.
|
Chris@17
|
57 */
|
Chris@17
|
58 public function testLinkSerialization() {
|
Chris@17
|
59 // Create entity.
|
Chris@17
|
60 $entity = EntityTest::create();
|
Chris@17
|
61 $url = 'https://www.drupal.org?test_param=test_value';
|
Chris@17
|
62 $parsed_url = UrlHelper::parse($url);
|
Chris@17
|
63 $title = $this->randomMachineName();
|
Chris@17
|
64 $class = $this->randomMachineName();
|
Chris@17
|
65 $entity->field_test->uri = $parsed_url['path'];
|
Chris@17
|
66 $entity->field_test->title = $title;
|
Chris@17
|
67 $entity->field_test->first()
|
Chris@17
|
68 ->get('options')
|
Chris@17
|
69 ->set('query', $parsed_url['query']);
|
Chris@17
|
70 $entity->field_test->first()
|
Chris@17
|
71 ->get('options')
|
Chris@17
|
72 ->set('attributes', ['class' => $class]);
|
Chris@17
|
73 $entity->save();
|
Chris@17
|
74 $serialized = $this->serializer->serialize($entity, 'json');
|
Chris@17
|
75 $deserialized = $this->serializer->deserialize($serialized, EntityTest::class, 'json');
|
Chris@17
|
76 $options_expected = [
|
Chris@17
|
77 'query' => $parsed_url['query'],
|
Chris@17
|
78 'attributes' => ['class' => $class],
|
Chris@17
|
79 ];
|
Chris@17
|
80 $this->assertSame($options_expected, $deserialized->field_test->options);
|
Chris@17
|
81 }
|
Chris@17
|
82
|
Chris@18
|
83 /**
|
Chris@18
|
84 * Tests the deserialization.
|
Chris@18
|
85 */
|
Chris@18
|
86 public function testLinkDeserialization() {
|
Chris@18
|
87 // Create entity.
|
Chris@18
|
88 $entity = EntityTest::create();
|
Chris@18
|
89 $url = 'https://www.drupal.org?test_param=test_value';
|
Chris@18
|
90 $parsed_url = UrlHelper::parse($url);
|
Chris@18
|
91 $title = $this->randomMachineName();
|
Chris@18
|
92 $entity->field_test->uri = $parsed_url['path'];
|
Chris@18
|
93 $entity->field_test->title = $title;
|
Chris@18
|
94 $entity->field_test->first()
|
Chris@18
|
95 ->get('options')
|
Chris@18
|
96 ->set('query', $parsed_url['query']);
|
Chris@18
|
97 $json = json_decode($this->serializer->serialize($entity, 'json'), TRUE);
|
Chris@18
|
98 $json['field_test'][0]['options'] = 'string data';
|
Chris@18
|
99 $serialized = json_encode($json, TRUE);
|
Chris@18
|
100 $this->setExpectedException(\LogicException::class, 'The generic FieldItemNormalizer cannot denormalize string values for "options" properties of the "field_test" field (field item class: Drupal\link\Plugin\Field\FieldType\LinkItem).');
|
Chris@18
|
101 $this->serializer->deserialize($serialized, EntityTest::class, 'json');
|
Chris@18
|
102 }
|
Chris@18
|
103
|
Chris@17
|
104 }
|