EntityOperationsCacheabilityTest.php

Same filename and directory in other branches
  1. 11.x core/modules/system/tests/src/Kernel/Entity/EntityOperationsCacheabilityTest.php

Namespace

Drupal\Tests\system\Kernel\Entity

File

core/modules/system/tests/src/Kernel/Entity/EntityOperationsCacheabilityTest.php

View source
<?php

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

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests cacheability added by entity operations.
 */
class EntityOperationsCacheabilityTest extends EntityKernelTestBase {
  
  /**
   * Test cacheability is added via entity operations functions and hooks.
   *
   * @see \Drupal\Core\Entity\EntityListBuilder::getOperations()
   * @see \Drupal\Core\Entity\EntityListBuilder::getDefaultOperations()
   * @see \Drupal\entity_test\Hook\EntityTestHooks::entityOperation()
   * @see \Drupal\entity_test\Hook\EntityTestHooks::entityOperationAlter()
   */
  public function testEntityOperationsCacheability(array $modules, string $entityType, array $properties, array $expectedTags, array $expectedContexts, bool $createBundle = FALSE, bool $setId = FALSE) : void {
    if ($entityType === 'block') {
      \Drupal::service('theme_installer')->install([
        'stark',
      ]);
    }
    elseif (str_contains($entityType, 'image')) {
      \Drupal::configFactory()->getEditable('system.image')
        ->set('toolkit', 'gd')
        ->save();
    }
    \Drupal::service('module_installer')->install($modules);
    $entityTypeManager = \Drupal::entityTypeManager();
    $storage = $entityTypeManager->getStorage($entityType);
    $entityTypeDef = $entityTypeManager->getDefinition($entityType);
    if ($createBundle) {
      $bundleType = $entityTypeDef->getBundleEntityType();
      $bundleTypeDef = $entityTypeManager->getDefinition($bundleType);
      $entityTypeManager->getStorage($bundleType)
        ->create([
        $bundleTypeDef->getKey('id') => 'test',
        $bundleTypeDef->getKey('label') => 'test',
      ])
        ->save();
    }
    if ($entityTypeDef->getKey('label')) {
      $properties += [
        $entityTypeDef->getKey('label') => 'Test entity',
      ];
    }
    if ($setId) {
      $properties += [
        $entityTypeDef->getKey('id') => 'test',
      ];
    }
    if ($createBundle) {
      $properties += [
        $entityTypeDef->getKey('bundle') => 'test',
      ];
    }
    $entity = $storage->create($properties);
    $entity->save();
    $listBuilder = $entityTypeManager->getListBuilder($entityType);
    $cacheability = new CacheableMetadata();
    $listBuilder->getOperations($entity, $cacheability);
    $this->assertSame($expectedTags, $cacheability->getCacheTags());
    $this->assertEquals($expectedContexts, $cacheability->getCacheContexts());
    $this->assertEquals(-1, $cacheability->getCacheMaxAge());
  }
  
  /**
   * Data provider for testEntityOperationsCacheability().
   */
  public static function providerEntityOperationsCacheability() : iterable {
    yield [
      [
        'entity_test',
      ],
      'entity_test',
      [],
      [
        'entity_test_operation_tag_test',
        'entity_test_operation_alter_tag_test',
      ],
      [
        'user.permissions',
      ],
    ];
    yield [
      [
        'block',
      ],
      'block',
      [
        'plugin' => 'broken',
        'theme' => 'stark',
        'settings' => [
          'label' => 'test',
        ],
      ],
      [
        'config:block_list',
      ],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'block_content',
      ],
      'block_content',
      [],
      [
        'block_content:1',
      ],
      [
        'user.permissions',
      ],
      TRUE,
    ];
    yield [
      [
        'comment',
      ],
      'comment_type',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'field_ui',
      ],
      'entity_view_mode',
      [
        'targetEntityType' => 'entity_test',
        'id' => 'entity_test.test',
      ],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'filter',
      ],
      'filter_format',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'image',
      ],
      'image_style',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'menu_link_content',
      ],
      'menu_link_content',
      [
        'link' => 'route:<nolink>',
      ],
      [],
      [
        'user.permissions',
      ],
    ];
    yield [
      [
        'menu_ui',
      ],
      'menu',
      [],
      [
        'config:system.menu.test',
      ],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'node',
      ],
      'node_type',
      [],
      [
        'config:node.type.test',
      ],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'responsive_image',
      ],
      'responsive_image_style',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'user',
        'search',
      ],
      'search_page',
      [
        'plugin' => 'user_search',
        'path' => '/test_user_search',
      ],
      [
        'config:search.page.test',
      ],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'shortcut',
      ],
      'shortcut_set',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'taxonomy',
      ],
      'taxonomy_vocabulary',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'user',
      ],
      'user_role',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'user',
      ],
      'user',
      [
        'name' => 'test',
      ],
      [],
      [
        'user',
        'user.permissions',
      ],
    ];
    yield [
      [
        'views_ui',
      ],
      'view',
      [],
      [],
      [
        'user.permissions',
      ],
      FALSE,
      TRUE,
    ];
    yield [
      [
        'workspaces_ui',
      ],
      'workspace',
      [],
      [],
      [
        'user.permissions',
        'workspace',
      ],
      FALSE,
      TRUE,
    ];
  }

}

Classes

Title Deprecated Summary
EntityOperationsCacheabilityTest Tests cacheability added by entity operations.

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