--- /dev/null
+<?php
+
+namespace Drupal\Tests\rest\Functional\EntityResource\EntityTest;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\rest\Functional\AnonResourceTestTrait;
+
+/**
+ * @group rest
+ */
+class EntityTestTextItemNormalizerTest extends EntityTestResourceTestBase {
+
+ use AnonResourceTestTrait;
+
+ /**
+ * {@inheritdoc}
+ */
+ public static $modules = ['filter_test'];
+
+ /**
+ * {@inheritdoc}
+ */
+ protected static $format = 'json';
+
+ /**
+ * {@inheritdoc}
+ */
+ protected static $mimeType = 'application/json';
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUpAuthorization($method) {
+ parent::setUpAuthorization($method);
+ if (in_array($method, ['POST', 'PATCH'], TRUE)) {
+ $this->grantPermissionsToTestedRole(['use text format my_text_format']);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExpectedNormalizedEntity() {
+ $expected = parent::getExpectedNormalizedEntity();
+ $expected['field_test_text'] = [
+ [
+ 'value' => 'Cádiz is the oldest continuously inhabited city in Spain and a nice place to spend a Sunday with friends.',
+ 'format' => 'my_text_format',
+ 'processed' => '<p>Cádiz is the oldest continuously inhabited city in Spain and a nice place to spend a Sunday with friends.</p>' . "\n" . '<p>This is a dynamic llama.</p>',
+ ],
+ ];
+ return $expected;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function createEntity() {
+ $entity = parent::createEntity();
+ if (!FilterFormat::load('my_text_format')) {
+ FilterFormat::create([
+ 'format' => 'my_text_format',
+ 'name' => 'My Text Format',
+ 'filters' => [
+ 'filter_test_assets' => [
+ 'weight' => -1,
+ 'status' => TRUE,
+ ],
+ 'filter_test_cache_tags' => [
+ 'weight' => 0,
+ 'status' => TRUE,
+ ],
+ 'filter_test_cache_contexts' => [
+ 'weight' => 0,
+ 'status' => TRUE,
+ ],
+ 'filter_test_cache_merge' => [
+ 'weight' => 0,
+ 'status' => TRUE,
+ ],
+ 'filter_test_placeholders' => [
+ 'weight' => 1,
+ 'status' => TRUE,
+ ],
+ 'filter_autop' => [
+ 'status' => TRUE,
+ ],
+ ],
+ ])->save();
+ }
+ $entity->field_test_text = [
+ 'value' => 'Cádiz is the oldest continuously inhabited city in Spain and a nice place to spend a Sunday with friends.',
+ 'format' => 'my_text_format',
+ ];
+ $entity->save();
+ return $entity;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getNormalizedPostEntity() {
+ $post_entity = parent::getNormalizedPostEntity();
+ $post_entity['field_test_text'] = [
+ [
+ 'value' => 'Llamas are awesome.',
+ 'format' => 'my_text_format',
+ ],
+ ];
+ return $post_entity;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExpectedCacheTags() {
+ return Cache::mergeTags([
+ // The cache tag set by the processed_text element itself.
+ 'config:filter.format.my_text_format',
+ // The cache tags set by the filter_test_cache_tags filter.
+ 'foo:bar',
+ 'foo:baz',
+ // The cache tags set by the filter_test_cache_merge filter.
+ 'merge:tag'
+ ], parent::getExpectedCacheTags());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExpectedCacheContexts() {
+ return Cache::mergeContexts([
+ // The cache context set by the filter_test_cache_contexts filter.
+ 'languages:' . LanguageInterface::TYPE_CONTENT,
+ // The default cache contexts for Renderer.
+ 'languages:' . LanguageInterface::TYPE_INTERFACE,
+ 'theme',
+ // The cache tags set by the filter_test_cache_merge filter.
+ 'user.permissions',
+ ], parent::getExpectedCacheContexts());
+ }
+
+ /**
+ * Tests GETting an entity with the test text field set to a specific format.
+ *
+ * @dataProvider providerTestGetWithFormat
+ */
+ public function testGetWithFormat($text_format_id, array $expected_cache_tags) {
+ FilterFormat::create([
+ 'name' => 'Pablo Piccasso',
+ 'format' => 'pablo',
+ 'langcode' => 'es',
+ 'filters' => [],
+ ])->save();
+
+ // Set TextItemBase field's value for testing, using the given text format.
+ $value = [
+ 'value' => $this->randomString(),
+ ];
+ if ($text_format_id !== FALSE) {
+ $value['format'] = $text_format_id;
+ }
+ $this->entity->set('field_test_text', $value)->save();
+
+ $this->initAuthentication();
+ $url = $this->getEntityResourceUrl();
+ $url->setOption('query', ['_format' => static::$format]);
+ $request_options = $this->getAuthenticationRequestOptions('GET');
+ $this->provisionEntityResource();
+ $this->setUpAuthorization('GET');
+ $response = $this->request('GET', $url, $request_options);
+ $expected_cache_tags = Cache::mergeTags($expected_cache_tags, parent::getExpectedCacheTags());
+ $this->assertSame($expected_cache_tags, explode(' ', $response->getHeader('X-Drupal-Cache-Tags')[0]));
+ }
+
+ public function providerTestGetWithFormat() {
+ return [
+ 'format specified (different from fallback format)' => [
+ 'pablo',
+ ['config:filter.format.pablo'],
+ ],
+ 'format specified (happens to be the same as fallback format)' => [
+ 'plain_text',
+ ['config:filter.format.plain_text'],
+ ],
+ 'no format specified: fallback format used automatically' => [
+ FALSE,
+ ['config:filter.format.plain_text', 'config:filter.settings'],
+ ],
+ ];
+ }
+
+}