e5d02fae74d87bb5a0833d8c9a2fb4e5b954ba0c
[yaffs-website] / web / core / modules / serialization / tests / src / Unit / Normalizer / ContentEntityNormalizerTest.php
1 <?php
2
3 namespace Drupal\Tests\serialization\Unit\Normalizer;
4
5 use Drupal\Core\Session\AccountInterface;
6 use Drupal\Core\TypedData\ComplexDataInterface;
7 use Drupal\Core\TypedData\DataDefinitionInterface;
8 use Drupal\serialization\Normalizer\ContentEntityNormalizer;
9 use Drupal\Tests\UnitTestCase;
10
11 /**
12  * @coversDefaultClass \Drupal\serialization\Normalizer\ContentEntityNormalizer
13  * @group serialization
14  */
15 class ContentEntityNormalizerTest extends UnitTestCase {
16
17   /**
18    * The mock entity manager.
19    *
20    * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
21    */
22   protected $entityManager;
23
24   /**
25    * The mock serializer.
26    *
27    * @var \Symfony\Component\Serializer\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
28    */
29   protected $serializer;
30
31   /**
32    * The normalizer under test.
33    *
34    * @var \Drupal\serialization\Normalizer\ContentEntityNormalizer
35    */
36   protected $contentEntityNormalizer;
37
38   /**
39    * {@inheritdoc}
40    */
41   protected function setUp() {
42     $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
43     $this->contentEntityNormalizer = new ContentEntityNormalizer($this->entityManager);
44     $this->serializer = $this->getMockBuilder('Symfony\Component\Serializer\Serializer')
45       ->disableOriginalConstructor()
46       ->setMethods(['normalize'])
47       ->getMock();
48     $this->contentEntityNormalizer->setSerializer($this->serializer);
49   }
50
51   /**
52    * @covers ::supportsNormalization
53    */
54   public function testSupportsNormalization() {
55     $content_mock = $this->getMock('Drupal\Core\Entity\ContentEntityInterface');
56     $config_mock = $this->getMock('Drupal\Core\Entity\ConfigEntityInterface');
57     $this->assertTrue($this->contentEntityNormalizer->supportsNormalization($content_mock));
58     $this->assertFalse($this->contentEntityNormalizer->supportsNormalization($config_mock));
59   }
60
61   /**
62    * Tests the normalize() method.
63    *
64    * @covers ::normalize
65    */
66   public function testNormalize() {
67     $this->serializer->expects($this->any())
68       ->method('normalize')
69       ->with($this->containsOnlyInstancesOf('Drupal\Core\Field\FieldItemListInterface'), 'test_format', ['account' => NULL])
70       ->will($this->returnValue('test'));
71
72     $definitions = [
73       'field_accessible_external' => $this->createMockFieldListItem(TRUE, FALSE),
74       'field_non-accessible_external' => $this->createMockFieldListItem(FALSE, FALSE),
75       'field_accessible_internal' => $this->createMockFieldListItem(TRUE, TRUE),
76       'field_non-accessible_internal' => $this->createMockFieldListItem(FALSE, TRUE),
77     ];
78     $content_entity_mock = $this->createMockForContentEntity($definitions);
79
80     $normalized = $this->contentEntityNormalizer->normalize($content_entity_mock, 'test_format');
81
82     $this->assertArrayHasKey('field_accessible_external', $normalized);
83     $this->assertEquals('test', $normalized['field_accessible_external']);
84     $this->assertArrayNotHasKey('field_non-accessible_external', $normalized);
85     $this->assertArrayNotHasKey('field_accessible_internal', $normalized);
86     $this->assertArrayNotHasKey('field_non-accessible_internal', $normalized);
87   }
88
89   /**
90    * Tests the normalize() method with account context passed.
91    *
92    * @covers ::normalize
93    */
94   public function testNormalizeWithAccountContext() {
95     $mock_account = $this->getMock('Drupal\Core\Session\AccountInterface');
96
97     $context = [
98       'account' => $mock_account,
99     ];
100
101     $this->serializer->expects($this->any())
102       ->method('normalize')
103       ->with($this->containsOnlyInstancesOf('Drupal\Core\Field\FieldItemListInterface'), 'test_format', $context)
104       ->will($this->returnValue('test'));
105
106     // The mock account should get passed directly into the access() method on
107     // field items from $context['account'].
108     $definitions = [
109       'field_1' => $this->createMockFieldListItem(TRUE, FALSE, $mock_account),
110       'field_2' => $this->createMockFieldListItem(FALSE, FALSE, $mock_account),
111     ];
112     $content_entity_mock = $this->createMockForContentEntity($definitions);
113
114     $normalized = $this->contentEntityNormalizer->normalize($content_entity_mock, 'test_format', $context);
115
116     $this->assertArrayHasKey('field_1', $normalized);
117     $this->assertEquals('test', $normalized['field_1']);
118     $this->assertArrayNotHasKey('field_2', $normalized);
119   }
120
121   /**
122    * Creates a mock content entity.
123    *
124    * @param $definitions
125    *
126    * @return \PHPUnit_Framework_MockObject_MockObject
127    */
128   public function createMockForContentEntity($definitions) {
129     $content_entity_mock = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
130       ->disableOriginalConstructor()
131       ->setMethods(['getTypedData'])
132       ->getMockForAbstractClass();
133     $typed_data = $this->prophesize(ComplexDataInterface::class);
134     $typed_data->getProperties(TRUE)
135       ->willReturn($definitions)
136       ->shouldBeCalled();
137     $content_entity_mock->expects($this->any())
138       ->method('getTypedData')
139       ->will($this->returnValue($typed_data->reveal()));
140
141     return $content_entity_mock;
142   }
143
144   /**
145    * Creates a mock field list item.
146    *
147    * @param bool $access
148    * @param bool $internal
149    * @param \Drupal\Core\Session\AccountInterface $user_context
150    *
151    * @return \Drupal\Core\Field\FieldItemListInterface|\PHPUnit_Framework_MockObject_MockObject
152    */
153   protected function createMockFieldListItem($access, $internal, AccountInterface $user_context = NULL) {
154     $data_definition = $this->prophesize(DataDefinitionInterface::class);
155     $mock = $this->getMock('Drupal\Core\Field\FieldItemListInterface');
156     $mock->expects($this->once())
157       ->method('getDataDefinition')
158       ->will($this->returnValue($data_definition->reveal()));
159     $data_definition->isInternal()
160       ->willReturn($internal)
161       ->shouldBeCalled();
162     if (!$internal) {
163       $mock->expects($this->once())
164         ->method('access')
165         ->with('view', $user_context)
166         ->will($this->returnValue($access));
167     }
168     return $mock;
169   }
170
171 }