FormHelperTest.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace Drupal\Tests\Core\Form;
  3. use Drupal\Component\Serialization\Json;
  4. use Drupal\Core\Form\FormHelper;
  5. use Drupal\Tests\UnitTestCase;
  6. /**
  7. * @coversDefaultClass \Drupal\Core\Form\FormHelper
  8. * @group Form
  9. */
  10. class FormHelperTest extends UnitTestCase {
  11. /**
  12. * Tests rewriting the #states selectors.
  13. *
  14. * @covers ::rewriteStatesSelector
  15. */
  16. public function testRewriteStatesSelector() {
  17. // Simple selectors.
  18. $value = ['value' => 'medium'];
  19. $form['foo']['#states'] = [
  20. 'visible' => [
  21. 'select[name="fields[foo-id][settings_edit_form][settings][image_style]"]' => $value,
  22. ],
  23. ];
  24. FormHelper::rewriteStatesSelector($form, 'fields[foo-id][settings_edit_form]', 'options');
  25. $expected_selector = 'select[name="options[settings][image_style]"]';
  26. $this->assertSame($form['foo']['#states']['visible'][$expected_selector], $value, 'The #states selector was not properly rewritten.');
  27. // Complex selectors.
  28. $form = [];
  29. $form['bar']['#states'] = [
  30. 'visible' => [
  31. [
  32. ':input[name="menu[type]"]' => ['value' => 'normal'],
  33. ],
  34. [
  35. ':input[name="menu[type]"]' => ['value' => 'tab'],
  36. ],
  37. ':input[name="menu[type]"]' => ['value' => 'default tab'],
  38. ],
  39. // Example from https://www.drupal.org/node/1464758
  40. 'disabled' => [
  41. '[name="menu[options][dependee_1]"]' => ['value' => 'ON'],
  42. [
  43. ['[name="menu[options][dependee_2]"]' => ['value' => 'ON']],
  44. ['[name="menu[options][dependee_3]"]' => ['value' => 'ON']],
  45. ],
  46. [
  47. ['[name="menu[options][dependee_4]"]' => ['value' => 'ON']],
  48. 'xor',
  49. ['[name="menu[options][dependee_5]"]' => ['value' => 'ON']],
  50. ],
  51. ],
  52. ];
  53. $expected['bar']['#states'] = [
  54. 'visible' => [
  55. [
  56. ':input[name="options[type]"]' => ['value' => 'normal'],
  57. ],
  58. [
  59. ':input[name="options[type]"]' => ['value' => 'tab'],
  60. ],
  61. ':input[name="options[type]"]' => ['value' => 'default tab'],
  62. ],
  63. 'disabled' => [
  64. '[name="options[options][dependee_1]"]' => ['value' => 'ON'],
  65. [
  66. ['[name="options[options][dependee_2]"]' => ['value' => 'ON']],
  67. ['[name="options[options][dependee_3]"]' => ['value' => 'ON']],
  68. ],
  69. [
  70. ['[name="options[options][dependee_4]"]' => ['value' => 'ON']],
  71. 'xor',
  72. ['[name="options[options][dependee_5]"]' => ['value' => 'ON']],
  73. ],
  74. ],
  75. ];
  76. FormHelper::rewriteStatesSelector($form, 'menu', 'options');
  77. $this->assertSame($expected, $form, 'The #states selectors were properly rewritten.');
  78. }
  79. /**
  80. * @covers ::processStates
  81. * @dataProvider providerElements
  82. */
  83. public function testProcessStates($elements, $key) {
  84. $json = Json::encode($elements['#states']);
  85. FormHelper::processStates($elements);
  86. $this->assertEquals(['core/drupal.states'], $elements['#attached']['library']);
  87. $this->assertEquals($json, $elements[$key]['data-drupal-states']);
  88. }
  89. /**
  90. * Provides a list of elements to test.
  91. */
  92. public function providerElements() {
  93. return [
  94. [
  95. [
  96. '#type' => 'date',
  97. '#states' => [
  98. 'visible' => [
  99. ':input[name="toggle_me"]' => ['checked' => TRUE],
  100. ],
  101. ],
  102. ],
  103. '#attributes',
  104. ],
  105. [
  106. [
  107. '#type' => 'item',
  108. '#states' => [
  109. 'visible' => [
  110. ':input[name="foo"]' => ['value' => 'bar'],
  111. ],
  112. ],
  113. ],
  114. '#wrapper_attributes',
  115. ],
  116. ];
  117. }
  118. }