function RendererTest::testRenderCacheProperties

Same name and namespace in other branches
  1. 9 core/tests/Drupal/Tests/Core/Render/RendererTest.php \Drupal\Tests\Core\Render\RendererTest::testRenderCacheProperties()
  2. 10 core/tests/Drupal/Tests/Core/Render/RendererTest.php \Drupal\Tests\Core\Render\RendererTest::testRenderCacheProperties()
  3. 11.x core/tests/Drupal/Tests/Core/Render/RendererTest.php \Drupal\Tests\Core\Render\RendererTest::testRenderCacheProperties()

Tests that #cache_properties are properly handled.

@covers ::render @covers ::doRender @covers \Drupal\Core\Render\RenderCache::get @covers \Drupal\Core\Render\RenderCache::set @covers \Drupal\Core\Render\RenderCache::createCacheID @covers \Drupal\Core\Render\RenderCache::getCacheableRenderArray

@dataProvider providerTestRenderCacheProperties

Parameters

array $expected_results: An associative array of expected results keyed by property name.

File

core/tests/Drupal/Tests/Core/Render/RendererTest.php, line 899

Class

RendererTest
@coversDefaultClass <a href="/api/drupal/core%21lib%21Drupal%21Core%21Render%21Renderer.php/class/Renderer/8.9.x" title="Turns a render array into a HTML string." class="local">\Drupal\Core\Render\Renderer</a> @group Render

Namespace

Drupal\Tests\Core\Render

Code

public function testRenderCacheProperties(array $expected_results) {
    $this->setUpRequest();
    $this->setupMemoryCache();
    $element = $original = [
        '#cache' => [
            'keys' => [
                'render_cache_test',
            ],
        ],
        // Collect expected property names.
'#cache_properties' => array_keys(array_filter($expected_results)),
        'child1' => [
            '#markup' => Markup::create('1'),
        ],
        'child2' => [
            '#markup' => Markup::create('2'),
        ],
        // Mark the value as safe.
'#custom_property' => Markup::create('custom_value'),
        '#custom_property_array' => [
            'custom value',
        ],
    ];
    $this->renderer
        ->renderRoot($element);
    $cache = $this->cacheFactory
        ->get('render');
    $data = $cache->get('render_cache_test:en:stark')->data;
    // Check that parent markup is ignored when caching children's markup.
    $this->assertEquals($data['#markup'] === '', (bool) Element::children($data));
    // Check that the element properties are cached as specified.
    foreach ($expected_results as $property => $expected) {
        $cached = !empty($data[$property]);
        $this->assertEquals($cached, (bool) $expected);
        // Check that only the #markup key is preserved for children.
        if ($cached) {
            $this->assertEquals($data[$property], $original[$property]);
        }
    }
    // #custom_property_array can not be a safe_cache_property.
    $safe_cache_properties = array_diff(Element::properties(array_filter($expected_results)), [
        '#custom_property_array',
    ]);
    foreach ($safe_cache_properties as $cache_property) {
        $this->assertInstanceOf(MarkupInterface::class, $data[$cache_property]);
    }
}

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