PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php

https://gitlab.com/reasonat/test8
PHP | 126 lines | 59 code | 18 blank | 49 comment | 0 complexity | b21ddf36955b8c66f7c3e02f6bf3c240 MD5 | raw file
  1. <?php
  2. namespace Drupal\dynamic_page_cache\Tests;
  3. use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
  4. use Drupal\Core\Url;
  5. use Drupal\dynamic_page_cache\EventSubscriber\DynamicPageCacheSubscriber;
  6. use Drupal\simpletest\WebTestBase;
  7. /**
  8. * Enables the Dynamic Page Cache and tests it in various scenarios.
  9. *
  10. * This does not test the self-healing of the redirect with conditional cache
  11. * contexts, because Dynamic Page Cache just reuses
  12. * \Drupal\Core\Render\RenderCache so that it doesn't have to implement and test
  13. * all of that again. It is tested in
  14. * RendererBubblingTest::testConditionalCacheContextBubblingSelfHealing().
  15. *
  16. * @group dynamic_page_cache
  17. *
  18. * @see \Drupal\dynamic_page_cache\EventSubscriber\DynamicPageCacheSubscriber
  19. */
  20. class DynamicPageCacheIntegrationTest extends WebTestBase {
  21. /**
  22. * {@inheritdoc}
  23. */
  24. protected $dumpHeaders = TRUE;
  25. /**
  26. * {@inheritdoc}
  27. */
  28. protected static $modules = ['dynamic_page_cache_test'];
  29. /**
  30. * {@inheritdoc}
  31. */
  32. protected function setUp() {
  33. parent::setUp();
  34. // Uninstall the page_cache module; we want to test the Dynamic Page Cache
  35. // alone.
  36. \Drupal::service('module_installer')->uninstall(['page_cache']);
  37. }
  38. /**
  39. * Tests that Dynamic Page Cache works correctly, and verifies the edge cases.
  40. */
  41. public function testDynamicPageCache() {
  42. // Controllers returning plain response objects are ignored by Dynamic Page
  43. // Cache.
  44. $url = Url::fromUri('route:dynamic_page_cache_test.response');
  45. $this->drupalGet($url);
  46. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Response object returned: Dynamic Page Cache is ignoring.');
  47. // Controllers returning CacheableResponseInterface (cacheable response)
  48. // objects are handled by Dynamic Page Cache.
  49. $url = Url::fromUri('route:dynamic_page_cache_test.cacheable_response');
  50. $this->drupalGet($url);
  51. $this->assertEqual('MISS', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Cacheable response object returned: Dynamic Page Cache is active, Dynamic Page Cache MISS.');
  52. $this->drupalGet($url);
  53. $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Cacheable response object returned: Dynamic Page Cache is active, Dynamic Page Cache HIT.');
  54. // Controllers returning render arrays, rendered as HTML responses, are
  55. // handled by Dynamic Page Cache.
  56. $url = Url::fromUri('route:dynamic_page_cache_test.html');
  57. $this->drupalGet($url);
  58. $this->assertEqual('MISS', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response: Dynamic Page Cache is active, Dynamic Page Cache MISS.');
  59. $this->drupalGet($url);
  60. $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response: Dynamic Page Cache is active, Dynamic Page Cache HIT.');
  61. // The above is the simple case, where the render array returned by the
  62. // response contains no cache contexts. So let's now test a route/controller
  63. // that *does* vary by a cache context whose value we can easily control: it
  64. // varies by the 'animal' query argument.
  65. foreach (['llama', 'piggy', 'unicorn', 'kitten'] as $animal) {
  66. $url = Url::fromUri('route:dynamic_page_cache_test.html.with_cache_contexts', ['query' => ['animal' => $animal]]);
  67. $this->drupalGet($url);
  68. $this->assertRaw($animal);
  69. $this->assertEqual('MISS', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response: Dynamic Page Cache is active, Dynamic Page Cache MISS.');
  70. $this->drupalGet($url);
  71. $this->assertRaw($animal);
  72. $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response: Dynamic Page Cache is active, Dynamic Page Cache HIT.');
  73. // Finally, let's also verify that the 'dynamic_page_cache_test.html'
  74. // route continued to see cache hits if we specify a query argument,
  75. // because it *should* ignore it and continue to provide Dynamic Page
  76. // Cache hits.
  77. $url = Url::fromUri('route:dynamic_page_cache_test.html', ['query' => ['animal' => 'piglet']]);
  78. $this->drupalGet($url);
  79. $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response: Dynamic Page Cache is active, Dynamic Page Cache HIT.');
  80. }
  81. // Controllers returning render arrays, rendered as anything except a HTML
  82. // response, are ignored by Dynamic Page Cache (but only because those
  83. // wrapper formats' responses do not implement CacheableResponseInterface).
  84. $this->drupalGet('dynamic-page-cache-test/html', array('query' => array(MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax')));
  85. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as AJAX response: Dynamic Page Cache is ignoring.');
  86. $this->drupalGet('dynamic-page-cache-test/html', array('query' => array(MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_dialog')));
  87. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as dialog response: Dynamic Page Cache is ignoring.');
  88. $this->drupalGet('dynamic-page-cache-test/html', array('query' => array(MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_modal')));
  89. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as modal response: Dynamic Page Cache is ignoring.');
  90. // Admin routes are ignored by Dynamic Page Cache.
  91. $this->drupalGet('dynamic-page-cache-test/html/admin');
  92. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Response returned, rendered as HTML response, admin route: Dynamic Page Cache is ignoring');
  93. $this->drupalGet('dynamic-page-cache-test/response/admin');
  94. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Response returned, plain response, admin route: Dynamic Page Cache is ignoring');
  95. $this->drupalGet('dynamic-page-cache-test/cacheable-response/admin');
  96. $this->assertFalse($this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Response returned, cacheable response, admin route: Dynamic Page Cache is ignoring');
  97. // Max-age = 0 responses are ignored by Dynamic Page Cache.
  98. $this->drupalGet('dynamic-page-cache-test/html/uncacheable/max-age');
  99. $this->assertEqual('UNCACHEABLE', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response, but uncacheable: Dynamic Page Cache is running, but not caching.');
  100. // 'user' cache context responses are ignored by Dynamic Page Cache.
  101. $this->drupalGet('dynamic-page-cache-test/html/uncacheable/contexts');
  102. $this->assertEqual('UNCACHEABLE', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Render array returned, rendered as HTML response, but uncacheable: Dynamic Page Cache is running, but not caching.');
  103. // 'current-temperature' cache tag responses are ignored by Dynamic Page
  104. // Cache.
  105. $this->drupalGet('dynamic-page-cache-test/html/uncacheable/tags');
  106. $this->assertEqual('MISS', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'By default, Drupal has no auto-placeholdering cache tags.');
  107. }
  108. }