9568470573bcea8ca88877dd1bcfb693eede14e8
[yaffs-website] / web / core / modules / system / tests / src / Kernel / Common / FormElementsRenderTest.php
1 <?php
2
3 namespace Drupal\Tests\system\Kernel\Common;
4
5 use Drupal\Core\Url;
6 use Drupal\KernelTests\KernelTestBase;
7
8 /**
9  * Performs integration tests on drupal_render().
10  *
11  * @group system
12  */
13 class FormElementsRenderTest extends KernelTestBase {
14
15   /**
16    * {@inheritdoc}
17    */
18   protected static $modules = ['common_test', 'system'];
19
20   /**
21    * Tests rendering form elements without passing through
22    * \Drupal::formBuilder()->doBuildForm().
23    */
24   public function testDrupalRenderFormElements() {
25     // Define a series of form elements.
26     $element = [
27       '#type' => 'button',
28       '#value' => $this->randomMachineName(),
29     ];
30     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'submit']);
31
32     $element = [
33       '#type' => 'textfield',
34       '#title' => $this->randomMachineName(),
35       '#value' => $this->randomMachineName(),
36     ];
37     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'text']);
38
39     $element = [
40       '#type' => 'password',
41       '#title' => $this->randomMachineName(),
42     ];
43     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'password']);
44
45     $element = [
46       '#type' => 'textarea',
47       '#title' => $this->randomMachineName(),
48       '#value' => $this->randomMachineName(),
49     ];
50     $this->assertRenderedElement($element, '//textarea');
51
52     $element = [
53       '#type' => 'radio',
54       '#title' => $this->randomMachineName(),
55       '#value' => FALSE,
56     ];
57     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'radio']);
58
59     $element = [
60       '#type' => 'checkbox',
61       '#title' => $this->randomMachineName(),
62     ];
63     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'checkbox']);
64
65     $element = [
66       '#type' => 'select',
67       '#title' => $this->randomMachineName(),
68       '#options' => [
69         0 => $this->randomMachineName(),
70         1 => $this->randomMachineName(),
71       ],
72     ];
73     $this->assertRenderedElement($element, '//select');
74
75     $element = [
76       '#type' => 'file',
77       '#title' => $this->randomMachineName(),
78     ];
79     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'file']);
80
81     $element = [
82       '#type' => 'item',
83       '#title' => $this->randomMachineName(),
84       '#markup' => $this->randomMachineName(),
85     ];
86     $this->assertRenderedElement($element, '//div[contains(@class, :class) and contains(., :markup)]/label[contains(., :label)]', [
87       ':class' => 'js-form-type-item',
88       ':markup' => $element['#markup'],
89       ':label' => $element['#title'],
90     ]);
91
92     $element = [
93       '#type' => 'hidden',
94       '#title' => $this->randomMachineName(),
95       '#value' => $this->randomMachineName(),
96     ];
97     $this->assertRenderedElement($element, '//input[@type=:type]', [':type' => 'hidden']);
98
99     $element = [
100       '#type' => 'link',
101       '#title' => $this->randomMachineName(),
102       '#url' => Url::fromRoute('common_test.destination'),
103       '#options' => [
104         'absolute' => TRUE,
105       ],
106     ];
107     $this->assertRenderedElement($element, '//a[@href=:href and contains(., :title)]', [
108       ':href' => URL::fromRoute('common_test.destination')->setAbsolute()->toString(),
109       ':title' => $element['#title'],
110     ]);
111
112     $element = [
113       '#type' => 'details',
114       '#open' => TRUE,
115       '#title' => $this->randomMachineName(),
116     ];
117     $this->assertRenderedElement($element, '//details/summary[contains(., :title)]', [
118       ':title' => $element['#title'],
119     ]);
120
121     $element = [
122       '#type' => 'details',
123       '#open' => TRUE,
124       '#title' => $this->randomMachineName(),
125     ];
126     $this->assertRenderedElement($element, '//details');
127
128     $element['item'] = [
129       '#type' => 'item',
130       '#title' => $this->randomMachineName(),
131       '#markup' => $this->randomMachineName(),
132     ];
133     $this->assertRenderedElement($element, '//details/div[contains(@class, :class) and contains(., :markup)]', [
134       ':class' => 'js-form-type-item',
135       ':markup' => $element['item']['#markup'],
136     ]);
137   }
138
139   /**
140    * Tests that elements are rendered properly.
141    */
142   protected function assertRenderedElement(array $element, $xpath, array $xpath_args = []) {
143     $this->render($element);
144
145     // @see \Drupal\simpletest\WebTestBase::xpath()
146     $xpath = $this->buildXPathQuery($xpath, $xpath_args);
147     $element += ['#value' => NULL];
148     $this->assertFieldByXPath($xpath, $element['#value'], format_string('#type @type was properly rendered.', [
149       '@type' => var_export($element['#type'], TRUE),
150     ]));
151   }
152
153 }