DevelDumperTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace Drupal\Tests\devel\Functional;
  3. use Drupal\Component\Render\FormattableMarkup;
  4. use Drupal\Tests\BrowserTestBase;
  5. /**
  6. * Tests pluggable dumper feature.
  7. *
  8. * @group devel
  9. */
  10. class DevelDumperTest extends BrowserTestBase {
  11. /**
  12. * Modules to enable.
  13. *
  14. * @var array
  15. */
  16. public static $modules = ['devel', 'devel_dumper_test'];
  17. /**
  18. * {@inheritdoc}
  19. */
  20. protected function setUp() {
  21. parent::setUp();
  22. $admin_user = $this->drupalCreateUser(['administer site configuration', 'access devel information']);
  23. $this->drupalLogin($admin_user);
  24. }
  25. /**
  26. * Test dumpers configuration page.
  27. */
  28. public function testDumpersConfiguration() {
  29. $this->drupalGet('admin/config/development/devel');
  30. // Ensures that the dumper input is present on the config page.
  31. $this->assertSession()->fieldExists('dumper');
  32. // Ensures that the 'default' dumper is enabled by default.
  33. $this->assertSession()->checkboxChecked('edit-dumper-default');
  34. // Ensures that all dumpers declared by devel are present on the config page
  35. // and that only the available dumpers are selectable.
  36. $dumpers = [
  37. 'default',
  38. 'drupal_variable',
  39. 'firephp',
  40. 'chromephp',
  41. 'var_dumper',
  42. ];
  43. $available_dumpers = ['default', 'drupal_variable', 'var_dumper'];
  44. foreach ($dumpers as $dumper) {
  45. $this->assertFieldByXPath('//input[@type="radio" and @name="dumper"]', $dumper);
  46. if (in_array($dumper, $available_dumpers)) {
  47. $this->assertFieldByXPath('//input[@name="dumper" and not(@disabled="disabled")]', $dumper);
  48. }
  49. else {
  50. $this->assertFieldByXPath('//input[@name="dumper" and @disabled="disabled"]', $dumper);
  51. }
  52. }
  53. // Ensures that dumper plugins declared by other modules are present on the
  54. // config page and that only the available dumpers are selectable.
  55. $this->assertFieldByXPath('//input[@name="dumper"]', 'available_test_dumper');
  56. $this->assertSession()->pageTextContains('Available test dumper.');
  57. $this->assertSession()->pageTextContains('Drupal dumper for testing purposes (available).');
  58. $this->assertFieldByXPath('//input[@name="dumper" and not(@disabled="disabled")]', 'available_test_dumper', 'Available dumper input not is disabled.');
  59. $this->assertFieldByXPath('//input[@name="dumper"]', 'not_available_test_dumper');
  60. $this->assertSession()->pageTextContains('Not available test dumper.');
  61. $this->assertSession()->pageTextContains('Drupal dumper for testing purposes (not available).Not available. You may need to install external dependencies for use this plugin.');
  62. $this->assertFieldByXPath('//input[@name="dumper" and @disabled="disabled"]', 'not_available_test_dumper', 'Non available dumper input is disabled.');
  63. // Ensures that saving of the dumpers configuration works as expected.
  64. $edit = [
  65. 'dumper' => 'drupal_variable',
  66. ];
  67. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  68. $this->assertSession()->pageTextContains(t('The configuration options have been saved.'));
  69. $config = \Drupal::config('devel.settings')->get('devel_dumper');
  70. $this->assertEquals('drupal_variable', $config, 'The configuration options have been properly saved');
  71. // Ensure that if the chosen dumper is not available (e.g. the module that
  72. // provide it is uninstalled) the 'default' dumper appears selected in the
  73. // config page.
  74. \Drupal::service('module_installer')->install(['kint']);
  75. $this->drupalGet('admin/config/development/devel');
  76. $this->assertFieldByXPath('//input[@name="dumper"]', 'kint');
  77. $edit = [
  78. 'dumper' => 'kint',
  79. ];
  80. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  81. $this->assertSession()->pageTextContains(t('The configuration options have been saved.'));
  82. $config = \Drupal::config('devel.settings')->get('devel_dumper');
  83. $this->assertEquals('kint', $config, 'The configuration options have been properly saved');
  84. \Drupal::service('module_installer')->uninstall(['kint']);
  85. $this->drupalGet('admin/config/development/devel');
  86. $this->assertNoFieldByXPath('//input[@name="dumper"]', 'kint');
  87. $this->assertSession()->checkboxChecked('edit-dumper-default');
  88. }
  89. /**
  90. * Test variable is dumped in page.
  91. */
  92. function testDumpersOutput() {
  93. $edit = [
  94. 'dumper' => 'available_test_dumper',
  95. ];
  96. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  97. $this->assertSession()->pageTextContains(t('The configuration options have been saved.'));
  98. $this->drupalGet('devel_dumper_test/dump');
  99. $elements = $this->xpath('//body/pre[contains(text(), :message)]', [':message' => 'AvailableTestDumper::dump() Test output']);
  100. $this->assertTrue(!empty($elements), 'Dumped message is present.');
  101. $this->drupalGet('devel_dumper_test/message');
  102. $elements = $this->xpath('//div[contains(@class, "messages")]/pre[contains(text(), :message)]', [':message' => 'AvailableTestDumper::export() Test output']);
  103. $this->assertTrue(!empty($elements), 'Dumped message is present.');
  104. $this->drupalGet('devel_dumper_test/export');
  105. $elements = $this->xpath('//div[@class="layout-content"]//pre[contains(text(), :message)]', [':message' => 'AvailableTestDumper::export() Test output']);
  106. $this->assertTrue(!empty($elements), 'Dumped message is present.');
  107. $this->drupalGet('devel_dumper_test/export_renderable');
  108. $elements = $this->xpath('//div[@class="layout-content"]//pre[contains(text(), :message)]', [':message' => 'AvailableTestDumper::exportAsRenderable() Test output']);
  109. $this->assertTrue(!empty($elements), 'Dumped message is present.');
  110. // Ensures that plugins can add libraries to the page when the
  111. // ::exportAsRenderable() method is used.
  112. $this->assertSession()->responseContains('devel_dumper_test/css/devel_dumper_test.css');
  113. $this->assertSession()->responseContains('devel_dumper_test/js/devel_dumper_test.js');
  114. $debug_filename = file_directory_temp() . '/drupal_debug.txt';
  115. $this->drupalGet('devel_dumper_test/debug');
  116. $file_content = file_get_contents($debug_filename);
  117. $expected = <<<EOF
  118. <pre>AvailableTestDumper::export() Test output</pre>
  119. EOF;
  120. $this->assertEquals($file_content, $expected, 'Dumped message is present.');
  121. // Ensures that the DevelDumperManager::debug() is not access checked and
  122. // that the dump is written in the debug file even if the user has not the
  123. // 'access devel information' permission.
  124. file_put_contents($debug_filename, '');
  125. $this->drupalLogout();
  126. $this->drupalGet('devel_dumper_test/debug');
  127. $file_content = file_get_contents($debug_filename);
  128. $expected = <<<EOF
  129. <pre>AvailableTestDumper::export() Test output</pre>
  130. EOF;
  131. $this->assertEquals($file_content, $expected, 'Dumped message is present.');
  132. }
  133. }