You are here

public function ViewsCacheabilityMetadataExportTest::testViewExport in Search API 8

Tests that an exported view contains the right cacheability metadata.

File

tests/src/Kernel/Views/ViewsCacheabilityMetadataExportTest.php, line 105

Class

ViewsCacheabilityMetadataExportTest
Tests that cacheability metadata is included when Views config is exported.

Namespace

Drupal\Tests\search_api\Kernel\Views

Code

public function testViewExport() {
  $expected_cacheability_metadata = [
    'contexts' => [
      // Search API uses the core EntityFieldRenderer for rendering content.
      // This has support for translatable content, so the result varies by
      // content language.
      // @see \Drupal\views\Entity\Render\EntityFieldRenderer::getCacheContexts()
      'languages:language_content',
      // By default, Views always adds the interface language cache context
      // since it is very likely that there will be translatable strings in
      // the result.
      // @see \Drupal\views\Entity\View::addCacheMetadata()
      'languages:language_interface',
      // Our test view has a pager so we expect it to vary by query arguments.
      // @see \Drupal\views\Plugin\views\pager\SqlBase::getCacheContexts()
      'url.query_args',
      // The test view is a listing of nodes returned as a search result. It
      // is expected to have the list cache contexts of the node entity type.
      // This is defined in the "list_cache_contexts" key of the node entity
      // annotation.
      'user.node_grants:view',
    ],
    'tags' => [
      // Our test view depends on the search index, so whenever the index
      // configuration changes the cached results should be invalidated.
      // @see \Drupal\search_api\Query\Query::getCacheTags()
      'config:search_api.index.test_node_index',
    ],
    // By default the result is permanently cached.
    'max-age' => -1,
  ];

  // Check that our test view has the expected cacheability metadata.
  $view = $this
    ->getView();
  $this
    ->assertViewCacheabilityMetadata($expected_cacheability_metadata, $view);

  // For efficiency Views calculates the cacheability metadata whenever a view
  // is saved, and includes it in the exported configuration.
  // @see \Drupal\views\Entity\View::addCacheMetadata()
  // Check that the exported configuration contains the expected metadata.
  $view_config = $this
    ->config('views.view.' . self::TEST_VIEW_ID);
  $this
    ->assertViewConfigCacheabilityMetadata($expected_cacheability_metadata, $view_config);

  // Test that modules are able to alter the cacheability metadata. Our test
  // hook implementation will alter all 3 types of metadata.
  // @see search_api_test_views_search_api_query_alter()
  $expected_cacheability_metadata['contexts'][] = 'search_api_test_context';
  $expected_cacheability_metadata['tags'][] = 'search_api:test_tag';
  $expected_cacheability_metadata['max-age'] = 100;

  // Activate the alter hook and resave the view so it will recalculate the
  // cacheability metadata.
  $this->state
    ->set('search_api_test_views.alter_query_cacheability_metadata', TRUE);
  $view = $this
    ->getView();
  $view
    ->save();

  // Check that the altered metadata is now present in the view and the
  // configuration.
  $view = $this
    ->getView();
  $this
    ->assertViewCacheabilityMetadata($expected_cacheability_metadata, $view);
  $view_config = $this
    ->config('views.view.' . self::TEST_VIEW_ID);
  $this
    ->assertViewConfigCacheabilityMetadata($expected_cacheability_metadata, $view_config);
}