function StyleSerializerTest::testSerializerResponses

Same name in other branches
  1. 9 core/modules/rest/tests/src/Functional/Views/StyleSerializerTest.php \Drupal\Tests\rest\Functional\Views\StyleSerializerTest::testSerializerResponses()
  2. 9 core/modules/hal/tests/src/Functional/rest/Views/StyleSerializerTest.php \Drupal\Tests\hal\Functional\rest\Views\StyleSerializerTest::testSerializerResponses()

Checks the behavior of the Serializer callback paths and row plugins.

File

core/modules/rest/tests/src/Functional/Views/StyleSerializerTest.php, line 130

Class

StyleSerializerTest
Tests the serializer style plugin.

Namespace

Drupal\Tests\rest\Functional\Views

Code

public function testSerializerResponses() {
    // Test the serialize callback.
    $view = Views::getView('test_serializer_display_field');
    $view->initDisplay();
    $this->executeView($view);
    $actual_json = $this->drupalGet('test/serialize/field', [
        'query' => [
            '_format' => 'json',
        ],
    ]);
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertCacheTags($view->getCacheTags());
    $this->assertCacheContexts([
        'languages:language_interface',
        'theme',
        'request_format',
    ]);
    // @todo Due to https://www.drupal.org/node/2352009 we can't yet test the
    // propagation of cache max-age.
    // Test the http Content-type.
    $headers = $this->getSession()
        ->getResponseHeaders();
    $this->assertSame([
        'application/json',
    ], $headers['Content-Type']);
    $expected = [];
    foreach ($view->result as $row) {
        $expected_row = [];
        foreach ($view->field as $id => $field) {
            $expected_row[$id] = $field->render($row);
        }
        $expected[] = $expected_row;
    }
    $this->assertIdentical($actual_json, json_encode($expected), 'The expected JSON output was found.');
    // Test that the rendered output and the preview output are the same.
    $view->destroy();
    $view->setDisplay('rest_export_1');
    // Mock the request content type by setting it on the display handler.
    $view->display_handler
        ->setContentType('json');
    $output = $view->preview();
    $this->assertIdentical($actual_json, (string) $this->renderer
        ->renderRoot($output), 'The expected JSON preview output was found.');
    // Test a 403 callback.
    $this->drupalGet('test/serialize/denied', [
        'query' => [
            '_format' => 'json',
        ],
    ]);
    $this->assertSession()
        ->statusCodeEquals(403);
    // Test the entity rows.
    $view = Views::getView('test_serializer_display_entity');
    $view->initDisplay();
    $this->executeView($view);
    // Get the serializer service.
    $serializer = $this->container
        ->get('serializer');
    $entities = [];
    foreach ($view->result as $row) {
        $entities[] = $row->_entity;
    }
    $expected = $serializer->serialize($entities, 'json');
    $actual_json = $this->drupalGet('test/serialize/entity', [
        'query' => [
            '_format' => 'json',
        ],
    ]);
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertIdentical($actual_json, $expected, 'The expected JSON output was found.');
    $expected_cache_tags = $view->getCacheTags();
    $expected_cache_tags[] = 'entity_test_list';
    
    /** @var \Drupal\Core\Entity\EntityInterface $entity */
    foreach ($entities as $entity) {
        $expected_cache_tags = Cache::mergeTags($expected_cache_tags, $entity->getCacheTags());
    }
    $this->assertCacheTags($expected_cache_tags);
    $this->assertCacheContexts([
        'languages:language_interface',
        'theme',
        'entity_test_view_grants',
        'request_format',
    ]);
    $expected = $serializer->serialize($entities, 'hal_json');
    $actual_json = $this->drupalGet('test/serialize/entity', [
        'query' => [
            '_format' => 'hal_json',
        ],
    ]);
    $this->assertIdentical($actual_json, $expected, 'The expected HAL output was found.');
    $this->assertCacheTags($expected_cache_tags);
    // Change the format to xml.
    $view->setDisplay('rest_export_1');
    $view->getDisplay()
        ->setOption('style', [
        'type' => 'serializer',
        'options' => [
            'uses_fields' => FALSE,
            'formats' => [
                'xml' => 'xml',
            ],
        ],
    ]);
    $view->save();
    $expected = $serializer->serialize($entities, 'xml');
    $actual_xml = $this->drupalGet('test/serialize/entity', [
        'query' => [
            '_format' => 'xml',
        ],
    ]);
    $this->assertSame(trim($expected), $actual_xml);
    $this->assertCacheContexts([
        'languages:language_interface',
        'theme',
        'entity_test_view_grants',
        'request_format',
    ]);
    // Allow multiple formats.
    $view->setDisplay('rest_export_1');
    $view->getDisplay()
        ->setOption('style', [
        'type' => 'serializer',
        'options' => [
            'uses_fields' => FALSE,
            'formats' => [
                'xml' => 'xml',
                'json' => 'json',
            ],
        ],
    ]);
    $view->save();
    $expected = $serializer->serialize($entities, 'json');
    $actual_json = $this->drupalGet('test/serialize/entity', [
        'query' => [
            '_format' => 'json',
        ],
    ]);
    $this->assertIdentical($actual_json, $expected, 'The expected JSON output was found.');
    $expected = $serializer->serialize($entities, 'xml');
    $actual_xml = $this->drupalGet('test/serialize/entity', [
        'query' => [
            '_format' => 'xml',
        ],
    ]);
    $this->assertSame(trim($expected), $actual_xml);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.