field_encrypt-8.x-2.x-dev/tests/src/Functional/CacheTest.php

tests/src/Functional/CacheTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\field_encrypt\Functional;

use Drupal\dynamic_page_cache\EventSubscriber\DynamicPageCacheSubscriber;
use Drupal\field\Entity\FieldStorageConfig;

/**
 * Tests field encryption caching.
 *
 * @group field_encrypt
 */
class CacheTest extends FieldEncryptTestBase {

  /**
   * Modules to enable for this test.
   *
   * @var string[]
   */
  protected static $modules = ['dynamic_page_cache'];

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->entityTypeManager = $this->container->get('entity_type.manager');

    // Set up fields for encryption.
    $this->setFieldStorageSettings(TRUE);

    // Create a test entity.
    $this->createTestNode();
  }

  /**
   * Test caching of encrypted fields on response level.
   */
  public function testDynamicPageCache(): void {
    // Page should be uncacheable due to max-age = 0.
    $this->drupalGet('node/' . $this->testNode->id());
    $this->assertStringStartsWith('UNCACHEABLE', $this->getSession()->getResponseHeader(DynamicPageCacheSubscriber::HEADER), 'Page with encrypted fields is uncacheable.');

    // Set encrypted field as cacheable.
    $this->drupalGet('admin/config/system/field-encrypt');
    $this->submitForm(['make_entities_uncacheable' => FALSE], 'Save configuration');

    // Page is cacheable, but currently not cached.
    $this->drupalGet('node/' . $this->testNode->id());
    $this->assertEquals('MISS', $this->getSession()->getResponseHeader(DynamicPageCacheSubscriber::HEADER), 'Dynamic Page Cache MISS.');

    // Page is cacheable, and should be cached.
    $this->drupalGet('node/' . $this->testNode->id());
    $this->assertEquals('HIT', $this->getSession()->getResponseHeader(DynamicPageCacheSubscriber::HEADER), 'Dynamic Page Cache HIT.');
  }

  /**
   * Test caching of encrypted fields on entity level.
   */
  public function testEntityCache(): void {
    // Check if entity with uncacheable fields is cached by the entity
    // storage.
    $entity_type = $this->testNode->getEntityTypeId();
    $cid = "values:$entity_type:" . $this->testNode->id();

    // Check whether node entities are marked as uncacheable.
    $definition = $this->entityTypeManager->getDefinition('node');
    $this->assertFalse($definition->isPersistentlyCacheable());
    $this->assertFalse($definition->isRenderCacheable());
    $this->assertTrue($definition->isStaticallyCacheable());

    // Check that no initial cache entry is present.
    $this->assertFalse(\Drupal::cache('entity')->get($cid), 'Entity cache: no initial cache.');

    $controller = $this->entityTypeManager->getStorage($entity_type);
    $controller->load($this->testNode->id());

    // Check if entity gets cached.
    $this->assertFalse(\Drupal::cache('entity')->get($cid), 'Entity cache: entity is not in persistent cache.');

    // Set encrypted field as cacheable.
    $this->config('field_encrypt.settings')
      ->set('make_entities_uncacheable', FALSE)
      ->save();
    // Clear memory cache so the entity will now make it to the persistent
    // cache.
    \Drupal::service('entity.memory_cache')->deleteAll();

    // Check whether node entities are marked as cacheable.
    $definition = $this->entityTypeManager->getDefinition('node');
    $this->assertTrue($definition->isPersistentlyCacheable());
    $this->assertTrue($definition->isRenderCacheable());
    $this->assertTrue($definition->isStaticallyCacheable());

    // Load the node again. It should be cached now.
    $controller = $this->entityTypeManager->getStorage($entity_type);
    $controller->load($this->testNode->id());

    /** @var false|object $cache */
    $cache = \Drupal::cache('entity')->get($cid);
    $this->assertTrue(is_object($cache), 'Entity cache: entity is in persistent cache.');
  }

  /**
   * {@inheritdoc}
   */
  protected function setFieldStorageSettings(bool $encryption = TRUE): void {
    $fields = [
      'node.field_test_single' => [
        'properties' => ['value' => 'value', 'summary' => 'summary'],
      ],
      'node.field_test_multi' => [
        'properties' => ['value' => 'value'],
      ],
    ];

    foreach ($fields as $field => $settings) {
      $field_storage = FieldStorageConfig::load($field);
      if ($encryption) {
        $field_storage->setThirdPartySetting('field_encrypt', 'encrypt', TRUE);
        $field_storage->setThirdPartySetting('field_encrypt', 'properties', $settings['properties']);
      }
      else {
        $field_storage->unsetThirdPartySetting('field_encrypt', 'encrypt');
        $field_storage->unsetThirdPartySetting('field_encrypt', 'properties');
      }
      $field_storage->save();
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc