Issue #2779807 by jhedstrom: Bring RestExport::buildResponse into line with Feed::buildResponse
parent
4221911a94
commit
2a43f31fb7
|
@ -353,12 +353,17 @@ class RestExport extends PathPluginBase implements ResponseDisplayPluginInterfac
|
|||
public static function buildResponse($view_id, $display_id, array $args = []) {
|
||||
$build = static::buildBasicRenderable($view_id, $display_id, $args);
|
||||
|
||||
// Setup an empty response so headers can be added as needed during views
|
||||
// rendering and processing.
|
||||
$response = new CacheableResponse('', 200);
|
||||
$build['#response'] = $response;
|
||||
|
||||
/** @var \Drupal\Core\Render\RendererInterface $renderer */
|
||||
$renderer = \Drupal::service('renderer');
|
||||
|
||||
$output = $renderer->renderRoot($build);
|
||||
$output = (string) $renderer->renderRoot($build);
|
||||
|
||||
$response = new CacheableResponse($output, 200);
|
||||
$response->setContent($output);
|
||||
$cache_metadata = CacheableMetadata::createFromRenderArray($build);
|
||||
$response->addCacheableDependency($cache_metadata);
|
||||
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Test hook implementations for the REST views test module.
|
||||
*/
|
||||
|
||||
use Drupal\views\ViewExecutable;
|
||||
|
||||
/**
|
||||
* Implements hook_views_post_execute().
|
||||
*/
|
||||
function rest_test_views_views_post_execute(ViewExecutable $view) {
|
||||
// Attach a custom header to the test_data_export view.
|
||||
if ($view->id() === 'test_serializer_display_entity') {
|
||||
if ($value = \Drupal::state()->get('rest_test_views_set_header', FALSE)) {
|
||||
$view->getResponse()->headers->set('Custom-Header', $value);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\rest\Kernel\Views;
|
||||
|
||||
use Drupal\rest\Plugin\views\display\RestExport;
|
||||
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
|
||||
use Drupal\views\Entity\View;
|
||||
use Drupal\views\Tests\ViewTestData;
|
||||
|
||||
/**
|
||||
* Tests the REST export view display plugin.
|
||||
*
|
||||
* @coversDefaultClass \Drupal\rest\Plugin\views\display\RestExport
|
||||
*
|
||||
* @group rest
|
||||
*/
|
||||
class RestExportTest extends ViewsKernelTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $testViews = ['test_serializer_display_entity'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['rest_test_views', 'serialization', 'rest', 'entity_test'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp($import_test_views = TRUE) {
|
||||
parent::setUp($import_test_views);
|
||||
|
||||
ViewTestData::createTestViews(get_class($this), ['rest_test_views']);
|
||||
$this->installEntitySchema('entity_test');
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::buildResponse
|
||||
*/
|
||||
public function testBuildResponse() {
|
||||
/** @var \Drupal\views\Entity\View $view */
|
||||
$view = View::load('test_serializer_display_entity');
|
||||
$display = &$view->getDisplay('rest_export_1');
|
||||
|
||||
$display['display_options']['defaults']['style'] = FALSE;
|
||||
$display['display_options']['style']['type'] = 'serializer';
|
||||
$display['display_options']['style']['options']['formats'] = ['json', 'xml'];
|
||||
$view->save();
|
||||
|
||||
// No custom header should be set yet.
|
||||
$response = RestExport::buildResponse('test_serializer_display_entity', 'rest_export_1', []);
|
||||
$this->assertFalse($response->headers->get('Custom-Header'));
|
||||
|
||||
// Clear render cache.
|
||||
/** @var \Drupal\Core\Cache\MemoryBackend $render_cache */
|
||||
$render_cache = $this->container->get('cache_factory')->get('render');
|
||||
$render_cache->deleteAll();
|
||||
|
||||
// A custom header should now be added.
|
||||
// @see rest_test_views_views_post_execute()
|
||||
$header = $this->randomString();
|
||||
$this->container->get('state')->set('rest_test_views_set_header', $header);
|
||||
$response = RestExport::buildResponse('test_serializer_display_entity', 'rest_export_1', []);
|
||||
$this->assertEquals($header, $response->headers->get('Custom-Header'));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue