EntityWithUriCacheTagsTestBase.php

Same filename and directory in other branches
  1. 9 core/modules/system/tests/src/Functional/Entity/EntityWithUriCacheTagsTestBase.php
  2. 8.9.x core/modules/system/src/Tests/Entity/EntityWithUriCacheTagsTestBase.php
  3. 8.9.x core/modules/system/tests/src/Functional/Entity/EntityWithUriCacheTagsTestBase.php
  4. 11.x core/modules/system/tests/src/Functional/Entity/EntityWithUriCacheTagsTestBase.php

Namespace

Drupal\Tests\system\Functional\Entity

File

core/modules/system/tests/src/Functional/Entity/EntityWithUriCacheTagsTestBase.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\system\Functional\Entity;

use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Language\LanguageInterface;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\Entity\FieldConfig;

/**
 * Provides helper methods for Entity cache tags tests; for entities with URIs.
 */
abstract class EntityWithUriCacheTagsTestBase extends EntityCacheTagsTestBase {
  
  /**
   * Tests cache tags presence and invalidation of the entity at its URI.
   *
   * Tests the following cache tags:
   * - "<entity type>_view"
   * - "<entity_type>:<entity ID>"
   */
  public function testEntityUri() : void {
    $entity_url = $this->entity
      ->toUrl();
    $entity_type = $this->entity
      ->getEntityTypeId();
    // Selects the view mode that will be used.
    $view_mode = $this->selectViewMode($entity_type);
    // The default cache contexts for rendered entities.
    $entity_cache_contexts = $this->getDefaultCacheContexts();
    // Generate the standardized entity cache tags.
    $cache_tag = $this->entity
      ->getCacheTags();
    $view_cache_tag = \Drupal::entityTypeManager()->getViewBuilder($entity_type)
      ->getCacheTags();
    $render_cache_tag = 'rendered';
    $this->verifyPageCache($entity_url, 'MISS');
    // Verify a cache hit, but also the presence of the correct cache tags.
    $this->verifyPageCache($entity_url, 'HIT');
    // Also verify the existence of an entity render cache entry, if this entity
    // type supports render caching.
    if (\Drupal::entityTypeManager()->getDefinition($entity_type)
      ->isRenderCacheable()) {
      $cache_keys = [
        'entity_view',
        $entity_type,
        $this->entity
          ->id(),
        $view_mode,
      ];
      $expected_cache_tags = Cache::mergeTags($cache_tag, $view_cache_tag);
      $expected_cache_tags = Cache::mergeTags($expected_cache_tags, $this->getAdditionalCacheTagsForEntity($this->entity));
      $expected_cache_tags = Cache::mergeTags($expected_cache_tags, [
        $render_cache_tag,
      ]);
      $this->verifyRenderCache($cache_keys, $expected_cache_tags, (new CacheableMetadata())->setCacheContexts($entity_cache_contexts));
    }
    // Verify that after modifying the entity, there is a cache miss.
    $this->entity
      ->save();
    $this->verifyPageCache($entity_url, 'MISS');
    // Verify a cache hit.
    $this->verifyPageCache($entity_url, 'HIT');
    // Verify that after modifying the entity's display, there is a cache miss.
    $entity_display = \Drupal::service('entity_display.repository')->getViewDisplay($entity_type, $this->entity
      ->bundle(), $view_mode);
    $entity_display->save();
    $this->verifyPageCache($entity_url, 'MISS');
    // Verify a cache hit.
    $this->verifyPageCache($entity_url, 'HIT');
    if ($bundle_entity_type_id = $this->entity
      ->getEntityType()
      ->getBundleEntityType()) {
      // Verify that after modifying the corresponding bundle entity, there is a
      // cache miss.
      $bundle_entity = $this->container
        ->get('entity_type.manager')
        ->getStorage($bundle_entity_type_id)
        ->load($this->entity
        ->bundle());
      $bundle_entity->save();
      $this->verifyPageCache($entity_url, 'MISS');
      // Verify a cache hit.
      $this->verifyPageCache($entity_url, 'HIT');
    }
    if ($this->entity
      ->getEntityType()
      ->get('field_ui_base_route')) {
      // Verify that after modifying a configurable field on the entity, there
      // is a cache miss.
      $field_storage_name = $this->entity
        ->getEntityTypeId() . '.configurable_field';
      $field_storage = FieldStorageConfig::load($field_storage_name);
      $field_storage->save();
      $this->verifyPageCache($entity_url, 'MISS');
      // Verify a cache hit.
      $this->verifyPageCache($entity_url, 'HIT');
      // Verify that after modifying a configurable field on the entity, there
      // is a cache miss.
      $field_name = $this->entity
        ->getEntityTypeId() . '.' . $this->entity
        ->bundle() . '.configurable_field';
      $field = FieldConfig::load($field_name);
      $field->save();
      $this->verifyPageCache($entity_url, 'MISS');
      // Verify a cache hit.
      $this->verifyPageCache($entity_url, 'HIT');
    }
    // Verify that after invalidating the entity's cache tag directly, there is
    // a cache miss.
    Cache::invalidateTags($this->entity
      ->getCacheTagsToInvalidate());
    $this->verifyPageCache($entity_url, 'MISS');
    // Verify a cache hit.
    $this->verifyPageCache($entity_url, 'HIT');
    // Verify that after invalidating the generic entity type's view cache tag
    // directly, there is a cache miss.
    Cache::invalidateTags($view_cache_tag);
    $this->verifyPageCache($entity_url, 'MISS');
    // Verify a cache hit.
    $this->verifyPageCache($entity_url, 'HIT');
    // Verify that after deleting the entity, there is a cache miss.
    $this->entity
      ->delete();
    $this->verifyPageCache($entity_url, 'MISS');
    $this->assertSession()
      ->statusCodeEquals(404);
  }
  
  /**
   * Gets the default cache contexts for rendered entities.
   *
   * @return array
   *   The default cache contexts for rendered entities.
   */
  protected function getDefaultCacheContexts() {
    // For url.site, see
    // \Drupal\Core\Entity\Controller\EntityViewController::view().
    return [
      'languages:' . LanguageInterface::TYPE_INTERFACE,
      'theme',
      'user.permissions',
      'url.site',
    ];
  }

}

Classes

Title Deprecated Summary
EntityWithUriCacheTagsTestBase Provides helper methods for Entity cache tags tests; for entities with URIs.

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