3 namespace Drupal\Tests\serialization\Unit\Normalizer;
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;
12 * @coversDefaultClass \Drupal\serialization\Normalizer\ContentEntityNormalizer
13 * @group serialization
15 class ContentEntityNormalizerTest extends UnitTestCase {
18 * The mock entity manager.
20 * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
22 protected $entityManager;
25 * The mock serializer.
27 * @var \Symfony\Component\Serializer\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
29 protected $serializer;
32 * The normalizer under test.
34 * @var \Drupal\serialization\Normalizer\ContentEntityNormalizer
36 protected $contentEntityNormalizer;
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'])
48 $this->contentEntityNormalizer->setSerializer($this->serializer);
52 * @covers ::supportsNormalization
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));
62 * Tests the normalize() method.
66 public function testNormalize() {
67 $this->serializer->expects($this->any())
69 ->with($this->containsOnlyInstancesOf('Drupal\Core\Field\FieldItemListInterface'), 'test_format', ['account' => NULL])
70 ->will($this->returnValue('test'));
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),
78 $content_entity_mock = $this->createMockForContentEntity($definitions);
80 $normalized = $this->contentEntityNormalizer->normalize($content_entity_mock, 'test_format');
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);
90 * Tests the normalize() method with account context passed.
94 public function testNormalizeWithAccountContext() {
95 $mock_account = $this->getMock('Drupal\Core\Session\AccountInterface');
98 'account' => $mock_account,
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'));
106 // The mock account should get passed directly into the access() method on
107 // field items from $context['account'].
109 'field_1' => $this->createMockFieldListItem(TRUE, FALSE, $mock_account),
110 'field_2' => $this->createMockFieldListItem(FALSE, FALSE, $mock_account),
112 $content_entity_mock = $this->createMockForContentEntity($definitions);
114 $normalized = $this->contentEntityNormalizer->normalize($content_entity_mock, 'test_format', $context);
116 $this->assertArrayHasKey('field_1', $normalized);
117 $this->assertEquals('test', $normalized['field_1']);
118 $this->assertArrayNotHasKey('field_2', $normalized);
122 * Creates a mock content entity.
124 * @param $definitions
126 * @return \PHPUnit_Framework_MockObject_MockObject
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)
137 $content_entity_mock->expects($this->any())
138 ->method('getTypedData')
139 ->will($this->returnValue($typed_data->reveal()));
141 return $content_entity_mock;
145 * Creates a mock field list item.
147 * @param bool $access
148 * @param bool $internal
149 * @param \Drupal\Core\Session\AccountInterface $user_context
151 * @return \Drupal\Core\Field\FieldItemListInterface|\PHPUnit_Framework_MockObject_MockObject
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)
163 $mock->expects($this->once())
165 ->with('view', $user_context)
166 ->will($this->returnValue($access));