class FormCacheTest
@coversDefaultClass \Drupal\Core\Form\FormCache
      
    
@group Form
Hierarchy
- class \Drupal\Tests\UnitTestCase uses \Drupal\Tests\Traits\PhpUnitWarnings, \Drupal\Tests\PhpUnitCompatibilityTrait, \Symfony\Bridge\PhpUnit\ExpectDeprecationTrait extends \PHPUnit\Framework\TestCase- class \Drupal\Tests\Core\Form\FormCacheTest extends \Drupal\Tests\UnitTestCase
 
Expanded class hierarchy of FormCacheTest
File
- 
              core/tests/ Drupal/ Tests/ Core/ Form/ FormCacheTest.php, line 13 
Namespace
Drupal\Tests\Core\FormView source
class FormCacheTest extends UnitTestCase {
  
  /**
   * The form cache object under test.
   *
   * @var \Drupal\Core\Form\FormCache
   */
  protected $formCache;
  
  /**
   * The expirable key value factory.
   *
   * @var \Drupal\Core\KeyValueStore\KeyValueExpirableFactoryInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $keyValueExpirableFactory;
  
  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $account;
  
  /**
   * The CSRF token generator.
   *
   * @var \Drupal\Core\Access\CsrfTokenGenerator|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $csrfToken;
  
  /**
   * The mocked module handler.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $moduleHandler;
  
  /**
   * The expirable key value store used by form cache.
   *
   * @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $formCacheStore;
  
  /**
   * The expirable key value store used by form state cache.
   *
   * @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $formStateCacheStore;
  
  /**
   * The logger channel.
   *
   * @var \Psr\Log\LoggerInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $logger;
  
  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $requestStack;
  
  /**
   * A policy rule determining the cacheability of a request.
   *
   * @var \Drupal\Core\PageCache\RequestPolicyInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $requestPolicy;
  
  /**
   * {@inheritdoc}
   */
  protected $runTestInSeparateProcess = TRUE;
  
  /**
   * {@inheritdoc}
   */
  protected $preserveGlobalState = FALSE;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->moduleHandler = $this->createMock('Drupal\\Core\\Extension\\ModuleHandlerInterface');
    $this->formCacheStore = $this->createMock('Drupal\\Core\\KeyValueStore\\KeyValueStoreExpirableInterface');
    $this->formStateCacheStore = $this->createMock('Drupal\\Core\\KeyValueStore\\KeyValueStoreExpirableInterface');
    $this->keyValueExpirableFactory = $this->createMock('Drupal\\Core\\KeyValueStore\\KeyValueExpirableFactoryInterface');
    $this->keyValueExpirableFactory
      ->expects($this->any())
      ->method('get')
      ->willReturnMap([
      [
        'form',
        $this->formCacheStore,
      ],
      [
        'form_state',
        $this->formStateCacheStore,
      ],
    ]);
    $this->csrfToken = $this->getMockBuilder('Drupal\\Core\\Access\\CsrfTokenGenerator')
      ->disableOriginalConstructor()
      ->getMock();
    $this->account = $this->createMock('Drupal\\Core\\Session\\AccountInterface');
    $this->logger = $this->createMock('Psr\\Log\\LoggerInterface');
    $this->requestStack = $this->createMock('\\Symfony\\Component\\HttpFoundation\\RequestStack');
    $this->requestPolicy = $this->createMock('\\Drupal\\Core\\PageCache\\RequestPolicyInterface');
    $this->formCache = new FormCache($this->root, $this->keyValueExpirableFactory, $this->moduleHandler, $this->account, $this->csrfToken, $this->logger, $this->requestStack, $this->requestPolicy);
  }
  
  /**
   * @covers ::getCache
   */
  public function testGetCacheValidToken() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cache_token = 'the_cache_token';
    $cached_form = [
      '#cache_token' => $cache_token,
    ];
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->csrfToken
      ->expects($this->once())
      ->method('validate')
      ->with($cache_token)
      ->willReturn(TRUE);
    $this->account
      ->expects($this->never())
      ->method('isAnonymous');
    $form = $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertSame($cached_form, $form);
  }
  
  /**
   * @covers ::getCache
   */
  public function testGetCacheInvalidToken() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cache_token = 'the_cache_token';
    $cached_form = [
      '#cache_token' => $cache_token,
    ];
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->csrfToken
      ->expects($this->once())
      ->method('validate')
      ->with($cache_token)
      ->willReturn(FALSE);
    $this->account
      ->expects($this->never())
      ->method('isAnonymous');
    $form = $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertNull($form);
  }
  
  /**
   * @covers ::getCache
   */
  public function testGetCacheAnonUser() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cached_form = [
      '#cache_token' => NULL,
    ];
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->account
      ->expects($this->once())
      ->method('isAnonymous')
      ->willReturn(TRUE);
    $this->csrfToken
      ->expects($this->never())
      ->method('validate');
    $form = $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertSame($cached_form, $form);
  }
  
  /**
   * @covers ::getCache
   */
  public function testGetCacheAuthUser() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cached_form = [
      '#cache_token' => NULL,
    ];
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->account
      ->expects($this->once())
      ->method('isAnonymous')
      ->willReturn(FALSE);
    $form = $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertNull($form);
  }
  
  /**
   * @covers ::getCache
   */
  public function testGetCacheNoForm() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cached_form = NULL;
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->account
      ->expects($this->never())
      ->method('isAnonymous');
    $form = $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertNull($form);
  }
  
  /**
   * @covers ::getCache
   */
  public function testGetCacheImmutableForm() {
    $form_build_id = 'the_form_build_id';
    $form_state = (new FormState())->addBuildInfo('immutable', TRUE);
    $cached_form = [
      '#build_id' => 'the_old_build_form_id',
    ];
    $this->account
      ->expects($this->once())
      ->method('isAnonymous')
      ->willReturn(TRUE);
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $form = $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertSame($cached_form['#build_id'], $form['#build_id_old']);
    $this->assertNotSame($cached_form['#build_id'], $form['#build_id']);
    $this->assertSame($form['#build_id'], $form['form_build_id']['#value']);
    $this->assertSame($form['#build_id'], $form['form_build_id']['#id']);
  }
  
  /**
   * @covers ::loadCachedFormState
   */
  public function testLoadCachedFormState() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cached_form = [
      '#cache_token' => NULL,
    ];
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->account
      ->expects($this->once())
      ->method('isAnonymous')
      ->willReturn(TRUE);
    $cached_form_state = [
      'storage' => [
        'foo' => 'bar',
      ],
    ];
    $this->formStateCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form_state);
    $this->formCache
      ->getCache($form_build_id, $form_state);
    $this->assertSame($cached_form_state['storage'], $form_state->getStorage());
  }
  
  /**
   * @covers ::loadCachedFormState
   */
  public function testLoadCachedFormStateWithFiles() {
    $form_build_id = 'the_form_build_id';
    $form_state = new FormState();
    $cached_form = [
      '#cache_token' => NULL,
    ];
    $this->formCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form);
    $this->account
      ->expects($this->once())
      ->method('isAnonymous')
      ->willReturn(TRUE);
    $cached_form_state = [
      'build_info' => [
        'files' => [
          [
            'module' => 'a_module',
            'type' => 'the_type',
            'name' => 'some_name',
          ],
          [
            'module' => 'another_module',
          ],
        ],
      ],
    ];
    $this->moduleHandler
      ->expects($this->exactly(2))
      ->method('loadInclude')
      ->withConsecutive([
      'a_module',
      'the_type',
      'some_name',
    ], [
      'another_module',
      'inc',
      'another_module',
    ]);
    $this->formStateCacheStore
      ->expects($this->once())
      ->method('get')
      ->with($form_build_id)
      ->willReturn($cached_form_state);
    $this->formCache
      ->getCache($form_build_id, $form_state);
  }
  
  /**
   * @covers ::setCache
   */
  public function testSetCacheWithForm() {
    $form_build_id = 'the_form_build_id';
    $form = [
      '#form_id' => 'the_form_id',
    ];
    $form_state = new FormState();
    $this->formCacheStore
      ->expects($this->once())
      ->method('setWithExpire')
      ->with($form_build_id, $form, $this->isType('int'));
    $form_state_data = $form_state->getCacheableArray();
    $this->formStateCacheStore
      ->expects($this->once())
      ->method('setWithExpire')
      ->with($form_build_id, $form_state_data, $this->isType('int'));
    $this->formCache
      ->setCache($form_build_id, $form, $form_state);
  }
  
  /**
   * @covers ::setCache
   */
  public function testSetCacheWithoutForm() {
    $form_build_id = 'the_form_build_id';
    $form = NULL;
    $form_state = new FormState();
    $this->formCacheStore
      ->expects($this->never())
      ->method('setWithExpire');
    $form_state_data = $form_state->getCacheableArray();
    $this->formStateCacheStore
      ->expects($this->once())
      ->method('setWithExpire')
      ->with($form_build_id, $form_state_data, $this->isType('int'));
    $this->formCache
      ->setCache($form_build_id, $form, $form_state);
  }
  
  /**
   * @covers ::setCache
   */
  public function testSetCacheAuthUser() {
    $form_build_id = 'the_form_build_id';
    $form = [];
    $form_state = new FormState();
    $cache_token = 'the_cache_token';
    $form_data = $form;
    $form_data['#cache_token'] = $cache_token;
    $this->formCacheStore
      ->expects($this->once())
      ->method('setWithExpire')
      ->with($form_build_id, $form_data, $this->isType('int'));
    $form_state_data = $form_state->getCacheableArray();
    $this->formStateCacheStore
      ->expects($this->once())
      ->method('setWithExpire')
      ->with($form_build_id, $form_state_data, $this->isType('int'));
    $this->csrfToken
      ->expects($this->once())
      ->method('get')
      ->willReturn($cache_token);
    $this->account
      ->expects($this->once())
      ->method('isAuthenticated')
      ->willReturn(TRUE);
    $this->formCache
      ->setCache($form_build_id, $form, $form_state);
  }
  
  /**
   * @covers ::setCache
   */
  public function testSetCacheBuildIdMismatch() {
    $form_build_id = 'the_form_build_id';
    $form = [
      '#form_id' => 'the_form_id',
      '#build_id' => 'stale_form_build_id',
    ];
    $form_state = new FormState();
    $this->formCacheStore
      ->expects($this->never())
      ->method('setWithExpire');
    $this->formStateCacheStore
      ->expects($this->never())
      ->method('setWithExpire');
    $this->logger
      ->expects($this->once())
      ->method('error')
      ->with('Form build-id mismatch detected while attempting to store a form in the cache.');
    $this->formCache
      ->setCache($form_build_id, $form, $form_state);
  }
  
  /**
   * @covers ::deleteCache
   */
  public function testDeleteCache() {
    $form_build_id = 'the_form_build_id';
    $this->formCacheStore
      ->expects($this->once())
      ->method('delete')
      ->with($form_build_id);
    $this->formStateCacheStore
      ->expects($this->once())
      ->method('delete')
      ->with($form_build_id);
    $this->formCache
      ->deleteCache($form_build_id);
  }
}Members
| Title Sort descending | Deprecated | Modifiers | Object type | Summary | Overriden Title | Overrides | 
|---|---|---|---|---|---|---|
| FormCacheTest::$account | protected | property | The current user. | |||
| FormCacheTest::$csrfToken | protected | property | The CSRF token generator. | |||
| FormCacheTest::$formCache | protected | property | The form cache object under test. | |||
| FormCacheTest::$formCacheStore | protected | property | The expirable key value store used by form cache. | |||
| FormCacheTest::$formStateCacheStore | protected | property | The expirable key value store used by form state cache. | |||
| FormCacheTest::$keyValueExpirableFactory | protected | property | The expirable key value factory. | |||
| FormCacheTest::$logger | protected | property | The logger channel. | |||
| FormCacheTest::$moduleHandler | protected | property | The mocked module handler. | |||
| FormCacheTest::$preserveGlobalState | protected | property | ||||
| FormCacheTest::$requestPolicy | protected | property | A policy rule determining the cacheability of a request. | |||
| FormCacheTest::$requestStack | protected | property | The request stack. | |||
| FormCacheTest::$runTestInSeparateProcess | protected | property | ||||
| FormCacheTest::setUp | protected | function | Overrides UnitTestCase::setUp | |||
| FormCacheTest::testDeleteCache | public | function | @covers ::deleteCache[[api-linebreak]] | |||
| FormCacheTest::testGetCacheAnonUser | public | function | @covers ::getCache[[api-linebreak]] | |||
| FormCacheTest::testGetCacheAuthUser | public | function | @covers ::getCache[[api-linebreak]] | |||
| FormCacheTest::testGetCacheImmutableForm | public | function | @covers ::getCache[[api-linebreak]] | |||
| FormCacheTest::testGetCacheInvalidToken | public | function | @covers ::getCache[[api-linebreak]] | |||
| FormCacheTest::testGetCacheNoForm | public | function | @covers ::getCache[[api-linebreak]] | |||
| FormCacheTest::testGetCacheValidToken | public | function | @covers ::getCache[[api-linebreak]] | |||
| FormCacheTest::testLoadCachedFormState | public | function | @covers ::loadCachedFormState[[api-linebreak]] | |||
| FormCacheTest::testLoadCachedFormStateWithFiles | public | function | @covers ::loadCachedFormState[[api-linebreak]] | |||
| FormCacheTest::testSetCacheAuthUser | public | function | @covers ::setCache[[api-linebreak]] | |||
| FormCacheTest::testSetCacheBuildIdMismatch | public | function | @covers ::setCache[[api-linebreak]] | |||
| FormCacheTest::testSetCacheWithForm | public | function | @covers ::setCache[[api-linebreak]] | |||
| FormCacheTest::testSetCacheWithoutForm | public | function | @covers ::setCache[[api-linebreak]] | |||
| PhpUnitWarnings::$deprecationWarnings | private static | property | Deprecation warnings from PHPUnit to raise with @trigger_error(). | |||
| PhpUnitWarnings::addWarning | public | function | Converts PHPUnit deprecation warnings to E_USER_DEPRECATED. | |||
| UnitTestCase::$randomGenerator | protected | property | The random generator. | |||
| UnitTestCase::$root | protected | property | The app root. | 1 | ||
| UnitTestCase::assertArrayEquals | Deprecated | protected | function | Asserts if two arrays are equal by sorting them first. | ||
| UnitTestCase::getClassResolverStub | protected | function | Returns a stub class resolver. | |||
| UnitTestCase::getConfigFactoryStub | public | function | Returns a stub config factory that behaves according to the passed array. | |||
| UnitTestCase::getConfigStorageStub | public | function | Returns a stub config storage that returns the supplied configuration. | |||
| UnitTestCase::getContainerWithCacheTagsInvalidator | protected | function | Sets up a container with a cache tags invalidator. | |||
| UnitTestCase::getRandomGenerator | protected | function | Gets the random generator for the utility methods. | |||
| UnitTestCase::getStringTranslationStub | public | function | Returns a stub translation manager that just returns the passed string. | |||
| UnitTestCase::randomMachineName | public | function | Generates a unique random string containing letters and numbers. | |||
| UnitTestCase::setUpBeforeClass | public static | function | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.
